簡介: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])
