一、定义
symbol类型是新的原始数据类型,表示独一无二的值,其他的原始数据类型还有Number,String,Boolean,Null,Undefined;Object属于复杂数据类型。
二、参数
1、Symbol函数接受字符串作为参数,控制台输出时,比较容易区分。
2、Symbol函数的参数仅表示Symbol值得描述,相同的参数返回值也不一样
var a = Symbol('a');
var b = Symbol('a');
a === b //false
3、Symbol.for()可以生成同一个Symbol值。
请输入代码
var a = Symbol.for('a');
var b = Symbol.for('a');
a === b //true
Symbol.for()生成的名字是全局环境的,可以在不同的iframe中给取到值。
三、Symbol值作为对象
1、Symbol值作为属性名时不能使用点运算
2、定义属性时,必须放在方括号内,与普通键值进行区分。
var a = Symbol('a');
var obj = {
a: 'normal key',
[a]: 'symbol key'
}
3、Symbol值定义的属性属于公开属性,普通方法无法遍历。
//如上例
Obj.getOwnProperty() //['a']
Obj.getOwnPropertySymbols() //[Symbol('a')]
Refelect.ownKeys() // ['a', Symbol('a')]
4、利用Symbol的特性可定义内部私有属性或方法
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值
三、注意点
1、Symbol值不能进行隐式转换,因此它与其他类型的值进行运算,会报错。
2、Symbol值可显示地转换成字符串。
var a = Symbol('a');
a.toString() // 'Symbol(a)'
3、可以显示或隐式转成Boolen,却不能转成数值。
var a = Symbol('a');
Boolean(a) //true
if (a) {
console.log(a);
} //Symbol('a') 打印出来地Symbol值会带上参数,便于区分
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。