一、Symbol数据类型
1.创建symbol
// 1.用Symbol创建
let symbol = Symbol()
console.log(symbol, typeof symbol); //Symbol() 'symbol'
let name1 = Symbol('张三')
let name2 = Symbol('张三')
console.log(name1, name2); //Symbol(张三) Symbol(张三)
console.log(name1 === name2); //false
// 2.用Symbol.for()创建
let name3 = Symbol('张三')
let name4 = Symbol('张三')
console.log(name3, name4); //Symbol(张三) Symbol(张三)
console.log(name3 === name4); //true
2.不能与其他数据进行运算;
3.使用场景:给对象添加属性和方法
符号属性,不能被常规方法所遍历,内部私有属性
let obj = {
name: '张三',
[Symbol('say')]: function() {
console.log('你好');
},
[Symbol('run')]: function() {
console.log('跑');
}
}
console.log(obj);
4.Symbol内置值
Symbol.hasInstance | 当其他对象使用instanceof 运算符,判断是否为该对象的实例时,会调用这个方法 |
Symbol.isConcatSpreadable | 对象的Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。 |
Symbol.unscopables | 该对象指定了使用with关键字时,哪些属性会被with环境排除。 |
Symbol.match | 当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。 |
Symbol.replace | 当该对象被str.replace(myObject)方法调用时,会返回该方法的返回值。 |
Symbol.search | 当该对象被str. search (myObject)方法调用时,会返回该方法的返回值。 |
Symbol.split | 当该对象被str. split (myObject)方法调用时,会返回该方法的返回值。 |
Symbol.iterator | 当需要对一个对象进行迭代时(比如开始用于一个for..of 循环中),会调用Symbol.iterator方法,返回该对象的默认遍历器 |
// 知名符号
// 1.
function A() {}
const obj = new A()
console.log(obj instanceof A)
Object.defineProperty(A, Symbol.hasInstance, {
value: function(o) {
console.log(o)
return 0
}
})
console.log(obj instanceof A)
// 2.
const arr = [3]
const arr2 = [4, 5, 6]
arr[Symbol.isConcatSpreadable] = false;
arr2[Symbol.isConcatSpreadable] = false;
const result = arr.concat(arr2)
console.log(result)
const arr = [1]
const obj = {
0: 3,
1: 5,
length: 2,
// [Symbol.isConcatSpreadable] : true
}
const result = arr.concat(99, obj, "qwe")
console.log(result)
// 3
const obj = {
a: 1,
b: 2
}
obj[Symbol.toPrimitive] = function() {
return 123
}
console.log(obj + 123)
// 4.
class Person {
[Symbol.toStringTag] = "Person"
}
const p = new Person()
console.log(p)
const arr = [1, 2, 3]
console.log(Object.prototype.toString.call(arr))
console.log(p.toString())