【es6】symbol

来源:互联网 发布:win10笔记本电脑优化 编辑:程序博客网 时间:2024/06/05 07:07

javascript数据类型:

 undefined、null、boolean、string、number、object、symbol 

概述:

  1. symbol 表示独一无二的值
  2. Symbol函数前不能使用new命令,会报错。生成的Symbol是一个原始类型的值,不是对象
  3. Symbol类型定义 var s1 = Symbol(‘foo’) 如果参数是一个对象的话,会调用对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值
  4. 相同参数的Symbol函数返回值不相等
  5. 不可与其他类型的值进行运算
  6. Symbol值可以显式转化为字符串 ‘Symbol(My symbol)’
  7. 可转化为布尔值,不能转为数值
    var sym = Symbol();    if(sym) {} //可执行    Boolean(sym) //true    !sym  //false    Number(sym) //TypeError

属性名

  1. 作为属性名可保证唯一性(公开属性)
  2. Symbol值作为对象属性名时,不能用点运算符,因为点运算符后面总是字符串
  3. 在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中
    let s = Symbol();    let obj = {      [s](arg) { ... }    };    obj[s](1,2,3)
  1. 可用在switch语句中保证按照设计方式工作

属性名遍历

  1. Object.getOwnPropertySymbols方法返回,对象的所有Symbol值用作属性名的数组(其他方法无法遍历Symbol属性)
  2. Reflect.ownKeys方法可以返回所有类型的键名
  3. 该属性不会被常规方法遍历到,所以可以为对象定义非私有但希望只用于内部的方法
Symbol.for(),Symbol.keyFor()

1 Symbol.for()搜索某一参数命名的Symbol值,为Symbol值登记的名字
2 Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key。

    var s1 = Symbol.for("foo");    Symbol.keyFor(s1) // "foo"(已登记)    var s2 = Symbol("foo");    Symbol.keyFor(s2) // undefined(未登记)

内置Symbol值

  • Symbol.hasInstance
    对象使用instanceof运算符时调用
  • Symbol.isConcatSpreadable
    决定对象使用Array.prototype.concat()时,是否可以展开
  • Symbol.species
  • Symbol.match
  • Symbol.replace
  • Symbol.search
  • Symbol.search
  • Symbol.iterator 指向对象的默认遍历器方法
  • Symbol.toPrimitive 对象被转为原始类型时调用,返回原始类型值
  • Symbol.toStringTag
  • Symbol.unscopables

补充

Object.defineProperty:定义新属性或修改原有的属性

    Object.defineProperty(obj,"newKey",{        configurable:true | false, //是否可删除/修改目标        enumerable:true | false, //枚举        value:任意类型的值, //属性值        writable:true | false //重写    });
原创粉丝点击