Open sunyongjian opened 7 years ago
定义 redux action type
的时候
const GETLIST_SUCCESS = Symbol();
@yozman 为什么呢。 传不传 string,symbol 都是唯一的。string 增加了可读性
@sunyongjian
一般情况下为了便于查找 type
是定义在一个文件里的
由于 string
是根据变量名来的,本身就保证了唯一性
所以用不用 Symbol
是一样的,
这里用 Symbol
的好处是可以不用写
const ACTION_TYPE_NAME = 'ACTION_TYPE_NAME';
这种愚蠢的代码。 况且可读性的话,变量名已经能体现出来了。 所以在 redux action type 这种场景下我觉得是多余的
@yozman 嗯。确实, string 不是必要的。我说的可读只是因为变量名是大写的不好辨认 😓 所以我觉得 dva 不错。。。 你是怎么定义的... 这些 type
@sunyongjian 变量名可以用驼峰这方面其实没啥限制, 全套的话必须 dva 丫, 如果纯用 redux 可以配合 redux-actions, 把聚焦点从 reducer 转到了 action
const GETLIST_SUCCESS = Symbol(); 如果这样子做 实际调试工具redux打印出来的为undefined
Symbol对象
Symbol() function 返回一个类型为symbol的值,Symbol有静态属性,原型上也有methods,但是缺少constructor,所以你不能
new Symbol()
来执行;类型
new关键字
获取symbol类型值的三种方式
Symbol.for(string)
Symbol.iterator
由于这个值是标准规范提出,用于每个object中,所以应该是固定的值。
用途
栗子。像我们项目中大量的使用常量定义字符串,尤其是react+redux的项目中,我觉得用Symbol就不错。
另外,Symbol值可以做为对象的key值,这样就能保证不会出现同名的属性名,防止对象属性被覆盖。下面我们将介绍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这些概念。