1.in关键字
作用:检测属性是否存在对象中,可以使用in关键字来检测当前对象是否某个属性
const person = { name: '小爱', salary: 23 };
console.log('salary' in person); // true
console.log('sex' in person); // false
2.['key name']
作用:使用['key name']来设置对象的属性
const dyn = 'flavour';
var item = {
name: '小爱',
[dyn]: '草莓'
}
console.log(item); // { name: '小爱', flavour: '草莓' }
// 使用动态键来引用对象属性
const keyName = 'name';
console.log(item[keyName]); // returns '小爱'
3.Symbol符号
3.1 简解
是ES6新增的一种普通数据类型为符号Symbol,本质是一种数据
3.2 作用
符号的设计,是给对象增加的私有属性,只能在对象内部才能被访问到的一种方法
3.3 特点
1.没有字面量的创建方式,只有Symbol() 这种方式来创建
2.新增的数据类型,typeOf 返回的结果为Symbol
3.每次调用 Symbol 函数 得到的符号永远不会相等,不管有没有符号和符号描述号或者它们两个是一模一样的。
4.符号可以作为对象的属性名使用,这种属性名叫做符号属性
5.由Symbol值作为的键名(符号属性),不会被常规方法所遍厉
const Hero = (()=>{
const getRandom = Symbol();
return class{
constructor(attack,jineng){
this.attack = attack;
this.jineng = jineng;
}
gongji(){
const dmg = this[getRandom](this.attack) * this.jineng;
console.log(dmg);
}
[getRandom](a){
return (Math.random() * 2) * a
}
}
})()
const h = new Hero(100,3)
h.gongji();
// h[getRandom](30) // 报错,因为无法在对象外部调用
const sybs = Object.getOwnPropertySymbols(Hero.prototype)[0];
console.log(h[sybs](30));
6.for...in/for....of/Object.keys()/Object.getOwnPropretyNames()/JSONP.stringify()
const syb1 = Symbol('abc');
const obj = {
a : 1,
[syb1] : 2
};
console.log(obj[syb1]);
for(const key in obj){
console.log(key)
}
console.log(Object.keys(obj))
console.log(Object.getOwnPropertyNames(obj))
// 针对符号属性的遍历获取:getOwnPropertySymbol() 返回一个数组
console.log(Object.getOwnPropertySymbols(obj));
// // 一个新的对象上的API,Reflect.ownKeys() 方法可以返回所有类型的键名,包括普通键名和Symbol键名
console.log(Reflect.ownKeys(obj));
7.符号类型无法被隐式转换,数学运算,字符串拼接