Symbol 基本使用
ES6 引入了一种新的原始数据类型
Symbol
, 表示独一无二的值。它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。Symbol 特点- Symbol 的值是唯一的,用来解决命名冲突问题
- Symbol 值不能与其他数据进行运算
- Symbol 定义的对象属性不能使用 for…in 循环遍历,但是可以使用 Reflect.ownKeys 来获取对象的所有键名
// 创建 Symbol --> 内部实现了唯一性
let s = Symbol();
// console.log(s, typeof s)
let s2 = Symbol('陈朝鸿')
let s3 = Symbol('陈朝鸿')
console.log(s2)
console.log(s3)
console.log(s2 == s3) // false
// Symbol.for 创建于 Symbol 创建的区别在于 Symbol.for() 不会重复创建具有相同键的值,在创建之前会先搜索是否已有具有指定键的 Symbol 类型值,有则返回这个 Symbol 值,没有则创建一个
let s4 = Symbol.for('陈朝鸿')
let s5 = Symbol.for('陈朝鸿')
console.log(s4)
console.log(s5)
console.log(s4 === s5) // true
// 不能与其他数据进行运算和对比
let result = s > 100
// USONB
// u --> undefined
// s --> string symbol
// o --> object
// n --> null number
// b --> boolean
Symbol 内置对象
// 自己去控制类型检测
class Person{
static [Symbol.hasInstance](param) {
console.log(param)
console.log('我被用来检测类型了')
}
}
let o = {}
// console.log(typeof Person)
console.log(o instanceof Person)
// 控制合并的数组是否要展开
const arr = [1,2,3]
const arr2 = [4,5,6]
arr2[Symbol.isConcatSpreadable] = false
console.log(arr.concat(arr2))