JS基本数据类型之symbol

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/infor/of无法遍历,必须使用Object.getOwnPropertySymbols(对象)Reflect.ownKeys(对象)进行遍历

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容