zoukankan      html  css  js  c++  java
  • 《ES6标准入门》Symbol

    Symbol

    1. 概述

    • 如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。
    • ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型。
    • Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
        let s = Symbol()
    
        typeof s
        // "symbol"
    
    • 注意,Symbol函数前不能使用new命令,否则会报错。Symbol 值不是对象,它是一种类似于字符串的数据类型。
    • Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述。注意,Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。
    • 如果 Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值。
    • Symbol 值不能与其他类型的值进行运算,会报错。
    • Symbol 值可以显式转为字符串。另外,Symbol 值也可以转为布尔值,但是不能转为数值。

    2. Symbol.prototype.description

    • ES2019(ES10)提供了一个实例属性description,直接返回 Symbol 的描述。
        const sym = Symbol('foo')
    
        sym.description // "foo"
    

    3. 作为属性名的Symbol

    • 由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
    • 注意,Symbol 值作为对象属性名时,不能用点运算符。同理,在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。
        let mySymbol = Symbol()
    
        // 第一种写法
        let a = {}
        a[mySymbol] = 'Hello!'
    
        // 第二种写法
        let a = {
            [mySymbol]: 'Hello!'
        }
    
        const mySymbol = Symbol()
        const a = {}
    
        a.mySymbol = 'Hello!'
        a[mySymbol] // undefined
        a['mySymbol'] // "Hello!"
    
    • Symbol 类型还可以用于定义一组常量,保证这组常量的值都是不相等的。常量使用 Symbol 值最大的好处,就是其他任何值都不可能有相同的值了。
    • Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。

    5. 属性名的遍历

    • Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
    • 有一个Object.getOwnPropertySymbols()方法,可以获取指定对象的所有 Symbol 属性名。该方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
    • 另一个新的 API,Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

    6. Symbol.for(),Symbol.keyFor()

    • 有时,我们希望重新使用同一个 Symbol 值,Symbol.for()方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。
        let s1 = Symbol.for('foo');
        let s2 = Symbol.for('foo');
    
        s1 === s2 // true
    
    • Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key。
        let s1 = Symbol.for("foo");
        Symbol.keyFor(s1) // "foo"
    
        let s2 = Symbol("foo");
        Symbol.keyFor(s2) // undefined
        }
    

    8. 内置的Symbol值

    • 除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。
    • Symbol内置值就是它的属性,整体再作为其他对象的属性存在,通过对这些属性的设置,可以改变对象在特定场景下的一个表现结果,相当于扩展功能。

    8.1 Symbol.hasInstance

    8.2 Symbol.isConcatSpreadable

    8.3 Symbol.species

    8.4 Symbol.match

    8.5 Symbol.replace

    8.6 Symbol.search

    8.7 Symbol.split

    8.8 Symbol.iterator

    8.9 Symbol.toPrimitive

    8.10 Symbol.toStringTag

    8.11 Symbol.unscopables

    学识浅薄,如有错误,恳请斧正,在下不胜感激。

  • 相关阅读:
    iptables 增删查改
    在Ubuntu14.04上安装WordPress4搭建技术博客
    Revit 二次开发之 零件
    Revit 二次开发之 结构层次
    revit二次开发之 过滤器二FilteredElementCollector收集器
    Revit二次开发之 动态模型更新(DMU: Dynamic Model Update)功能
    revit二次开发之 过滤器一
    Revit 二次开发之标高参数
    Revit二次开发之 错误
    Visual Studio删除所有的注释和空行
  • 原文地址:https://www.cnblogs.com/yin-jie/p/14867342.html
Copyright © 2011-2022 走看看