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

}

HappyCodingTop
526 声望847 粉丝

Talk is cheap, show the code!!


引用和评论

0 条评论