symbol
声名定义symbol
let smb = Symbol( );
let smb2 = Symbol( );
console.log( smb == smb2 ); => false
//symbol数据类型是不重复的,也不相等(类似于唯一的字符串)
let smb = Symbol('symbol数据的描述');
console.log(smb.description); => symbol数据的描述
//可以在Symbol的()内添加对数据的描述,并使用symbol.description来读取描述
smb1 = Symbol.for('csdn');
smb2 = Symbol.for('csdn');
console.log('smb1 == smb2'); => true
//也可以使用Symbol.for定义symbol数据,并且该方法会于内存中存储其symbol值
//当再次使用该symbol值时(同一描述),系统会自动调用存储的symbol
symbol.keyfor()
let csdn = Symbol.for('csdn');
console.log(csdn); => csdn
let smb = Symbol('github');
console.log(smb) => undefined
//只有使用Symbol.for()定义的symbol可以使用Symbol.keyfor( )方法取得它的描述
symbol的使用
let grade = {
'张三' : { js:80, css: 90 },
'张三' : { js:90, css: 70 }
}
console.log(grade); => { '张三' : { js:90, css: 70 } }
//因为对象中的key有重复,故在读取时会覆盖前面的属性
let user1 = { name:'张三', key: Symbol() };
let user2 = { name:'李四', key:Symbol() };
let grade = {
[user1.key]: { js:90, css:70 },
[user2.key]: { js:80, css:80 },
};
console.log([ user2.key ]); => { js:80, css:80 }
//为了避免对象中键名的重复,可以使用Symbol作为键名
symbol的遍历
let symbol = Symbol("这是一个Symbol属性");
let csdn = {
name:'csdn',
[ symbol ]; 'csdn.com'
}
for ( const key in csdn ) {
console.log(key);
}
for ( const key of Object.keys(csdn) ) {
console.log(key);
}
=> name
//for in和for of都无法遍历以symbol作为键名的属性
for( const key of Object.getOwnPropertySymbol(csdn) ) {
console.log(key);
}
=> Symbol("这是一个Symbol属性")
//该方法只能遍历对象的symbol属性,但是普通属性是无法遍历的
for( const key of Reflect.ownKeys(csdn) ) {
console.log(key);
}
=> name
Symbol("这是一个Symbol属性")
//该方法则可以遍历对象的所有属性,包含symbol及普通属性
故可以使用symbol对对象的属性进行保护
let site = Symbol("这是一个Symbol");
class User {
consrtuctor(name) {
this.name = name;
this[site] = 'csdn';
}
}
let lisi = new User('李四');
for( const key in lisi ) {
console.log(key);
}
=> name