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>

猜你喜欢

转载自www.cnblogs.com/jnba/p/12198754.html