概述
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、Boolean、String、Number、Object
直接调用Symbol函数即可生成一个Symbol,注意Symbol函数前不能使用new命令,否则会报错。Symbol函数可以接受一个字符串作为参数,表示对 Symbol 的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分
生成Symbol
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><script>// symbol是一种新的原始数据类型是一个唯一的值// 有参数的情况下let s1 = Symbol('f00')let s2 = Symbol('f11')console.log(s1==s2); // false// 无参数let s3 = Symbol()let s4 = Symbol()console.log(s3==s4); // false/* 括号里面的参数是一种描述 */</script></body></html>
Symbol.for
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><script>// 注意这里会去找同样用for语法注册的,有就复用,没有就重新注册let s1 = Symbol.for('pp')let s2 = Symbol.for('pp')// 上面相当于 s1 = s2 的赋值console.log(s1===s2); // true</script></body></html>
使用Symbol最为对象的属性名
Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><script>let mySymbol = Symbol()// 第一种写法let a ={[mySymbol] :'Hello'}console.log(a);// 第二种let b={}Object.defineProperty(b,mySymbol,{value:'你好哇'})console.log(b);b.xx='上大学'// symbol作为属性名的时候不会被遍历 for..in fro..on object.keys() 等for (const key in b) {console.log(b[key]);}// 如果想获取的用以下方法console.log(Object.getOwnPropertySymbols(b)[0]===mySymbol); // true</script></body></html>
实现私有属性
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><script>var Person =(function(){var mySymbol = Symbol('name')function Person (name) {this[mySymbol] = name}return Person}())let obj1 =new Person('zs')console.log(obj1);// 缺陷:仍然会被Object.getOwnPropertySymbols获取到属性,进而修改该属性对应的值</script></body></html>
