JavaScript-Symbol
表示独一无二的值,类似于字符串的数据类型
# Symbol特点
- Symbol的值是唯一的,用来解决命名冲突的问题
- Symbol值不能与其他数据进行运算
- Symbol 定义的对象属性不能使用
for...in
循环遍历,但是可以使用Reflect.ownKeys
来获取对象的所有键名
// 创建Symbol
let s = Symbol()
let s2 = Symbol('哈哈')
let s3 = Symbol('哈哈')
console.log(s2 === s3) // false
// Symbol.for 创建
let s4 = Symbol.for('hh')
let s5 = Symbol.for('hh')
console.log(s4,tyoeof s4) // Symbol('hh') "symbol"
console.log(s4 === s5) // true
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# Symbol创建对象属性
// 向对象添加方法 up down
let game = {
}
// 不确定game对象里面,是否跟我即将创建方法的名字冲突
// 可以使用Symbol
let methods = {
up:Symbol(),
down:Symbol()
}
game[methods.up] = function(){
}
game[methods.down] = function(){
}
// 为youxi添加独一无二的方法
let youxi = {
name:"hh",
[Symbol('say')]:function(){
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Symbol内置值
Symbol.hasInstance
用于判断某对象是否为某构造器的实例,当其他对象使用instanceof
运算符判断。
class Person{
static [Symbol.hasInstance](param){
console.log(param)
console.log("我被用来检测类型")
}
}
let o = {}
console.log(o instanceof Person) // false //我被用来检测类型
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
**Symbol.isConcatSpreadable
**用于配置某对象作为Array.prototype.concat()
(opens new window)方法的参数时是否展开其数组元素。
const arr = [1,2,3]
const arr2 = [4,5,6]
arr2[Symbol.isConcatSpreadable] = false
console.log(arr.concat(arr2 ))
1
2
3
4
2
3
4
**Symbol.unscopables
**该对象指定了使用 with 关键字时,哪些属性会被 with环境排除。
**Symbol.match
**当执行str.match(myObject)
时,如果该属性存在,会调用它,返回该方法的返回值。
Symbol.replace
当该对象被str.replace(myObject)
方法调用时,会返回该方法的返回值。
Symbol.search
当该对象被 str.search (myObject)
方法调用时,会返回该方法的返回值。
**Symbol.split
**当该对象被 str.split (myobject)
方法调用时,会返回该方的返回值。
上次更新: 2024/08/14, 04:14:33