sunyongjian / blog

个人博客😝😋😄
664 stars 54 forks source link

Symbol对象是什么 #17

Open sunyongjian opened 7 years ago

sunyongjian commented 7 years ago

Symbol对象

称符号对象,是es2015(也就是es6)中新添加的数据类型。通过Symbol()可以得到一个唯一的值,所以这个值很适合做标识符。

概念

Symbol() function 返回一个类型为symbol的值,Symbol有静态属性,原型上也有methods,但是缺少constructor,所以你不能new Symbol()来执行;

引用官方翻译,符号是一种特殊的、不可变的数据类型,它可以作为对象属性的标识符使用。符号对象是一个对的符号原始数据类型的隐式对象包装器。

获取symbol类型值的三种方式

用途

在我看来,symbol更多是应用于es6规范中,由于它的值唯一的特性,可以解决变量名,属性名冲突的问题,并切Symbol提出了一些属性和方法,用于过渡以及实现一些特殊的用途,比如对象的迭代器,instanceof的拓展等等。

作为对象的key

内置的Symbol值

JavaScript内建的一些在 ECMAScript 5 之前没有暴露给开发者的符号,它们代表语言的内部行为。

iterator会在接下来的清明假期详细研究,新开一个md,包括Iteration protocols,iterable,iterator,generator这些概念。

yozman commented 7 years ago

定义 redux action type 的时候

const GETLIST_SUCCESS = Symbol();
sunyongjian commented 7 years ago

@yozman 为什么呢。 传不传 string,symbol 都是唯一的。string 增加了可读性

yozman commented 7 years ago

@sunyongjian 一般情况下为了便于查找 type 是定义在一个文件里的 由于 string 是根据变量名来的,本身就保证了唯一性 所以用不用 Symbol 是一样的, 这里用 Symbol 的好处是可以不用写

const ACTION_TYPE_NAME = 'ACTION_TYPE_NAME';

这种愚蠢的代码。 况且可读性的话,变量名已经能体现出来了。 所以在 redux action type 这种场景下我觉得是多余的

sunyongjian commented 7 years ago

@yozman 嗯。确实, string 不是必要的。我说的可读只是因为变量名是大写的不好辨认 😓 所以我觉得 dva 不错。。。 你是怎么定义的... 这些 type

yozman commented 7 years ago

@sunyongjian 变量名可以用驼峰这方面其实没啥限制, 全套的话必须 dva 丫, 如果纯用 redux 可以配合 redux-actions, 把聚焦点从 reducer 转到了 action

vnues commented 5 years ago

const GETLIST_SUCCESS = Symbol(); 如果这样子做 实际调试工具redux打印出来的为undefined