ES6的新增數據類型:Symbol


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM