Symbol

// symbol用來表示獨一無二的值

const  s1  \=  Symbol()

// console.log(s1)

const  s2  \=  Symbol()

const  s3  \=  Symbol()

// console.log(s3)

const  s4  \=  Symbol('listen')

// console.log(s4.toString())

// console.log(Boolean(s4))

// console.log(!s4)

  

// 只是兩個標識

// Sybol不能進行運算

// 能夠轉化爲字符串 或者布爾值 自己不會改變

// Symbol做爲屬性名

let  prop  \=  'name'

const  info  \= {

// name:'info'

\[\`my${prop}\`\]:"info"  //es6中變量做爲屬性名

}

// console.log(info)

let  s5  \=  Symbol('name')

const  info2  \={

\[s5\]:'hhh', //Sybol值做爲屬性值 Sybol是獨一無二 屬性就能夠保證不會被別的變量覆蓋

age:17,

sex:'nan'

}

// console.log(info2)

// info2\[s5\] = 'haha'

// console.log(info2)

// info2.s5 = 'listen'

  

// 如下方法訪問不到Sybol屬性值

for(let  key  in  info2){

// console.log(key)

}

let  arr  \=  Object.keys(info2)

// console.log(arr)

// console.log(Object.getOwnPropertyNames(info2))

// console.log(JSON.stringify(info2))

  

// Object.getOwnPropertySymbols能夠得到Symbols爲屬性的屬性名

// console.log(Object.getOwnPropertySymbols(info2))

  

// ES6新提供的Reflect對象 reflect.ownKeys會返回這個對象任意類型的屬性名

// console.log(Reflect.ownKeys(info2))

  

// Symbol有兩個靜態的方法Symbol.for() Symbol.keyFor

// Symbol.for()傳入的字符串在全局找有沒有Symbol建立的值,若是有,直接返回那個值

// 沒有找到會建立新的

const  s8  \=  Symbol.for('listen')

const  s9  \=  Symbol.for('listen')

// console.log(s8==s9)

// Symbol.keyFor 會返回Symbol.for建立的標識

// console.log(Symbol.keyFor(s8))//listen

  

// 11個Symbol內置的值

// Symbol.hasInstance指向一個內部的方法

// instanceof

const  obj1  \= {

\[Symbol.hasInstance\](m){

console.log(m)

}

}

// console.log({a:'s'}instanceof <any>obj1)

// Symbol.isConcatSpreadable 設置一個數組是否可扁平化

let  arr8  \= \[1,2\]

arr8\[Symbol.isConcatSpreadable\] \=  false

// console.log(\[\].concat(arr8,\[3,4\]))

  

// class C extends Array {

// getName(){

// return 'listen'

// }

// }

// const c = new C(1,2,3)

  

Symbol.match

let  obj3  \= {

\[Symbol.match\](string){

// console.log(string.length)

},

\[Symbol.split\](string){

// console.log('split',string.length)

}

}

  

'abcde'.match(<RegExp\>obj3)//得是一個string或正則表達式的對象

'abcde'.split(<any\>obj3)

// Symbol.replace

// Symbol.search

// Symbol.split

const  arr6  \= \[1,2,3\]

const  iterator  \=  arr\[Symbol.iterator\]() //調用這個方法會返回一個遍歷器

// console.log(iterator.next())

// console.log(iterator.next())

  

// Symbol.toPrimitive 可查看轉換的類型 類型轉換就觸發

let  obj4:unknown  \= {

\[Symbol.toPrimitive\](type){

// console.log(type)

}

}

// const res = (obj4 as number)++

const  res  \=  \`abc${obj4}\`

  

// Symbol.toStringTag

let  obj5  \= {

get \[Symbol.toStringTag\](){

return  'listen'

}

}

console.log(obj5.toString())

// Symbol.unscopables能夠查看在with關鍵字下那些關鍵字會被過濾掉

const  obj6  \= {

a:'a',

b:'b'

}

// with(obj6){

// console.log(a)

// console.log(b)

// }

// console.log(Array.prototype\[Symbol.unscopables\]) copyWithin: true

// entries: true

// fill: true

// find: true

// findIndex: true

// includes: true

// keys: true

// values: true

const  arr13  \= \[1,2\]

width(arr13){

console.log(findIndex(2))

}
相關文章
相關標籤/搜索