两分钟读懂ES6的Symbol

作者: mytac | 来源:发表于2017-11-14 16:39 被阅读23次

    介绍

    ES6新增加的原始数据类型Symbol,它不能用new创建实例,因为他和undefinednull一样都是原始数据类型。

    Symbol 表示独一无二的值,即使传入相同参数的两个Symbol,他们也不是等价的:

    Symbol(1)==Symbol(1) //false
    Symbol(1)===Symbol(1) //false
    

    转换

    Symbol 不会被隐式转换为数字或字符串

    1+Symbol('1') //Uncaught TypeError: Cannot convert a Symbol value to a number
    '1'+Symbol('1') // Uncaught TypeError: Cannot convert a Symbol value to a string
    

    但是可以通过调用方法进行显式转换

    Symbol('1').toString() // -> "Symbol(1)"  转字符串
    !Symbol('1') // -> false 转布尔值
    
    /*但是不能转为数值*/
    Number(Symbol('1')) // -> VM1652:1 Uncaught TypeError: Cannot convert a Symbol value to a number
    

    基本使用

    作为对象的键名

    在我们为对象扩充属性时,经常会不小心覆盖之前的属性,由于Symbol的唯一性,我们可以用Symbol作为键名使用:

    const name=Symbol()
    const people={}
    /*务必这样创建属性,如果写为people.name则会吧name解析为字符串,相当于people['name']*/
    people[name]='tom' 
    console.log(people.name) // => undefined 这里其实是在访问people['name']
    console.log(people[name]) // 'tom'
    

    用Symbol创建的属性不会被遍历到,有一个Object.getOwnPropertySymbols方法,可以获得指定对象的所有Symbol属性名。

    const obj = {};
    let a = Symbol('a');
    let b = Symbol('b');
    
    obj[a] = 'Hello';
    obj[b] = 'World';
    
    const objectSymbols = Object.getOwnPropertySymbols(obj);
    console.log(objectSymbols) // => [Symbol(a), Symbol(b)]
    

    重用

    使用Symbol.for()可以重用同一个Symbol值,并注册到全局环境以便搜索。

    // 搜索标记为foo的Symbol,没有则创建
    const s1 = Symbol.for('foo');
    const s2 = Symbol.for('foo');
    
    s1 === s2 // true
    

    查询登记名称

    使用Symbol.keyFor查询Symbol注册名称。

    let s1 = Symbol.for("foo");
    Symbol.keyFor(s1) // "foo"
    
    let s2 = Symbol("foo");
    Symbol.keyFor(s2) // undefined
    

    总结

    想详细了解的去读阮一峰的原文,不过symbol这个东西的用处确实不大,简单了解基础部分就够了。

    相关文章

      网友评论

      本文标题:两分钟读懂ES6的Symbol

      本文链接:https://www.haomeiwen.com/subject/qysfvxtx.html