Symbol

概述

Symbol是ES6中提出的第七种JavaScript数据类型,目的是为了解决对象中同名属性冲突的问题。

Symbol值通过Symbol函数生成

1. typeof 类型是 symbol
let symbol1 = Symbol()
symbol1          // Symbol()

let symbol2 = Symbol()
symbol2          // Symbol()

typeof symbol1   // "symbol"

2. 无参的情况不等
symbol1 === symbol2   // false

3. 参数只表示对当前Symbol的描述,也不等
let sym1 = Symbol('foo')
sym1             // Symbol(foo)

let sym2 = Symbol('foo')
sym2             // Symbol(foo)

sym1 === sym2    // false

4. 参数为对象时调用对象内部的toString方法
var obj = {
    toString(){
        return 'abc'
    }
}
let sym4 = Symbol(obj)
sym4             // Symbol(abc)

5. 与其他类型的值参与运算会报错
'I am string' + sym4
// VM62296:1 Uncaught TypeError: Cannot convert a Symbol value to a string

6. Symbol值可显示转为字符串
String(sym4)      // "Symbol(abc)"
sym4.toString()   // "Symbol(abc)"

7. Symbol值可显示转为布尔值
Boolean(sym4)     // true

8. Symbol值转为Number类型报错
Number(sym4)
// VM62568:1 Uncaught TypeError: Cannot convert a Symbol value to a number

获取Symbol的描述

sym4.description         // "abc"

Symbol作为属性名

var obj = {}

// 可用以下三种方式添加属性
1. obj = {
    [sym2]: "World"
}

2. obj[sym4] = "Hello"

3. Object.defineProperty(obj, sym1, {value: 'haha'})

// {Symbol(foo): "World", Symbol(abc): "Hello", Symbol(foo): "haha"}

// 获取属性方式(不能用点属性方法获取)
1. obj[sym4]      // "Hello"

2. obj['sym4']    // undefined

3. obj.sym4       // undefined

// 相比普通属性
obj.a = 111
// {a: 111, Symbol(foo): "World", Symbol(abc): "Hello", Symbol(foo): "haha"}

1. obj.a      // 111
2. obj["a"]   // 111
3. obj[a]     // VM64118:1 Uncaught ReferenceError: a is not defined

属性名的遍历

1. 所有Symbol键名的数组
Object.getOwnPropertySymbols(obj)
(3) [Symbol(foo), Symbol(abc), Symbol(foo)]

2. 返回所有常规及Symbol键名的数组
Reflect.ownKeys(obj)
(4) ["a", Symbol(foo), Symbol(abc), Symbol(foo)]

results matching ""

    No results matching ""