1.Symbol类型是什么,有什么用
Symbol可以定义为一个符号,一种标识符,用来区分某些东西。
2.创建一个符号
- 通过Symbol来创建,Symbol不是一个构造方法,所以不能够使用new操作符。
let sym = Symbol();
let sym = Symbol("aaa");//"aaa"是这个符号的description(描述)
- 两个description相同的符号,并不是同一个符号。两个没有description的符号,也不是同一个符号。
let sym1 = Symbol("aaa");
let sym2 = Symbol("aaa");
console.log(sym1 == sym2);//控制台输出结果为false
let sym3 = Symbol();
let sym4 = Symbol();
console.log(sym3 == sym4);//控制台输出结果为false
- Symbol不能通过new构造函数来创建,所以不能够创建符号包装对象,如果确实想用符号包装对象,可以借用Object函数。
let sym = Symbol();
let symbolObject = Object(sym);
console.log(typeof symbolObject);//输出结果为object
- 通过全局符号注册表来创建符号。
Symbol.for()的参数只能是一个字符串,它会检查全局注册表,如果没有找到,就会生成一个新符号添加到注册表中。后续再使用这种方式用相同的字符串创建符号的话,这个字符串在全局注册表中被找到,就会发现存在与该字符串对应的符号,然后就会返回该符号实例。
let symbol1 = Symbol.for("boo");
let symbol2 = Symbol.for("boo");
console.log(symbol1 === symbol2);//控制台输出true
- 通过全局符号注册表创建的符号和通过Symbol创建的符号,即使字符串一样,也不是同一个符号。
let symbol1 = Symbol("boo");
let symbol2 = Symbol.for("boo");
console.log(symbol1 === symbol2);//控制台输出false
- 通过给Symbol.KeyFor()一个符号参数,返回这个符号的字符串键。(必须是全局符号,否则会返回undefined)
let symbol1 = Symbol("aoo");
let symbol2 = Symbol.for("boo");
console.log(Symbol.KeyFor(symbol1));//控制台打印出undefined
console.log(Symbol.KeyFor(symbol2));//控制台打印出"boo"
3.给对象添加符号属性
- 定义一个符号,然后将其作为对象的一个属性。
let s1 = Symbol("foo");
let obj = {[s1]:'value1'};
console.log(obj);
2. 通过Objdect的defineProperty方法来给对象新添加符号属性。
let s1 = Symbol("bar");
let obj = {};
Object.defineProperty(obj,s1,{value:'value1'});
3. 通过Object的defineProperties方法来给对象一次性添加多个符号属性
let s1 = Symbol("bar");
let s2 = Symbol("foo");
let obj = {};
Object.defineProperties(obj,{[s1]:{value:'value1'},
[s2]:{value:'value2'}});
console.log(obj);
4.获取对象中的符号属性
- 通过Object的getOwnPropertySymbols获取对象中的所有符号属性。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
[s1]:"value1",
[s2]:"value2",
baz: "value3",
qux: "value4"
};
console.log(Object.getOwnPropertySymbols(obj));
- 通过Object的getOwnPropertyNames获取对象中的非符号属性。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
[s1]:"value1",
[s2]:"value2",
baz: "value3",
qux: "value4"
};
console.log(Object.getOwnPropertyNames(obj));
3. 通过Object的getOwnPropertyDescriptors获取对象的所有属性和对应的值。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
[s1]:"value1",
[s2]:"value2",
baz: "value3",
qux: "value4"
};
console.log(Object.getOwnPropertyDescriptors(obj));
- 通过Reflect的ownKeys获取对象的所有属性。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
[s1]:"value1",
[s2]:"value2",
baz: "value3",
qux: "value4"
};
console.log(Reflect.ownKeys(obj));
5.常用内置符号
- Symbol.asyncIterator
- Symbol.hansInstance
- Symbol.isConcatSpreadable
- Symbol.iterator
- Symbol.match
- Symbol.replace
- Symbol.search
- Symbol.species
- Symbol.split
- Symbol.toPrimitive
- Symbol.toStringTag
- Symbol.unscopables