• ES6 Symbol类型


    ES6 Symbol类型:

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。es6引入Symbol数据类型(已有Number 、 String 、 Boolean 、 Objec t、 null 和 undefined 类型);

    Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

    <script type="text/javascript">
      let s=Symbol();
      console.log(s);//Symbol()
      console.log(typeof(s));//symbol
      let s1=Symbol();
      console.log(s==s1);//false 凡是属性名属于 Symbol 类型,就都是独一无二的
    </script>

    Symbol实际使用

    <script type="text/javascript">
        //Symbol属性的使用
        let s = Symbol('sex');//定义属性,参数即属性名
        let obj = {name:'jack',age:18};
        //向对象里添加额外的属性
        //obj.sex='man';//以前的写法,有时属性多的时候会出现属性重复
        obj[s] = 'man';//这样能保障属性不重复
        console.log(obj,obj[s])//Symbol的属性不能直接用.接属性名
    
        //Symbol属性的遍历
        let obj1={name:'jack'};
        let s1=Symbol('name');
        let s2=Symbol('sex');
        obj1[s1]='jack';
        obj1[s2]='woman';
        for(let i in obj1){//常规遍历无法遍历Symbol属性
            console.log(i);//name
        }
        console.log(Object.getOwnPropertySymbols(obj1) )//[Symbol(name), Symbol(sex)]  获取所有 Symbol 属性名
        console.log(Object.getOwnPropertyNames(obj1))//["name"] 无法获取Symbol 属性名
        console.log(Reflect.ownKeys(obj1)) //["name", Symbol(name), Symbol(sex)]  获取所有的属性名
    
        //因为Symbol具有唯一性,所以我们可以做Symbol定义常量
        const System_key=Symbol('114aaa');
        console.log(System_key);
    
        //Symbol.for()
        // Symbol.for() 全局搜索指定key的Symbol,找到的话,就返回该Symbol,找不到,就新建一个
        let s3 = Symbol.for('foo');
        let s4 = Symbol.for('foo');
        console.log(s3==s4);//true
    
        //Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。
        // 它们的区别是,前者会被登记在全局环境中供搜索,后者不会。
        // Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,
        // 如果不存在才会新建一个值
        console.log(Symbol.for("bar") === Symbol.for("bar"))//true
        console.log(Symbol("bar") === Symbol("bar")) //false
    
        //Symbol.keyFor()
        // Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
        let s5 = Symbol.for("foo");
        console.log(Symbol.keyFor(s5))//"foo"
        let s6 = Symbol("foo");
        console.log(Symbol.keyFor(s6));// undefined
    
    </script>
  • 相关阅读:
    iOS之MRC和ARC
    给tableView的cell上加长按转发,复制、、等功能
    时间格式相关
    Xcode7,消失的pin菜单(Editor->pin)
    UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
    监听iPhone的通话状态之---CoreTelephony.framework
    iOS中一些系统通知名字集合
    iOS中的程序的五种状态
    Objective-C基础之@synthesize, @dynamic
    Objective-C基础之category extension
  • 原文地址:https://www.cnblogs.com/jnba/p/12198754.html
Copyright © 2020-2023  润新知