JavaScript 中共有七种内置数据类型,包括基本类型和对象类型
1、基本类型
string(字符串)boolean(布尔值)number(数字)symbol(符号)null(空值)undefined(未定义)- bigInt (大整型) ,它的BigInt内置对象提供一种方法来表示大于
2^53 - 1的整数,可以表示任意大的整数。
2、对象类型(引用类型)
[] instanceof Array // true
({}) instanceof Object // true
(()=>{}) instanceof Function // true
还有Date、RegExp等
3、Symbol
(1)每一个"Symbol" 值都是不同的
可以使用 Symbol() 来创建这种类型的值:
// id 是 symbol 的一个实例化对象
let id = Symbol();
创建时,我们可以给 Symbol 一个描述(也称为 Symbol 名),这在代码调试时非常有用:
// id 是描述为 "id" 的 Symbol
let id = Symbol("id");
Symbol 保证是唯一的。即使我们创建了许多具有相同描述的 Symbol,它们的值也是不同。描述只是一个标签,不影响任何东西。
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
(2)Symbol 不会被自动转换为字符串
因为字符串和 Symbol 有本质上的不同,不应该意外地将它们转换成另一个
let id = Symbol("id");
alert(id); // 类型错误:无法将 Symbol 值转换为字符串。
可以通过调用 .toString()进行转换
let id = Symbol("id");
alert(id.toString()); // Symbol(id),现在它有效了
或者获取 symbol.description 属性,只显示描述(description):
let id = Symbol("id");
alert(id.description); // id
(3)全局 symbol
Symbol 总是不同的值,即使它们有相同的名字。如果我们希望同名的 Symbol 相等
那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话则创建)一个以 key 作为名字的全局 Symbol。使用 Symbol.for 多次调用 key 相同的 Symbol 时,返回的就是同一个 Symbol。
let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1 === id2) //false
// 从全局注册表中读取
let id11 = Symbol.for('id'); //如果该 Symbol 不存在,则创建它
// 再次读取(可能是在代码中的另一个位置)
let id22 = Symbol.for('id');
console.log(id11 === id22) //true
(4)Symbol.keyFor
对于全局 Symbol,不仅有 Symbol.for(key) 按名字返回一个 Symbol,还有一个反向调用:Symbol.keyFor(sym),它的作用完全反过来:通过全局 Symbol 返回一个名字。
// 通过 name 获取 Symbol
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// 通过 Symbol 获取 name
alert(Symbol.keyFor(sym)); // name
alert(Symbol.keyFor(sym2)); // id
(5)Symbol 有两个主要的使用场景:
-
“隐藏” 对象属性。 通过设置Symbol变量作为属性名,
for..in遍历,是获取不到的。该属性将受到保护,防止被意外使用或重写。//如果想用变量当属性名,需要加[] let obj = { a:2, sd:'dw', [Symbol('id')]:"隐藏属性id" } for(let i in obj){ console.log(i) }//a sd -
JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为
Symbol.*访问。我们可以使用它们来改变一些内置行为。例如,使用Symbol.iterator来进行迭代操作,使用Symbol.toPrimitive来设置 对象原始值的转换 等等。