Js 数据类型

2018.9.29 星期六 14:43

基础

javascript是一种运行于Javascript解释器/引擎中的解释型脚本语言
编译型语言:运行之前会编译检查,如果有错误,则不能运行。
解释型语言:运行之前不会检查语法结构,边执行边检查,出了错误就停止执行。

弱类型语言: 由数据 决定 数据类型

Javascript的组成:1、核心 (ECMAScript),2、文档对象模型(DOM,Document Object Model),3、浏览器对象模型(BOM,Browser Object Model)

数据类型:保存在程序中的数据的类型
作用:规范了数据在内存中到底占多大的空间。
数据类型分类:原始类型(基本类型),引用类型

数据类型比较

ECMAScript 不支持任何创建自定义类型的机制,而所有值最终都将是上述 7 种数据类型之一。

基本类型的变量是存放在栈内存(Stack)里的。
栈内存中包括了变量的标识符和变量的值

引用类型的值是保存在堆内存(Heap)中的对象(Object) 与其他编程语言不同,JavaScript 不能直接操作对象的内存空间(堆内存)。
栈内存中保存了变量标识符和指向堆内存中该对象的指针
堆内存中保存了对象的内容

检测变量类型 typeof, toString, instanceof

$BLOB: [js内存管理]
两中类型的特点:
(1)基本类型在内存中占据固定大小的空间,因此被保存在栈内存中。
(2)从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本

(3)引用类型的值是对像,保存在堆内存中,引用类型的值是引用访问的
(4)包含引用类型的值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
(5)从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。

(6)用typeof操作符来确定是哪种基本类型,typeof是一个操作符,而不是一个函数,因此typeof后面的圆括号可有可无,用instanceof操作符来确定是哪种引用类型。

栈的优势就是存取速度比堆要快,仅次于直接位于CPU中的寄存器,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据,但是缺点是由于在运行时动态分配内存,所以存取速度较慢。

而对于js简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。

对象分类

### 1 本地对象(native object)
ECMA-262把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
Object, Function, Boolean, Symbol,

### 2 内置对象(built-in object)
“ 由ECMAScript实现提供的,独立与宿主环境的所有对象,在ECMAScript程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已经被实例化了。ECMA只定义了两个内置对象,即Global和Math(它们也是本地对象,根据定义,所有内置对象都是本地对象)。
在 JavaScript 中,所有的本地对象、全局属性、全局函数都是 Global 对象的属性。ECMAScript 虽然没有指出如何直接访问 Global 对象,但 Web 浏览器都是将这个全局对象作为 window 对象的一部分加以实现的。
Global,Math

### 3 宿主对象(host object)
所有非本地对象都是宿主对象,即由ECMAScript实现的宿主环境提供的对象。
所有的 BOM 和 DOM 对象都是宿主对象。JavaScript 中常用的宿主对象主要包括以下:

$PS: 插入

参考自W3School:JavaScript对象主要有三类。
一:JavaScript核心对象是ECMAScript标准定义好的一些对象与函数,在JavaScript语言中可以直接使用。
8: Array Boolean Date Math Number String RegExp Global
二:浏览器对象 BOM
5+:Window, Navigator, Screen, History, Location
三:HTML DOM 对象
Document Anchor Area Base Body Button Canvas Event Form Frame Frameset IFrame Image
Input- Button ,Checkbox ,File ,Hidden ,Password ,Radio ,Reset ,Submit ,
Text Link Meta Object Option SelectStyle Table TableCell TableRow Textarea

### 4 用户自定义对象(user-defined object)
开发者通过 Js 代码创建的自己的对象。

数据类型

JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据:

JavaScript语言可以识别下面 7 种不同类型的值:
六种 原型 数据类型:
Boolean. 布尔值,true 和 false.
null. 一个表明 null 值的特殊关键字。 JavaScript 是大小写敏感的,因此 null 与 Null、NULL或其他变量完全不同。
undefined. 变量未定义时的属性。
Number. 表示数字,例如: 42 或者 3.14159。
String. 表示字符串,例如:”Howdy”
Symbol ( 在 ECMAScript 6 中新添加的类型).。一种数据类型,它的实例是唯一且不可改变的。
并且也可以用来作为Object的key的值(如下). 在某些语言当中也有类似的原子类型(Atoms). 你也可以认为为它们是C里面的枚举类型.

