Symbol:在ES5中,对象属性名都是字符串容易造成属性名冲突。为了避免这种情况的发生,ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。
symbol 是js在ES6 中一种基本数据类型。Symbol() 函数返回的是 Symbol 类型的值,该类型具有静态方法和静态属性。
1.用法:
Symbol([desc])
[desc]是一个可选参数,字符串,可用于调试,但是不能访问Symbol自身
2.每一个 Symbol() 返回的值都是唯一的。
console.log(Symbol('foo') === Symbol('foo')) // false
3.不可以使用new
var sym = new Symbol(); // TypeError报错
4、结合 Object() 函数,创建一个 Symbol 包装器对象
const name = Symbol()
const person = {
[name]:'wyy', //私有成员,外部访问不到
say(){
console.log('hi,' , this[name])
}
}
person.say() // hi,wyy
5、迭代 Symbol.iterator
该方法为每一个对象定义了默认的迭代器。该迭代器可以被 for… of 循环使用。
自定义迭代器
const sym = Symbol()
console.log(sym.length)
var myIterator = {};
myIterator[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
console.log([...myIterator]) // [1, 2, 3]
Symbols 和 for… in 迭代
Symbol对象值访问不到
var obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
console.log(obj) // { c: 'c', d: 'd', [Symbol(a)]: 'a', [Symbol(b)]: 'b' }
for (var i in obj) {
console.log(i); // c d
}
补充:
js数据类型:
值类型:String,Number,Boolean,Symbol,null,undefined。
引用类型:Object。
再补充:BigInt 长数字,还没正式标准化,预计要等到下个版本