js的基本数据类型
基本类型:String
,Boolean
,Number
,Symbol
,Undefind
,Null
;
引用类型:Array
,Object
,Function
;
Symbol
- 什么是Symbol?
- 是js语言的一种数据类型,和
String
,Number
一样。
- 是js语言的一种数据类型,和
- 为什么要用Symbol?
- Symbol的作用: ES6引入,生成一个随机的且独一无二的值
- Symbol的使用场景:Symbol 包装器对象作为属性的键; 举个栗子: 你想在一个已存在的对象中添加属性,但是不知道该对象里有哪些属性,为避免属性名命名重复,可以使用Symbol来生成一个独一无二的属性名。
- 怎么使用symbol?
- 如何生成这个值:
let a = Symbol('s11')
,或者let a = Symbol.for('s11')
Symbol()和Symbol.for()的区别,代码借鉴MDN
:Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo" Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的 Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新的一个 symbol let a = Symbol('a'); a === Symbol.for('a'); // false var sym = Symbol.for("mario"); sym.toString(); // "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串 //为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。 Symbol.for("mdn.foo"); Symbol.for("mdn.bar");
- 如何取到这个属性名:无法用
for...in
,for...of
进行属性名遍历,无法用Object.keys()
和Object.getOwnPropertyNames()
获取属性。可以用Objrect.getOwnPropertySymbols()
获取。let a = Symbol('a'); let b = Symbol('b'); let obj = {}; obj[a] = 'valueA'; obj[b] = 'valueB'; obj[Symbol('d')] = 'valueD' let objKeyList = Object.getOwnPropertySymbols(obj); console.log(objKeyList.length); // => 2 console.log(objKeyList); // => [ Symbol(a), Symbol(b) ] console.log(a===Symbol.for('a')) console.log(JSON.stringify({[Symbol('c')]:'value'})) // {} console.log(JSON.stringify(obj[Symbol('c')])) // => undefined console.log(obj[a]) // => valueA console.log(obj[Object(a)]) // => valueA console.log(obj[Symbol('d')]) // => undefined ; 因为每次Symbol()都是新生成一个值,此处的Symbol('d')和上面不是同一个
- 如何取到该属性值:上面代码
obj[a]
或obj[Object(a)]
就可以获取到属性值,变量a已经存储了固定的属性名,但如果用obj[Symbol('d')]
就会重新生成一个属性名。
- 如何生成这个值:
- 深度了解symbol(待更新)
…todo…