//Symbol 值通过`Symbol`函数生成
let s=Symbol();
console.log(typeof s); //symbol
//=============传字符串==============
//`Symbol`函数可以接受一个字符串作为参数,
//有了参数以后,就等于为它们加上了描述
let s1=Symbol('foo');
let s2=Symbol('bar');
console.log(s1); //Symbol(foo)
console.log(s2); //Symbol(bar)
//转为字符串时,比较容易区分
console.log(s1.toString()); //'Symbol(foo)'
console.log(s2.toString()); //'Symbol(bar)'
//=============传对象==============
//如果 Symbol 的参数是一个对象
//就会调用该对象的`toString`方法,将其转为字符串,然后才生成一个 Symbol 值。
const obj={
toString(){
return '自动调用toString方法';
}
}
const sym=Symbol(obj);
console.log(sym); //Symbol(自动调用toString方法)
//==========Symbol值不相等============
//相同参数的`Symbol`函数的返回值是不相等的
//无参数,不相等
let s3=Symbol();
let s4=Symbol();
console.log(s3==s4); //false
console.log(s3===s4); //false
console.log(s3!=s4); //true
console.log(s3!==s4); //true
//有参数,也不相等
let s5=Symbol('foo');
let s6=Symbol('foo');
console.log(s5===s6); //false
let s7=Symbol('不能和其他类型运算,比如字符串拼接');
//console.log('test'+s7);//Uncaught TypeError: Cannot convert a Symbol value to a string
//console.log(`${s7}`);//Uncaught TypeError: Cannot convert a Symbol value to a string
let s8=Symbol('可以显式转为字符串');
console.log(String(s8)); //'Symbol(可以显式转为字符串)'
console.log(s8.toString()); //'Symbol(可以显式转为字符串)'
let s9=Symbol();
console.log(Boolean(s9)); //true
console.log(!!s9) //true
console.log(!s9); //false
if(s9){
console.log('Symbol默认布尔值为true');
}
// console.log(Number(s9));
// console.log(s9+2)
//作为属性名的Symbol
let mySymbol=Symbol();
//写法一
let a={};
a[mySymbol]='hello';
//写法二
let a={
[mySymbol]:'hello'
}
//写法三
let a={};
Object.defineProperty(a,mySymbol,{
value:'hello'
});
console.log(a[mySymbol]) //hello
//点运算符后面总是字符串,
//所以不会读取`mySymbol`作为标识名所指代的那个值
//导致`a`的属性名实际上是一个字符串,而不是一个 Symbol 值
let _mySymbol=Symbol();
let b={};
b._mySymbol='Hello';
console.log(b._mySymbol); // string | 'Hello'
console.log(b[_mySymbol]); //undefined|undefined
console.log(b['_mySymbol']); // string | 'Hello'
//在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中
let s = Symbol();
//写法一
/*let obj = {
[s]: function (arg) { console.log('当前参数是:'+arg) }
};*/
//写法二
let obj = {
[s] (arg) { console.log('当前参数是:'+arg) }
};
console.log(obj[s](123))
网友评论