代码改变世界

ES6的新增数据类型:Symbol

2017-03-24 11:01  改吧  阅读(3414)  评论(0编辑  收藏  举报
简介:Symbol类型是es6新增的一个数据类型,Es5的基本数据类型(undefined,null,Object,function,Number,string)
Symbol值通过Symbol函数生成
Symbol类型是保证每个属性的名字都是独一无二的,对于一个对象由对个模块构成的情况非常有用
 
 
值的输出:
var a=Symbol(‘foo’)=>Symbol(foo),与其他类型不能运算,可以转换成字符串
 
实例:
var a=Symbol()
var b={}
var c={a:’world'}
b[a]=‘hello'
Object.assign(b,c)=>{a:’world’,Symbol():’hello'}
 
 
Symbol初始化相等吗?
var a=Symbol()
var b=Symbol()
a==b=>false
 
var a=Symbol(‘foo')
var b=Symbol(‘foo')
a==b=>false
 
那么要怎么样两个一样参数的Symbol()才会相等为true呢,以下
var a=Symbol.for(‘foo')
var b=Symbol.for(‘foo')
a==b=>true
Symbol.for()被登记在全局环境中供搜索
Symbol.keyFor()返回一个已等级的Symbol类型值的key跟Symbol.for()是配套的
Symbol.keyFor(a)==>’foo’
 
 
魔术字符串在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值
 
消除魔术字符串,有魔术字符串
 
function getArea(shape, options) {
  var area = 0;

  switch (shape) {
    case 'Triangle': // 魔术字符串
      area = .5 * options.width * options.height;
      break;
    /* ... more code ... */
  }

  return area;
}

getArea('Triangle', { width: 100, height: 100 });
 
 
   消除魔术字符串
var shapeType = {
  triangle: 'Triangle'
};

function getArea(shape, options) {
  var area = 0;
  switch (shape) {
    case shapeType.triangle:
      area = .5 * options.width * options.height;
      break;
  }
  return area;
}
 
getArea(shapeType.triangle, { width: 100, height: 100 })
 
 
 
Symbol()作为属性名,该属性不会出现在```for...in```、```for...of ```循环中,也不会出现在Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()返回
比如
var b={}
b[Symbol()]=‘hello'
b[’name’]=‘wenwen'
console.log(b)=>{Symbol():’hello’,name:’wenwen'}
for(key in b){
     console.log(key)=>只会打印name
}
怎么样去获得Symbol()属性
这样子:
Object.getOwnPropertySymbols(b)=>[Symbol()]
还有一种方式可以得到Symbol()属性
Reflect.ownKeys(b)=>[’name’,Symbol()]
 
 
 
Symbol.isConcatSpreadable 
 
对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象使用Array.prototype.concat()时,是否可以展开。
 
var arr=[‘c’,’d']
arr[Symbol.isConcatSpreadable]=false
[‘a’,’b’].concat(arr)=>[‘a’,’b’,[‘c’,’d']]
 
 
Symbol.species
不太懂这个属性
我去
static get [Symbol.species](){return this}
 
 
 
Symbol.match
是指向一个函数
str.match(myObject)
 
class a{
     [Symbol.match](string){
          return ‘hello world’.indexOf(string)
     }
}
 
‘e’.match(new a())==>1
 
 
Symbol.replace
了解这个之前我先看了一下 string.prototype.replace
 
 
js replace例子
var str=‘hello wolrd'
var str1=str.replace(‘world’,’wenwen’)==>’hello wenwen'
var str1=String.prototype.replace.call(str,’world’,’wenwen’)==>’hello wenwen'
 
Symbol.unscopables
指向一个对象,该对象指定使用with关键字时,哪些属性会被with属性排除
 
例子:
Object.keys(Array.prototype{Symbol.unscopables])