一看就懂-关于ES6的 Symbol

2020-02-13  本文已影响0人  前端老邹_伯通

刚才有同学问到 Symbol ,于是写了一下,希望对各位英雄好汉们有帮助:

一、介绍Symbol

let usrType = {
  student : Symbol(), // 想象返回Symbol对象  { guid:'c74d75a8-fcf0-46e9-a182-75c253950507' }
  coder : Symbol(),// 想象返回Symbol对象  { guid:'8c0633ea-b2e8-49c6-ac50-979a787762a8' }
  painter : Symbol()// 想象返回Symbol对象  { guid:'16e6d2cf-e8ec-4cc8-b510-6a4402b59bce' }
}

// 打印时 无法 直接打印出 标示值(guid),只能打印 类型名为 Symbol
console.log(usrType.student); // Symbol()
console.log(usrType.coder); // Symbol()
console.log(usrType.painter); // Symbol()

二、标识注释

let usrType = {
    student: Symbol('student'),
    // 想象返回Symbol对象  { guid:'c74d75a8-fcf0-46e9-a182-75c253950507' , note:'student' }

    student2: Symbol('student'),
    // 想象返回Symbol对象  { guid:'44fbe8aa-7ae3-465c-94ab-ee8c23cfdb3d' , note:'student' }
    // 【注意】虽然 传入的 标识注释 也是 student ,但 生成的 guid 和 上一个 不一样!

    coder: Symbol('coder'),
    // 想象返回Symbol对象  { guid:'7906b281-f0e0-44c3-93e9-8ea358eddfa3' , note:'coder' }

    painter: Symbol('painter') 
    // 想象返回Symbol对象  { guid:'93a0612c-74a4-4de5-a3a4-2c828bf9ea9d' , note:'painter' }
}

// 1. 打印时 无法 直接打印出 标示值,但可以打印出 “注释”----------------
console.log(usrType.student); // Symbol(student)
console.log(usrType.student2); // Symbol(student)
console.log(usrType.coder); // Symbol(coder)
console.log(usrType.painter); // Symbol(painter)

// 2.对比 标识 的值是否相等 ---------------------------------------------
// 一个属性 中 保存的 标识 是同一个,所以 true
console.log(usrType.student == usrType.student); // true
//相当于 'c74d75a8-fcf0-46e9-a182-75c253950507'=='c74d75a8-fcf0-46e9-a182-75c253950507'  // true

// 哪怕是两个 “注释” 相等的 标识,标识值 也不相等,所以 false
console.log(usrType.student == usrType.student2); // false
//相当于 'c74d75a8-fcf0-46e9-a182-75c253950507'=='44fbe8aa-7ae3-465c-94ab-ee8c23cfdb3d'  // false

// 不同属性 中 保存的 标识 不相同,所以 false
console.log(usrType.student == usrType.coder); // false
//相当于 'c74d75a8-fcf0-46e9-a182-75c253950507'=='7906b281-f0e0-44c3-93e9-8ea358eddfa3'  // false

三、重复使用Symbol

let a = Symbol.for('dog');
//【第1次】使用 dog 标识注释,相当于创建了
//                 Symbol对象{ guid:'c155a688-7b9a-40a2-99c3-67dd19f532ca' , note:'dog' }

let b = Symbol.for('dog'); 
//【第2次】使用 dog 标识注释,会返回 第1次创建的 
//                Symbol对象{ guid:'c155a688-7b9a-40a2-99c3-67dd19f532ca' , note:'dog' }

// 所以:比较 两个变量中的 标识值,返回 true,因为是同一个 标识对象
console.log(a === b); // true
// 相当于 比较 两个 guid  
//  'c155a688-7b9a-40a2-99c3-67dd19f532ca' == 'c155a688-7b9a-40a2-99c3-67dd19f532ca' -> true
let a = Symbol.for('dog');
let note = Symbol.keyFor(a);
console.log(note); // 'dog'

参考资料:http://es6.ruanyifeng.com/#docs/symbol

上一篇 下一篇

猜你喜欢

热点阅读