以及 Object 对象

Object 对象

ECMAScript定义的对象中有两种属性:数据属性和访问器属性。

数据属性:数据属性是键值对,并且每个数据属性拥有下列特性:(数据属性的特性(Attributes of a data property))
[[Value]] (任何Javascript类型),[[Writable]],[[Enumerable]],[[Configurable]]

访问器属性:访问器属性有一个或两个访问器函数 (get 和 set) 来存取数值,并且有以下特性:
[[Get]] (函数对象或者 undefined),[[Set]] (函数对象或者 undefined),[[Enumerable]],[[Configurable]]

注意:这些特性只有 JavaScript 引擎才用到,因此你不能直接访问它们。所以特性被放在两对方括号中,而不是一对。

“标准的” 对象, 和函数 : var obj={name:’zhangsan’},function fun(){}
日期: Date
有序集: 数组和类型数组 Array,Int8Array,Uint8Array
键控集: Maps, Sets, WeakMaps, WeakSets
结构化数据: JSON
标准库中更多的对象

使用 typeof 操作符判断对象类型

标准内置对象(全局的对象)

全局的对象( global objects )或称标准内置对象,不要和 “全局对象(global object)” 混淆。这里说的全局的对象是说在全局作用域里的对象。

“全局对象 (global object)” 是一个Global类的对象。可以在全局作用域里,用this访问(但只有在非严格模式下才可以,在严格模式下得到的是 undefined)。实际上,全局作用域包含了全局对象的属性,还有它可能继承来的属性。

全局作用域中的其他对象可以由用户的脚本创建或由宿主程序提供。浏览器作为最常见的宿主程序,其所提供的宿主对象的说明可以在这里找到:API 参考。

标准内置对象的分类
### 1 值属性:这些 全局属性返回一个简单值,这些值没有自己的属性和方法。
Infinity,NaN,undefined,null 字面量,

### 2 函数属性:全局函数可以直接调用,不需要在调用时指定所属对象,执行结束后会将结果直接返回给调用者。

全局函数与内置对象的属性或方法不是一个概念。全局函数它不属于任何一个内置对象。JavaScript 中包含以下14个全局函数,用于完成一些常用的功能:escape( )、eval( )、isFinite( )、isNaN( )、parseFloat( )、parseInt( )、unescape( )、decodeURI()、decodeURIComponent()、encodeURI()、encodeURIComponent()、getClass()、Number()、String()。
特别注意:setTimeout只是window对象的一个方法而已,setTimeout(code,millisec),其中code必需,要调用的函数后要执行的 JavaScript 代码串;millisec必需,在执行代码前需等待的毫秒数。

$PS: isNaN() 函数.下一个版本的ECMAScript (ES2015)包含Number.isNaN()函数。是原始的全局isNaN()的更强大的版本。

### 3 基本对象:是定义或使用其他对象的基础。基本对象包括一般对象、函数对象和错误对象。
Object, Function, Boolean, Symbol, Error, EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError

### 4 数字和日期对象:用来表示数字、日期和执行数学计算的对象。
Number, Math, Date

### 5 字符串:用来表示和操作字符串的对象。
String, RegExp

### 6 可索引的集合对象:这些对象表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。
Array, Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array

### 7 使用键的集合对象:这些集合对象在存储数据时会使用到键,支持按照插入顺序来迭代元素。
Map, Set, WeakMap, WeakSet

### 8 矢量集合:SIMD 矢量集合中的数据会被组织为一个数据序列。

### 9 反射:
Reflect,Proxy

### 10 国际化:为了支持多语言处理而加入ECMAScript的对象。
Intl, Intl.Collator, Intl.DateTimeFormat, Intl.NumberFormat,

### 11 WebAssembly

### 12 其他:arguments

17:03

knowledge is no pay,reward is kindness
0%