天行健, 君子以自强不息
Sunny's Blog
Title

ES6 Demos(六) Symbols and Symbol Properties(符号与符号属性)

总体上感觉这章的用处还没有完善,所以暂时只记录如下几个知识点

1.Symbol是ES6新引入的原始数据类型,之前的原始数据类型有五个: string,number,boolean,null,undefined

2.下面是摘自阮一峰的ES6引入Symbol的原因:ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

3.Symbol,表示独一无二的值

Demo1: 作为属性名的Symbol

                let mySymbol = Symbol();

                //使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。
                //如果s不放在方括号中,该属性的键名就是字符串s,而不是s所代表的那个 Symbol 值

                let a = {
                  [mySymbol]: 'Hello!'
                };

                console.log( a[mySymbol] ) //Hello!
                //a.[mySymbol] 或 a.[mySymbol]都是不行的


                a.test1 = 'test1';
                console.log( a.test1 )

                a.mySymbol = 'add mySymbol';
                console.log( a.mySymbol ) //'add mySymbol', 这种方式不是Symbol ,是string

                a.test1 = 'add test1';
                console.log( a.test1 ) // add test1, 此时的test1已经被覆盖了


                let mySymbol2 = Symbol();
                a[mySymbol2] = 'add Symbol2';
                console.log( a[mySymbol2] ) //add Symbol2, 这种方式是新加一个Symbol

                console.log( a )
                //由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

                //你可以体会一下,obj中Symbol()的值有两个,但是都是不同的,你就不能相互覆盖了

                // {
                //     mySymbol: "add mySymbol",
                //     test1: "add test1",
                //     Symbol(): "Hello!",
                //     Symbol(): "add Symbol2"
                // }

                console.log( typeof mySymbol )  //symbol
                console.log( typeof mySymbol2 ) //symbol
                console.log( mySymbol === mySymbol2 ) //false

                //所以你可以像mySymbol2那样添加属性或方法,而不用担心被覆盖或覆盖别人            
            
地势坤,君子以厚德载物