定义对象的8个属性
Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象
参数 enumerable 是否可枚举
const player = {name: 'Allen Iverson',[Symbol('birthday')]: '1975/06/07',};//往player对象上添加新属性Object.defineProperties(player, {//不可枚举isHallofFame: {enumerable: false,value: true,},//不可枚举的symbol属性[Symbol('ScoreKingTime')]: {enumerable:false,value: 4,},});//往对象原型上添加属性Object.defineProperties(player.__proto__, {//原型上可枚举university: {enumerable: true,value: 'Georgetown',},//原型上可枚举team: {enumerable: false,value: '76ers',},//原型上的Symbol可枚举[Symbol('country')]: {enumerable: true,value: 'USA',},//原型上的Symbol不可枚举[Symbol('hometown')]: {enumerable: false,value: 'Virginia',},});
如上述代码所示,定义了一个 player 的对象,其共有以下 8 个属性:
| 原型属性 | 可枚举 | Symbol 属性 | 值 | |
|---|---|---|---|---|
| name | 否 | 是 | 否 | Allen Iverson |
| birthday | 否 | 是 | 是 | 1975/06/07 |
| isHallofFame | 否 | 否 | 否 | true |
| ScoreKingTime | 否 | 否 | 是 | 4 |
| university | 是 | 是 | 否 | Georgetown |
| team | 是 | 否 | 否 | 76ers |
| country | 是 | 是 | 是 | USA |
| hometown | 是 | 否 | 是 | Virginia |
通过控制台的输出观察也更直观:
其中浅颜色的属性都是不可枚举的属性,proto下的属性则为其原型上(即 Object.prototype)的属性,Symbol 类型的值自然为 Symbol 属性
判断
1.in 判断是否包含
2.Object.is判断两个值是否完全相等
console.log(Object.is(120, 120));// trueconsole.log(Object.is(-0, 0));// falseconsole.log(Object.is(NaN, NaN));// trueconsole.log(NaN === NaN);// false
合并
1.Object.assign
const config1 = {name: 'Dan',age: '20',hobby:'sing'};const config2 = {name: 'Amanda',age: '25'}//{name: "Amanda", age: "25", hobby: "sing"}console.log(Object.assign(config1, config2));
2.展开运算符…
let obj1 = { name: 'Kobe', age: 17 }let obj2 = { age: 18 }let obj3 = {...obj1,...obj2}console.log(obj3) // {name: 'Kobe', age: 18}
迭代
1.for in
- 遍历的属性,包含自身以及原型上所有可枚举的属性,不包含 Symbol 属性。
- for…in遍历原型所以性能低, 而for … of方法只返回数组的下标对应的属性值,可使用for … of + Object.xx代替for…in ```javascript // 同时遍历出原型上的 for(const name in player) { console.log(‘name:’, name); } // name: name // name: university
//如果我们不需要原型上的属性 for(const name in player) { if (Object.prototype.hasOwnProperty.call(player, name)) { console.log(‘name:’, name); } } // name: name
<a name="ReG8U"></a>## 2.Object.keys和Object.values 和 Object.entries**可遍历对象自身可枚举属性(不含以Symbol类型为key的属性),不会遍历原型链上的属性**, 适合搭配forEach, for of等数组遍历方法使用<a name="lPUxL"></a>### Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 [for...in](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...in) 循环遍历该对象时返回的顺序一致<br /><a name="UfEGf"></a>### Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用[for...in](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...in)循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。 <br /><a name="uvPQH"></a>### Object.entries()方法返回一个给定对象自身可遍历属性 [key,value] 的数组 <br /><a name="SEJnN"></a>### 结合 for of 遍历<a name="VUnqy"></a># 其他<a name="KoTeL"></a>## Object.getOwnPropertyDescriptors该方法返回指定对象所有自身属性的描述对象```javascriptconst school = {name:"尚硅谷",cities:['北京','上海','深圳'],xueke: ['前端','Java','大数据','运维']};//对象属性的描述对象console.log(Object.getOwnPropertyDescriptors(school));//上边方法返回如下创建对象时设置属性特性,用于深拷贝const obj = Object.create(null, {name: {//设置值value: '尚硅谷',//属性特性writable: true,configurable: true,enumerable: true}});console.log(obj)
Object.setPrototypeOf 设置原型对象 Object.getPrototypeof
const school = {name: '尚硅谷'}const cities = {xiaoqu: ['北京','上海','深圳']}Object.setPrototypeOf(school, cities);console.log(Object.getPrototypeOf(school));console.log(school);
