// 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)) }