• deep-in-es6(七)


    Symbols对象 JavaScript的第七种原始类型

    以前的数据类型:

    Undefined 未定义
    Null 空值
    Boolean 布尔类型
    Number 数字类型
    String 字符串类型
    Object 对象类型

    前五种数据类型是有限的。Object对象类型是无限的。symbol是程序创建并且可以用作属性键的值,并且他能避免命名冲突的风险。

    var mySymbol = Symbol();//它的值与其它的值完全不相等
    

    字符串或者数字可以作为属性的键,Symbol也可以,他不等同于任何字符串,因而这个一Symbol为键的属性可以保证不与其他属性产生任何冲突。

            var mySymbol = Symbol();//它的创建并没有new关键字
            var obj = {};
            obj[mySymbol] = "assassin";
            console.log(obj[mySymbol]);//assassin 保证不会冲突
    

    以symbol为键的属性与数组元素类似,访问时必须使用方括号访问这些属性。

    typeof Symbol();//"symbol" symbol与其他对象不完全相像
    

    symbol创建后就不可以变更,不能为其设置属性,它们可以使用做属性名称,这些性质一字符串类似。每一个symbol都是独一无二的不与其他的symbol等同,即使二者有相同的描述也不相等。

    symbol注意:symbol不能自动转换成字符串,不能与字符串拼接,会得到TypeError。通过String(mySymbol)或者mySymbol.toString()可以转换成字符串。

    获取symbol的三种方法

    1.调用Symbol();这种方法每次的调用都会返回一个新的唯一的symbol

    2.调用Symbol.for(string);这种方法会访问symbol注册表,其中存储了已经存在的一些列symbol。这种与Symbol()定义的独立mySymbol不同,第二种方法中的mySymbol是注册表中的,是共享的,如果你好多次调用Symbol.for("cat");都会返回相同的mySymbol,注册表非常有用,在多个web页面中或者同一个web页面中的多个模块经常需要共享一个mySymbol;

           var obj2 = {};
           var mySymbol1 = Symbol.for("aaa");
           var mySymbol2 = Symbol.for("aaa");
           console.log(obj2[ mySymbol1 ]+" "+obj2[ mySymbol2 ]);//undefined undefined
           console.log(obj2[ mySymbol1 ] == obj2[ mySymbol2 ]);//true
    

    3.使用标准定义的symbol,如:Symbol.iterator.

    symbol在es6中的应用:

    1.使用instanceof可扩展。表达式object instanceof constructor被指定为构造函数的一个方法:constructor[Symbol.hasInstance](object);这意味着它是可扩展的。

    2.消除新特性和旧代码之间的冲突。添加某些ES6数组方法会破坏现有的Web网站.其他Web标准有相同的问题:想浏览器中添加新方法会破会原有的网站。问题主要由动态作用域引起,ES6引入一个特殊symbol(Symbol.unscopables),Web标准用这个symbol来阻止某些方法加入到动态作用域中。

    3.支持新的字符串匹配类型。es5中str.match(myObject)会尝试将其转换成正则表达式对象(RegExp)。es6中他会检查myObject是否有一个myObject[Symbol.match](str)方法。现在的库可以提供自定义的字符串解析类。所有支持RegExp对象的环境都可以正常运行。

       var mySymbol = Symbol();
       var obj = {};
       obj[mySymbol] = "assassin";
       console.log(obj[mySymbol]);
    
       var obj2 = {};
       var mySymbol1 = Symbol.for("aaa");
       var mySymbol2 = Symbol.for("aaa");
       console.log(obj2[ mySymbol1 ]+" "+obj2[ mySymbol2 ]);//undefined undefined
       console.log(obj2[ mySymbol1 ] == obj2[ mySymbol2 ]);//true
    
  • 相关阅读:
    Android应用安全之外部动态加载DEX文件风险
    Android应用安全之Android APP通用型拒绝服务漏洞
    利用Cydia Substrate进行Android HOOK(二)
    Apk去签名校验详解
    nginx部署前端项目的一些配置【刚入门】
    java 日期格式化 将String日期重新格式化成String型【转】
    idea导入maven项目时需要注意
    element 'dependency' cannot have character [children], because the type's content type is element-only.
    腾讯云centos7执行 systemctl status postfix.service 启动postfix服务时出现 /usr/sbin/postconf: fatal: parameter inet_interfaces: no local interface found for ::1
    redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted
  • 原文地址:https://www.cnblogs.com/intelwisd/p/8035615.html
Copyright © 2020-2023  润新知