// 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))
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。