ECMAScript6-Symbol


简述

ES5的对象属性名都是字符串,为了 不引起属性名的混用和保证属性名的独一无二,进而引入了Symbol。
Symbol是javascript的第7种数据类型,表示独一无二的值

var s = Symbol();
console.log(typeof s);//'symbol'

Symbol函数不能使用new命令,否则会报错.因为Symbol是一种原始类型值,不是对象.

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

var s = Symbol('lalal');
console.log(s); // Symbol(lalal)

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

// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();

s1 === s2 // false

// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");

s1 === s2 // false

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

var sym = Symbol('My symbol');

String(sym) // 'Symbol(My symbol)'
sym.toString() // 'Symbol(My symbol)'
var sym = Symbol();
Boolean(sym) // true
!sym  // false

作为属性名的Symbol

let width = Symbol(),
    height = Symbol();
let o = {};
o[width] = '200px';
console.log(o); // Object {Symbol(): "200px"}
console.log(o.width); // undefined
console.log(o[width]); //200px

//注1:Symbol不能运用点运算符
o.width = '1280px';
console.log(o); //Object {width: "1280px", Symbol(): "200px", Symbol(): "300px", Symbol(top): 0}

//注2:另一种赋值的方法,使用Object.defineProperty()的方法
Object.defineProperty(o, height, {
    value: '300px'
}); // Object {width: "1280px", Symbol(): "300px"}
console.log(o);

//注3:另一种定义Symbol值的方式
o[Symbol('top')] = 0;
console.log(o); //Object {width: "1280px", Symbol(): "300px", Symbol(top): 0}
console.log(o[top]); //undefined;
console.log(o[Symbol('top')]); //undefined;??why,如何取值呢

你可能感兴趣的:(ECMAScript6-Symbol)