1、定义
symbol类型是新的原始数据类型,表示独一无二的值,其余的原始数据类型还有Number,String,Boolean,Null,Undefined;Object属于复杂数据类型。函数
2、参数code
一、Symbol函数接受字符串做为参数,控制台输出时,比较容易区分。orm
二、Symbol函数的参数仅表示Symbol值得描述,相同的参数返回值也不同对象
var a = Symbol('a'); var b = Symbol('a'); a === b //false
三、Symbol.for()能够生成同一个Symbol值。字符串
请输入代码
var a = Symbol.for('a'); var b = Symbol.for('a'); a === b //true
Symbol.for()生成的名字是全局环境的,能够在不一样的iframe中给取到值。get
3、Symbol值做为对象
一、Symbol值做为属性名时不能使用点运算
二、定义属性时,必须放在方括号内,与普通键值进行区分。iframe
var a = Symbol('a'); var obj = { a: 'normal key', [a]: 'symbol key' }
三、Symbol值定义的属性属于公开属性,普通方法没法遍历。io
//如上例 Obj.getOwnProperty() //['a'] Obj.getOwnPropertySymbols() //[Symbol('a')] Refelect.ownKeys() // ['a', Symbol('a')]
四、利用Symbol的特性可定义内部私有属性或方法console
function getObj (obj) { let privateKey = symbol('privateKey'), objCopy = ...obj || {}; objCopy[privateKey] = function privateFunc () { console.log('privateFunc ') } return objCopy; } let newObj = getObj(); newObj[privateKey] // 报错,外部没法获取到privateKey的值 newObj[symbol('privateKey')] //undefined,此时的symbol已经变成新的symbol值
3、注意点
一、Symbol值不能进行隐式转换,所以它与其余类型的值进行运算,会报错。function
二、Symbol值可显示地转换成字符串。
var a = Symbol('a'); a.toString() // 'Symbol(a)'
三、能够显示或隐式转成Boolen,却不能转成数值。
var a = Symbol('a'); Boolean(a) //true if (a) { console.log(a); } //Symbol('a') 打印出来地Symbol值会带上参数,便于区分