1.symbol:表示独一无二的值,是js中的第七种数据类型
symbol 函数前不能使用new 否则会报错,原因在于symbol是一个原始类型的值,不是对象
symbol 函数会接收一个字符串作为参数,表示对symbol的描述,主要是为了在控制台显示,或者转为字符串的时候,容易区分。
let s1 = Symbol('s1'); // 仅仅为了描述和区分
let s2 = Symbol('s2');
console.log(Symbol('s') === Symbol('s')) // false(只是为了描述和区分)
Symbol 对 String 的转换
console.log(String(Symbol('hello'))); // 字符串 Symbol(hello)
console.log(typeof String(Symbol('hello'))); // 数据类型 string
Symbol 对 Boolean 的转换
console.log(!Symbol('hello')); // false
console.log(!!Symbol('hello')); // true Symbol()本身是true
Symbol 对 Number 的转换(不能转换为 number 因此就不会有 parseInt parseFloor 等转换)
console.log(Number(Symbol())) // 报错 Uncaught TypeError: Cannot convert a Symbol value to a number
Symbol 不能做任何运算以及字符串拼接
console.log(Symbol('hello') + 'world'); // 报错 Uncaught TypeError: Cannot convert a Symbol value to a string
Symbol 作为对象的属性名
let x = Symbol('x');
let obj = {};
obj[x] = 'hello';
console.log(obj); // {Symbol(x): "hello"}
console.log(obj[x]); // hello
let s = Symbol('s');
let data = {
[s] : 'hello'
}
console.log(data); // {Symbol(x): "hello"}
console.log(data[s]); // hello
直接在data 中写入 Symbol() 属性,取不到 Symbol() 所对应的值
let data2 = {
[Symbol()] : 123
}
console.log(data2); // {Symbol(): 123}
console.log(data2[Symbol()]); // undefined
console.log(data2['Symbol()']); // undefined
采用for..in 的方式进行遍历,取不到 Symbol()的值
let xx = Symbol('xx');
let data4 = {
[xx] : 2,
a : 3,
b : 4
}
console.log(data4[xx]);
for(let i in data4){
console.log(i); // a,b 跳过 [Symbol('xx)]属性
}
let data3 = {
'a' : 1,
[Symbol()] : 12,
'b' : 2
}
for(let i in data3){
console.log(i); // a,b 跳过 [Symbol()] 属性
}
可以通过Object.getOwnProoertySymbols 方法获得一个对象的所有的Symbol属性
console.log(Object.getOwnPropertySymbols(data4)); // [Symbol(xx)]
console.log(data4[Object.getOwnPropertySymbols(data4)[0]]); // 2