Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ES6复习-Symbol #22

Open
Jsmond2016 opened this issue Mar 20, 2022 · 0 comments
Open

ES6复习-Symbol #22

Jsmond2016 opened this issue Mar 20, 2022 · 0 comments
Labels
面试 面试题系列

Comments

@Jsmond2016
Copy link
Owner

写在前面: ES6中对象的属性名都是字符串,容易造成重名,污染环境。

Symbol 的特点:

  • Symbol 属性的值时唯一的,解决命名冲突问题
  • Symbol 值不能与其他数据进行计算,包括字符串拼接
  • for in, for of 不会遍历 Symbol 属性

注意:Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。

Symbol 的使用

  • 调用Symbol函数得到symbol值
let symbol = Symbol();
let obj = {};
obj[symbol] = 'hello';
  • 传参标识
let symbol = Symbol('one');
let symbol2 = Symbol('two');
console.log(symbol);// Symbol('one')
console.log(symbol2);// Symbol('two')
  • 内置Symbol值
    • 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
    • Symbol.iterator 迭代器的使用
    • 对象的Symbol.iterator属性
// 当使用 for...of 去遍历某个数据结构的时候,首先去找 Symbol.iterator 接口
 // 若 找到了就去遍历,否则返回 TypeErr: xxx is not iterator
 const data = {
   0: 'Tom',
   1: 18,
   length: 2,
   [Symbol.iterator]: function() {
     let nextIndex = 0
     return {
       next: function() {
         return nextIndex < this.length ? {
           value: this[nextIndex++],
           done: false
         } : 
         {
           value: undefined,
           done: true
         }
       }
     }
   }
 }

参考资料:

@Jsmond2016 Jsmond2016 added the 面试 面试题系列 label Mar 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
面试 面试题系列
Projects
None yet
Development

No branches or pull requests

1 participant