Symbol

js中除了undefined number function string object null Boolean,es6新加了一种类型Symbol

{
    let s1=Symbol();
    let s2=Symbol();
    console.log(s1);//Symbol()
    console.log(s2);//Symbol()
    console.log(typeof s1);//Symbol
    console.log(s1==s2);//false
}
很明显,symbol都是不相等,这是最关键的特性

然后继续往下看,要是symbol传个参数呢

{
//传字符串
  let s1=Symbol('string');
  let s2=Symbol('string');
  console.log(s1);//Symbol(string)
  console.log(s2);//Symbol(string)
  console.log(s1==s2);//false

  //传数组
  const s3=Symbol([1,2,3]);
  const s4=Symbol([1,2,3]);
  console.log(s3);//Symbol(1,2,3)
  console.log(s4);//Symbol(1,2,3)
  console.log(s3==s4);//false
 //传对象
  const json={a:1};
  const s5=Symbol(json);
  const s6=Symbol(json);
  console.log(s5);//Symbol([object Object])
  console.log(s6);//Symbol([object Object])
  console.log(s5==s6);//false
}
以上例子可以看出,Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

如果想把symbol转化成其他类型,改摆什么姿势才行呢,继续往下看

{
    //Symbol 值可以显式转为字符串。
     const s=Symbol('string');
     //console.log('hello'+s);//Cannot convert a Symbol value to a string
     console.log('hello'+String(s));//helloSymbol(string)
     console.log('hello'+s.toString(s));//helloSymbol(string)

     //Symbol 值也可以转为布尔值,但是不能转为数值。
     console.log(Boolean(s));//true
     const b=Symbol(1);
     //Number(b);// Cannot convert a Symbol value to a number
}

json对象中使用symbol作为属性,几个注意点

{
    let s=Symbol();
    let obj={
         [s]:'symbol',
         s:'hello'
    }
    console.log(obj[s]);//symbol
    console.log(obj.s);//hello
    //Symbol 值作为对象属性名时,不能用点运算符。用中括号
}

属性名的遍历

{
     let s=Symbol();
     let b=Symbol();
     let obj={
          [s]:'symbol',
          s:'hello',
          [b]:'world'
      }
      for (let name in obj){
        console.log(name);//s
      }
     for (let val of Object.values(obj)){
        console.log(val);//hello
     }
     //Symbol 作为属性名,该属性不会出现在for...in、for...of循环中


     //下面这个方法循环出属性名是symbol类型的属性值
     let arr=Object.getOwnPropertySymbols(obj);
     console.log(arr);//[Symbol(), Symbol()]
     for (let i of Object.values(arr)){
        console.log(obj[i]);//symbol world
     }

     //如果都想循环出来的话,Reflect.ownKeys方法可以返回所有类型的键名
     let arrs=Reflect.ownKeys(obj);
     for (let name of Object.values(arrs)){
       console.log(obj[name]);//hello symbol world
    }
}

看一下Symbol.for(),Symbol()的区别

{
    console.log(Symbol()===Symbol());//false
    console.log(Symbol.for()===Symbol.for());//true
}

Symbol.for()与Symbol()这两种写法,都会生成新的Symbol。它们的区别是,前者会被登记在全局环境中供搜索,后者不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。比如,如果你调用Symbol.for("cat")30次,每次都会返回同一个 Symbol 值,但是调用Symbol("cat")30次,会返回30个不同的Symbol值

Symbol.keyFor的用法

{
    let s1=Symbol('s1');
    let s2=Symbol.for('s2');
    console.log(Symbol.keyFor(s1));//undefined
    console.log(Symbol.keyFor(s2));//s2
}
Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key,这个方法针对Symbol.for()是ok的,但是对Symbol()是挂掉的,返回的是个undefined



ok,按照国际惯例,咱们得来这么一下子
Symbol的几个特性的介绍这么多,想看更详细的资料,请狠狠的点击我



推荐阅读更多精彩内容

  • 1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象...
    赵然228阅读 609评论 2 10
  • Symbol:一种新的原始数据类型,表示独一无二的值。 引入Symbol的原因:ES5 的对象属性名都是字符串,这...
    Rose_yang阅读 135评论 0 0
  • 前端技术日新月异,不断有新技术出现,我们就需要不断地学习新知识,虽然ES6已经提出很久了,但是最近我才有时间静下心...
    艰苦奋斗的侯小憨阅读 3,972评论 3 5
  • 一个Symbol的题目: 设计一个对象,键名的类型包含一个symbol类型,并实现遍历所有key 一 : 概述 E...
    椰果粒阅读 356评论 0 1
  • 1. 概述 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数...
    ForeverYoung20阅读 603评论 1 0
  • 最近一直是有晚睡的,昨天因为实在是太累,很早就想碎觉了,然并卵我还是十二点以后谁的,当然比起之前1点多睡是要早很多...
    ABC360兰迪中教Joy阅读 117评论 0 0
  • 【专题:文化传承】 在中国绘画“走向现代”的历史进程中,有这样一位先行者: 虽然在人世间仅停留了48载, 却成为民...
    南阳雅月阅读 646评论 0 3
  • 老妈:儿子,以后找老婆要找会生活的! 儿子:啥?要找会生儿子的。
    西西光辉阅读 44评论 0 0