Symbol是一种基本数据类型。Symbol()函数会返回symbol类型的值。该类型具有静态属性和静态方法。
每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符。
使用场景
1、对象:创建私有成员、防止属性名冲突。
2、Symbol的值是唯一的、独一无二的,不会重复。
注意:不支持语法new Symbol()。
基础知识
语法
Symbol([description])
description:对symbol的描述,可用于调试但不是访问symbol本身。
<!DOCTYPE html>
<html>
<head>
<title>js字符串</title>
</head>
<body>
<div id="message">
</div>
<script>
"use strict"
var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');
console.log(sym2 == sym3) // false
console.log(sym2 === sym3) // false
// Symbol中的description属性
console.log(sym1.description); // undefined
console.log(sym2.description); // foo
sym1.first = "first"; // Cannot create property 'first' on symbol 'Symbol()' [无法创建属性]
</script>
</body>
</html>
方法
Symbol.for(key)
作用:使用给定的key搜索现有的symbol。【key表示symbol中的description】
返回值:如果找到,返回该symbol;否则将创建一个新的symbol,key作为description,添加到注册表中并返回。
Symbol.keyFor(symbol)
作用:从symbol注册表中,返回指定symbol的description,没有则返回undefined。
返回值:如果有description,返回;否则返回undefined。
注意:
1、如果使用Symbol()定义的symbol,则不会添加到注册表中;使用Symbol.for()定义的symbol则会添加到注册表中。
2、Symbol.for(key)和Symbol.keyFor(sym)都是在Symbol注册表中进行查找。【不会找到Symbol()定义的symbol】
<!DOCTYPE html>
<html>
<head>
<title>js字符串</title>
</head>
<body>
<script>
"use strict"
var sym1 = Symbol();
var sym2 = Symbol('sym');
var sym3 = Symbol('sym');
var sym4 = Symbol.for("sym")
var sym5 = Symbol.for("sym")
console.log(sym2 == sym3) // false
console.log(sym2 == sym4) // false
console.log(sym3 == sym4) // false
console.log(sym4 == sym5) // true
console.log(Symbol.keyFor(sym1)) // undefined
console.log(Symbol.keyFor(sym2)) // undefined
console.log(Symbol.keyFor(sym4)) // sym
</script>
</body>
</html>
Symbol的操作
Symbol作为对象的属性,进行遍历
<!DOCTYPE html>
<html>
<head>
<title>js字符串</title>
</head>
<body>
<div id="message">
</div>
<script>
"use strict"
let symbol = Symbol("sym");
let obj = {
name: "symbol_name",
[symbol]: "唯一性"
};
// 访问对象的基本属性
for (const key in obj) {
console.log(key); //name
}
for (const key of Object.keys(obj)) {
console.log(key); //name
}
// 访问对象中的私有属性
for (const key of Object.getOwnPropertySymbols(obj)) {
console.log(key); // Symbol(sym)
}
for (const key of Reflect.ownKeys(obj)) {
// 访问对象的所有属性
console.log(key); // name 、Symbol(sym)
}
</script>
</body>
</html>
注意:
1、对象的属性要使用变量值,必须使用[变量名]
2、Symbol类型作为对象的私有属性,通过for/in、for/of无法遍历,必须使用Object.getOwnPropertySymbols(对象)或Reflect.ownKeys(对象)进行遍历