Symbol 基本使用

  • ES6 引入了一种新的原始数据类型 Symbol, 表示独一无二的值。它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。Symbol 特点

    • Symbol 的值是唯一的,用来解决命名冲突问题
    • Symbol 值不能与其他数据进行运算
    • Symbol 定义的对象属性不能使用 for…in 循环遍历,但是可以使用 Reflect.ownKeys 来获取对象的所有键名
  1. // 创建 Symbol --> 内部实现了唯一性
  2. let s = Symbol();
  3. // console.log(s, typeof s)
  4. let s2 = Symbol('陈朝鸿')
  5. let s3 = Symbol('陈朝鸿')
  6. console.log(s2)
  7. console.log(s3)
  8. console.log(s2 == s3) // false
  9. // Symbol.for 创建于 Symbol 创建的区别在于 Symbol.for() 不会重复创建具有相同键的值,在创建之前会先搜索是否已有具有指定键的 Symbol 类型值,有则返回这个 Symbol 值,没有则创建一个
  10. let s4 = Symbol.for('陈朝鸿')
  11. let s5 = Symbol.for('陈朝鸿')
  12. console.log(s4)
  13. console.log(s5)
  14. console.log(s4 === s5) // true
  15. // 不能与其他数据进行运算和对比
  16. let result = s > 100
  17. // USONB
  18. // u --> undefined
  19. // s --> string symbol
  20. // o --> object
  21. // n --> null number
  22. // b --> boolean

Symbol 内置对象

  1. // 自己去控制类型检测
  2. class Person{
  3. static [Symbol.hasInstance](param) {
  4. console.log(param)
  5. console.log('我被用来检测类型了')
  6. }
  7. }
  8. let o = {}
  9. // console.log(typeof Person)
  10. console.log(o instanceof Person)
  11. // 控制合并的数组是否要展开
  12. const arr = [1,2,3]
  13. const arr2 = [4,5,6]
  14. arr2[Symbol.isConcatSpreadable] = false
  15. console.log(arr.concat(arr2))