es6中Symbol数据类型

责编:menVScode 2018-02-24 16:12 阅读(551)

        Symbol 是ES6中新增加一种数据类型,表示独一无二的值,是JS中的第七种数据类型。在ES5中对象的属性名只能是字符串,这样很容易造成命名冲突,比如大家在扩展别人写的对象的时候,假如要添加新的方法,恰巧这个属性名和之前的冲突了,就会造成不必要的麻烦。为了解决这种根本性问题,ES6引进了这种数据类型。

        基本的数据类型:Null、undefined、Number、Boolean、String、Symbol;

        引用数据类型:Object。


        1、创建Symbol数据类型

        通过系统内置的 Symbol() 函数创建

//不能使用new命令,Symbol是原始类型的值,不是一个对象。
let s1 = Symbol();
let s2 = Symbol();
console.log(typeof s1) //symbol
console.log( s1===s2 ) //false

        Symbol 函数前不能使用 new 命令,否则会报错,原因在于 Symbol 是一个原始类型的值,不是对象。

let s1 = Symbol();
let s2 = Symbol();
console.log(s1) //symbol()
console.log(s2) //symbol()

        打印s1、s2的时候,都是symbol(),为了解决这个问题在初始化Symbol的时候,Symbol函数中可以接受一个参数。这就区分哪个Symbol对应哪个值了。

let s1 = Symbol('111');
let s2 = Symbol('menvscode');
console.log(s1) //Symbol(111)
console.log(s2) //Symbol(menvscode)

        Symbol 函数接收一个字符串作为参数,表示对Symbol的描述,主要是为了在控制台显示,或者转为字符串的时候,比较容易区分。描述相同不等于值也相同:Symbol('momo') === Symbol('momo'),结果是false。


        2、Symbol 数据类型的转换

        [1] 转换为字符串

let s = Symbol('menvscode');
console.log(typeof String(s)); // string
console.log(typeof s.toString()); // string

        [2] 转换为布尔值

let s = Symbol('menvscode');
console.log(!s) // false
console.log(!!s) // true

        [3] Symbol 不能转换为数字

        [4] 不能使用任何运算符,不能进行字符转拼接


        3、作为对象的属性名

        [1] 方式 1

let mvc = Symbol('menvscode');
let obj = {};
obj[mvc] = 'hello';
console.log(obj); // {Symbol(menvscode): "hello"}
console.log(obj[mvc]) // hello

        [2] 方式 2

let mvc = Symbol('menvscode');
let obj = {
    [mvc]:'word'
};
console.log(obj)
console.log(obj[mvc])


        4、注意事项

        [1] 直接将Symbol写在对象里,然后用其获取值为undefined

let obj = {
    [Symbol('mvc')]: 'menvscode',
    a:1
};

console.log(obj); //{Symbol(): "menvscode"}
console.log(obj[Symbol('mvc')]); // undefined

        [2] 不能被 for...in 循环遍历,虽然不能被遍历,但是也不是私有属性,可以通过 Object.getOwnPropertySymbols() 方法获得一个对象的所有的Symbol属性。

let obj = {
    [Symbol('mvc')]: 'menvscode',
    [Symbol('hello')]: 'hello',
    a:1,
    b:2
};
console.log(obj); //{Symbol(): "menvscode"}

console.log(obj[Symbol('mvc')]); // undefined
 
for(let val in obj){
    console.log(val) // a b
}

console.log( Object.getOwnPropertySymbols(obj) ); // [Symbol(mvc), Symbol(hello)]
console.log( obj[Object.getOwnPropertySymbols(obj)[0]] ); // menvscode
标签: Symbol es6
前端交流群: MVC前端网(menvscode.com)-qq交流群:551903636

邮箱快速注册

忘记密码