-
Notifications
You must be signed in to change notification settings - Fork 54
Symbol对象是什么 #17
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
Comments
定义 const GETLIST_SUCCESS = Symbol(); |
@yozman 为什么呢。 传不传 string,symbol 都是唯一的。string 增加了可读性 |
@sunyongjian const ACTION_TYPE_NAME = 'ACTION_TYPE_NAME'; 这种愚蠢的代码。 |
@yozman 嗯。确实, string 不是必要的。我说的可读只是因为变量名是大写的不好辨认 😓 |
@sunyongjian |
const GETLIST_SUCCESS = Symbol(); |
Uh oh!
There was an error while loading. Please reload this page.
Symbol对象
概念
Symbol() function 返回一个类型为symbol的值,Symbol有静态属性,原型上也有methods,但是缺少constructor,所以你不能
new Symbol()
来执行;类型
唯一性
new关键字
获取symbol类型值的三种方式
通过Symbol对象
Symbol.for(string)
Symbol.iterator
由于这个值是标准规范提出,用于每个object中,所以应该是固定的值。
用途
栗子。像我们项目中大量的使用常量定义字符串,尤其是react+redux的项目中,我觉得用Symbol就不错。
作为对象的key
对象[]方括号的形式
对象内部定义
通过Object.defineProperty定义
通过上述三种方式,我们就可以向对象添加key不会重复的symbol值了。意味着我们可以创建非字符串类型的属性名称,以防止使用常规手段来探查这些名称。
symbol类型的key的遍历
内置的Symbol值
Symbol.iterator属性
我觉得是最重要的属性,它的提出使对象可以使用迭代器遍历,之前只有Array,String等,这种内置Symbol.iterator属性的可以使用迭代器。ECMAScript旨在使JS中使用一种方法,比如
for...of
就可以遍历序列数据,不需要关注它内部的数据结构。其实就是JS往C,JAVA语言靠拢的趋势吧。为了避免此部分过于重,我们后面会专门研究迭代器和生成器。
Symbol.hasInstance
先看看下面的代码,猜想输出什么?
序号(1) MyClass类上有静态方法[Symbol.hasInstance], 1被当做参数传入function,返回结果false。 序号(2)同理,true。

序号(3) 后面是实例化的对象,通过原型链查找到原型上[Symbol.hasInstance],然后传入2执行,true。序号(4)是普通对象内部存在这个方法,执行返回false。
Symbol.match
Symbol.replace
(划重点) 这里我们模拟了一个Reg对象,str调用replace的时候,第一个参数本是reg实例,而JS内置的class RegExp 上有[Symbol.replace],才调用对用方法。我们传入一个我们模拟的Reg的实例,而这个实例的所属类的原型,也有[Symbol.replace],所以就调用了我们定义的方法。console得以打印。
Symbol.split, Symbol.search以以上两个都是字符串中与正则有密切联系的,因为他们的参数都可以是正则表达式。具体代码我就不列举了。
Symbol.isConcatSpreadable
应该还是比较好理解的。
Symbol.toStringTag
Symbol.unscopables
这些es6的关键字都会被with环境排除,假如说有values的变量,不会访问到数组原型上。不过我几乎不用with,只做了解吧...
Symbol.toPrimitive
推荐去了解一下js中的强势类型转换和运算符的自动转换。
Symbol.species
推荐阅读加深理解
iterator会在接下来的清明假期详细研究,新开一个md,包括Iteration protocols,iterable,iterator,generator这些概念。
The text was updated successfully, but these errors were encountered: