ES6新特点:增添新类型:Symbol

  Symbol的习性以及那些属性的用处:

  Symbol.prototype: Symbol有针对的原型:

console.log(Symbol.prototype); //输出Symbol的原型

  Symbol.length: Symbol的length为一,
约等于说调用Symbol须要一个参数, 当然不给参数也没啥事。

  Symbol.Iterator:目的的Symbol.Iterator属性,
指向那些目标的暗中认可遍历器:

var myIterable = {};
myIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};
console.log([...myIterable]); // [1, 2, 3]

  Symbol.match:ES陆中字符串去相称对象的Symbol.match方法,
相配的结果完全可控,
以下德姆o,也就是把字符串”strstring“作为obj[Symbol.match]方法的参数
然后回去用户设定的值, chrome和FF近日还不协助:

let obj = {
    [Symbol.match](string) {
        console.log(string);
        return "heheda";
    }
};;
console.log("strstring".match(obj));

    图片 1

  Symbol.replace:和方面包车型大巴道理一样:

let obj = {
    [Symbol.replace](string) {
        console.log(string);
        return "replllll";
    }
};
console.log( "sssss".replace(obj) ); //输出:  sssss    replllll

  Symbol.split:和方面包车型大巴道理同样。

  Symbol.toPrimitive:对象的Symbol.toPrimitive针对三个方法,
当对象转化为本来值得话, 会调用这一个点子,
2个目的转为原始值由三种情景:string, number, default

    var obj1 = {};
    console.log(+obj1);     // NaN
    console.log(`${obj1}`); // "[object Object]"
    console.log(obj1 + ""); // "[object Object]"

    // obj2有定义Symbol.toPrimitive属性;
    var obj2 = {
        [Symbol.toPrimitive](hint) {
        if (hint == "number") {
            return 10;
        }
        if (hint == "string") {
            return "hello";
        }
        return true;
    }
    };
    console.log(+obj2);     // 10      -- 转化 为 "number"
    console.log(`${obj2}`); // "hello" -- 转化 为 "string"
    console.log(obj2 + ""); // "true"  -- 转化 为 "default"

  Symbol.toStringTag:Symbol.toStringTag, 那一个玩意儿厉害了,
连对象的toString办法都给改了,而且用Object.prototype.toString.call本条款标输出也是一律的, 那么些情何以堪, 今后判断成分类型必须用别的办法了,
改换大了…. :

console.log({ [Symbol.toStringTag] : "str "}.toString()); //输出:[object str ]
console.log(Object.prototype.toString.call({ [Symbol.toStringTag] : "str "}))
//输出:[object str ]
class Collection { get [Symbol.toStringTag]() { return 'xxx'; } } var x = new Collection(); console.log(x.toString())// 输出:"[object xxx]"

  Symbol怎样利用

  Symbol怎样行使啊, Symbol不是一个构造函数哦, 要是用new Symbol的话,
会报错的:

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
console.log(sym1, sym2, sym3) //输出Symbol() Symbol(foo) Symbol(foo)

  连友好都不对等自身:

//用同样的参数创建两次, 也是不相等的:
Symbol("foo") === Symbol("foo"); //输出:false

  作为属性名的Symbol;使用Symbol给目标增多唯一的习性,
Symbol也能看做对象的函数名;

let obj = {};
let sAttr0 = Symbol("hehe");
let sAttr1 = Symbol("meme");
obj[sAttr1] = 1;
console.log(obj[sAttr1]);

obj[sAttr0] = () => {
    return ++obj[sAttr0];;
};

  大家得以用typeof决断某2个变量类型为Symbol类型:

typeof Symbol() === 'symbol' //输出:true
typeof Symbol('foo') === 'symbol' //输出: true
typeof Symbol.iterator === 'symbol' //输出 : true

  如若大家不知情Symbol的实例名字是怎么,大家怎么获取到Symbol值的吧,
Symbol不能够被for infor of循环,以及Object.keys,
Object.values
等都不可能遍历到Symbol的属性; Object下给我们提供了1个getOwnPropertySymbols

let sym0 = Symbol("o_o?");
let obj = {
    [sym0] : "heheda"
}
for( let prop of Object.getOwnPropertySymbols(obj) ) {
    //prop就是Symbol的名字
    console.log( obj[prop] ); //输出:heheda
};

  或者用ES6提供的反射 : Reflect.ownKeys, 反射?

let sym0 = Symbol("o_o?");
let obj = {
    [sym0] : "heheda"
}
console.log( Reflect.ownKeys(obj) ); //输出:[ Symbol(o_o?) ]

   Symbol.for和 Symbol.keyFor

  Symbol.for和Symbol的绝无仅有区别是 Symbol.for创设的五个实例恐怕卓越,
依据Symbol的参数生成实例, 假如参数同样, 那么会回去同二个实例;

let foo = Symbol.for( "1111" );
let bar = Symbol.for("1111");
console.log( foo === bar );  //输出: true
//只有通过Symbol.for创建的对象,才能用keyFor找到原来的参数;
console.log(Symbol.keyFor(foo)) //会输出:1111

  

  ES6新扩展了1种数据类型:SymbolSymbol是用来定义对象的绝无仅有属性名的不二之选;

   参考:

    mdn:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol

    阮一峰ECMAScript 6
入门:http://es6.ruanyifeng.com/#docs/symbol

作者:
NONO

出处:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830 

  本文全数德姆o的运作情形都为nodeJS,
参考:让nodeJS帮助ES陆的词法—-babel的装置和应用