zoukankan      html  css  js  c++  java
  • ES6之Symbol

      ES6中Symbol是为了防止属性名冲突而引入的,是独一无二的。Symbol值是通过Symbol函数生成。Symbol值不能与其他类型的值运算否则会报错且Symbol的值可以转换为字符串或者是布尔值但是不能转换为数值。如果你想比较两个Symbol是否全相等,请在value前面加上typeof。

    var test = Symbol('hi'); 
    var ceshi = Symbol('hi'); 
    var a = Symbol( typeof '1' ); 
    var b = Symbol( typeof '1' ); 
     if( test === ceshi ){                         //值不同
        console.log("值相同"); 
    }else{ 
        console.log("值不同"); 
    } 
    if( test.toString() === ceshi.toString() ){                 //输出的字符串相同
        console.log('输出的字符串相同'); 
    }else{ 
        console.log('输出的字符串不相同'); 
    } 
    if ( a === b ) {                             //true
        console.log(a===b); 
    }else{ 
        console.log(a!=b); 
    }    

      当然Symbol是可以作为属性名的,如果变量里面含相同的Symbol那么后者将覆盖前者

    //第一种写法(个人推荐)
    var hi = Symbol(); 
    var a = { [hi] : 'hi' , }; 
    var a = { [hi] : 'hello' , }; 
    var b = { [hi] : 'hello' , }; 
    console.log(a[hi]);         //hello    
    console.log(b[hi]);        //hello
    //第二种写法
    var hi = Symbol(); 
    var a = {}; 
    a[hi] = 'Hello!'; 
    console.log(a[hi]);        //hello
    //第三种写法
    var hi = Symbol(); 
    var a = {}; 
    Object.defineProperty(a, mySymbol, { value: 'Hello!' }); 
    console.log(a[hi]);         //hello

      Symbol.for()与Symbol()方法都会生成新的Symbol,他们的区别是前者会被登记在全局环境中供搜索,后者并不会。如果是用Symbol.for()生成的Symbol那么使用Symbol.keyFor()方法会返回一个已登记的Symbol类型值的key(意思就是Symbol.keyFor()方法找不到用Symbol生成因为他没有被登记在全局环境中!)

    var test = Symbol.for('这是Symbol.for'); 
    var ceshi = Symbol('这是Symbol'); 
    console.log(Symbol.keyFor(test));         //这是Symbol.for
    console.log(Symbol.keyFor(ceshi));        //undefined
      此外ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
      对象的Symbol.hasInstance属性指向一个内部方法,对象使用instanceof运算符时会调用这个方法,判断该对象是否为某个构造函数的实例。
        代码示例:证明x确实是Myclass的实例
    class MyClass { } ;
    var x = new MyClass(); 
    console.log(x instanceof MyClass); // true 
    console.log(MyClass[Symbol.hasInstance](x));//true

      对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象使用Array.prototype.concat()时是否可以展开,为false则不允许会出现下方黄色,为true则正常展开。

    let arr1 = [ 'a' , 'b' ];
    let arr2 = [ '1' , '2' ]; 
    arr2[Symbol.isConcatSpreadable] = false ; 
    console.log(arr1.concat( 'c' ));             //[ 'a', 'b', 'c' ]
    console.log(arr2.concat('3'));            //[ [ '1', '2', [Symbol(Symbol.isConcatSpreadable)]: false ],'3' ]

      对象的Symbol.species属性指向对象作为构造函数创造实例时会调用这个方法如果this.constructor[Symbol.species]存在就会使用这个属性作为构造函数来创造新的示例对象。

    // 扩展 Array 的构造函数 
    class MyArray extends Array { 
        static get [Symbol.species]() { 
            return Array; 
        } 
    } 
    var a = new MyArray(1,2,3); 
    var mapped = a.map(x => x * x); 
    console.log(mapped instanceof MyArray); // false 
    console.log(mapped instanceof Array); // true    

      其他Symbol内置方法请参考https://itbilu.com/javascript/js/41apamqfe.html#symbol-species

  • 相关阅读:
    随机的爱
    在使用ASP.NET时进行页面重定向的3种方法。(转)
    [程序员必看]请不要做浮躁的人
    C# datetime 操作
    心碎的浪漫
    动网论坛 企业版

    内存映射文件(File Mapping)API
    内存映射文件
    已知进程句柄,如何知道此进程的主窗口句柄
  • 原文地址:https://www.cnblogs.com/qiaohong/p/7705133.html
Copyright © 2011-2022 走看看