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])