Symbol

    xiaoxiao2021-03-25  129

    ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,它是JavaScript的第七种数据类型

    var s = Symbol(); typeof s //'symbol' var sy=Symbol('foo') \\Symbol(foo)

    Symbol函数前不能使用 new;生成Symbol是一个原始类型的值,Symbol值不是对象,所以不能添加基本属性,它类似于字符串的数据类型

    Symbol 接受字符串,方便对实例的描述 如果参数为对象就会被 toString 转换为字符串后调用

    var sd={} var sg=Symbol(sd) //Symbol([object Object])

    Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的

    var sy1=Symbol(); var sy2=Symbol(); sy1==sy2 //false sy1===sy2 //false

    Symbol值不能与其他类型的值进行运算,会报错。

    var sy1=Symbol(); var str='sada'+sy1 \\TypeError: Cannot convert a Symbol value to a string

    消除魔术字符串

    魔术字符串:在代码之中多次出现,与代码形成强耦合的某一个具体的字符串或者数值

    Symbol作为属性名不会出现for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回 Object.getOwnPropertySymbols可以返回Symbol作为对象属性 Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名

    Symbol.for()

    var sy1=Symbol.for('sy') var sy2=Symbol.for('sy')var sy1===sy2 //true var sm1=Symbol('ha') var sm2=Symbol.for('ha') sm1===sm2 //false

    Symbol.keyFor() Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key

    var sm1=Symbol('ha') var sm2=Symbol.for('ha') var key1=Symbol.keyFor(sm1) //undefined var key2=Symbol.keyFor(sm2) //ha

    需要注意的是,Symbol.for为Symbol值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值

    内置的Symbol值

    Symbol.hasInstance

    指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法

    class MyClass { [Symbol.hasInstance](foo) { return foo instanceof Array; } } [1, 2, 3] instanceof new MyClass() // true

    Symbol.hasInstance

    先这样后面补充(有点懵)

    转载请注明原文地址: https://ju.6miu.com/read-22844.html

    最新回复(0)