最新的ECMAScript标准定义了 7 种数据类型
原始类型: 所谓原始值就是经过某些操作转换后(比如str.toUpperCase),原始值依然不会变,除非重新给其赋值。而Object,是引用类型,在某些操作(比如splice),会直接更改Object的值。
- 6种原始类型
- Boolean
- Null
- Undefined
- String
- Number
- Symbol
- Object
var obj = {
"a1": 1,
"a2": "happy",
"a3": true,
"a4": null,
"a5": undefined,
"a6": Symbol("m")
};
for(var o in obj) {
console.log(typeof obj[o]);
}
// number
// string
// boolean
// object
// undefined
// symbol
Number
IEEE 美国电气电子工程协会 根据ECMAScript标准,JavaScript只有一种数据类型: 基于IEEE 754标准的双精度64位二进制格式的值(-(263 -1) 到 263 -1), 它并没有为整数给出一种特定的类型;
- +Infinity 正无穷
5/+0 === +Infinity; - -Infinity 负无穷
5/-0 === -Infinity; - NaN 非数字 , 只能通过 isNaN() 判断, NaN与谁都不相等(包括自己);
- 双精度64位
- 安全整数范围 [-(2^53 - 1) , 2^53-1], 超出这个范围JavaScript的数字的精度就会损失。检验是否是安全整数范围的函数
Math.isSafeInteger()和Number.MAX_SAFE_INTEGER - www.boatsky.com/blog/26 这篇文章很详细讲了IEEE 754双精度,可是我看的不是很懂;
- 安全整数范围 [-(2^53 - 1) , 2^53-1], 超出这个范围JavaScript的数字的精度就会损失。检验是否是安全整数范围的函数
- 单精度32位
- 数组可识别的length索引的区间 [0, 2^32 -1]
Boolean
只有两个值: true / false。
String
使用单引号或者双引号。
Null
null是一个Object的类型。
Undefined
在全局作用域或者函数作用域中, 使用var变量声明的,未初始化值的类型。
Symbol
-
Symbol 是字符串类型的数据类型;
var s1 = Symbol("flower"); var s2 = Symbol({a: 2, b:3}); s1.description; // "flower" s2.description; // "[object Object]" -
每一个 Symbol 值都是不相等的, 这意味着 Symbol 可作为标识符。
var s1 = Symbol(); var s2 = Symbol(); s1 === s2; // false -
Symbol.prototype.description
Symbol中的description表示Symbol变量真正的值
var s1 = Symbol("flower"); s1.description; // "flower" -
Symbol 类型还可以用于定义一组常量,保证这组常量的值都是不相等的。
const COLOR_RED = Symbol(); const COLOR_GREEN = Symbol(); function getComplement(color) { switch (color) { case COLOR_RED: return COLOR_GREEN; case COLOR_GREEN: return COLOR_RED; default: throw new Error('Undefined color'); } } -
消除魔术字符串
魔术字符串,指的是与代码形成强耦合的字符串或者数值,正常代码优化手段是将其改成含义清晰的常量进行表示。
如何消除呢? 正常情况下必须定义一个常量,并赋予其一个特殊字符串,这样每出现一个都需要想那个字符串。如果所需要的常量等于哪个值并不重要时,可以采用Symbol, 因为Symbol都是不相等的,
-
遍历Symbol
Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
var obj = {}; var a = Symbol("a"); var b = Symbol("b"); obj[a] = "Hello"; obj[b] = "World"; obj["c"] = "Happy"; var objectSymbols = Object.getOwnPropertySymbols(obj); objectSymbols; // [Symbol(a), Symbol(b)] Reflect.ownKeys(obj); // ["c", Symbol(a), Symbol(b)] -
Symbol.for() 、Symbol.keyFor()
-
Symbol.for(): 接收一个字符串作为参数,首先去搜索有没有以该参数作为名称的Symbol值,如果没有则创建一个。这个是会被登记在全局环境中提供搜索的。
-
Symbol() 和 Symbol.for() 的区别:后者会被登记在全局环境中提供搜索,前者不会;
-
Symbol.keyFor() 去找寻被登记可查询的Symbol字符串的值
var s1 = Symbol("xuqy"); Symbol.keyFor(s1); // undefined var s2 = Symbol.for("hello"); Symbol.keyFor(s2); // "hello"
-
还有更高阶的用法没有涉及... es6.ruanyifeng.com/#docs/symbo…