概念
这种数据类型提供一个独一无二的值
作用
用来解决对象属性名冲突的问题
注意
- symbol值不能与其它类型的值进行运算,会报错
- Symbol 值作为对象属性名时,不能用点运算符,因为点运算符后面总是字符串,所以不会读取
mySymbol
作为标识名所指代的那个值
- 在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中
- Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Symbol</title>
</head>
<body>
<script>
//声明
{
let a1 = Symbol();
let a2 = Symbol();
console.log(a1 === a2);//false
console.log(typeof a1);//symbol
}
//可以用字符串来做区分、
{
let s1 = Symbol('foo');
let s2 = Symbol('bar');
console.log(s1);//Symbol(foo)
console.log(s2);//Symbol(bar)
}
//希望重新使用同一个 Symbol 值
{
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
console.log(s1 === s2);//true
}
//通过for in 和 let of 拿不到属性值
{
let a = Symbol.for('abc');
let o = {
[a]: 'what',
abc: 'are',
def: 'you'
}
console.log(o);
//{abc: "are", def: "you", Symbol(abc): "what"}
for (let [key, value] of Object.entries(o)) {
console.log(key, value);
// abc are
// def you
}
}
//Object.getOwnPropertySymbols 拿到symbol做为key值的对象属性
//返回的是一个数组
{
let a = Symbol.for('abc');
let o = {
[a]: 'what',
abc: 'are',
def: 'you'
}
console.log(Object.getOwnPropertySymbols(o));
//[Symbol(abc)]
console.log(Object.getOwnPropertySymbols(o).forEach(function (item) {
console.log(o[item]);
}));
}
//通过 Reflect.ownKeys() 遍历找到对象中所有key
//返回的是一个数组
{
let a = Symbol.for('abc');
let o = {
[a]: 'what',
abc: 'are',
def: 'you'
}
console.log(Reflect.ownKeys(o));
Reflect.ownKeys(o).forEach(function (item) {
console.log(item, o[item]);
});
// abc are
// def you
// Symbol(abc) "what"
}
</script>
</body>
</html>