定义对象的8个属性

Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象
参数 enumerable 是否可枚举

  1. const player = {
  2. name: 'Allen Iverson',
  3. [Symbol('birthday')]: '1975/06/07',
  4. };
  5. //往player对象上添加新属性
  6. Object.defineProperties(player, {
  7. //不可枚举
  8. isHallofFame: {
  9. enumerable: false,
  10. value: true,
  11. },
  12. //不可枚举的symbol属性
  13. [Symbol('ScoreKingTime')]: {
  14. enumerable:false,
  15. value: 4,
  16. },
  17. });
  18. //往对象原型上添加属性
  19. Object.defineProperties(player.__proto__, {
  20. //原型上可枚举
  21. university: {
  22. enumerable: true,
  23. value: 'Georgetown',
  24. },
  25. //原型上可枚举
  26. team: {
  27. enumerable: false,
  28. value: '76ers',
  29. },
  30. //原型上的Symbol可枚举
  31. [Symbol('country')]: {
  32. enumerable: true,
  33. value: 'USA',
  34. },
  35. //原型上的Symbol不可枚举
  36. [Symbol('hometown')]: {
  37. enumerable: false,
  38. value: 'Virginia',
  39. },
  40. });

如上述代码所示,定义了一个 player 的对象,其共有以下 8 个属性:

原型属性 可枚举 Symbol 属性
name Allen Iverson
birthday 1975/06/07
isHallofFame true
ScoreKingTime 4
university Georgetown
team 76ers
country USA
hometown Virginia

通过控制台的输出观察也更直观:
对象方法 - 图1
其中浅颜色的属性都是不可枚举的属性,proto下的属性则为其原型上(即 Object.prototype)的属性,Symbol 类型的值自然为 Symbol 属性

判断

1.in 判断是否包含

image.png

2.Object.is判断两个值是否完全相等

  1. console.log(Object.is(120, 120));// true
  2. console.log(Object.is(-0, 0));// false
  3. console.log(Object.is(NaN, NaN));// true
  4. console.log(NaN === NaN);// false

合并

1.Object.assign

  1. const config1 = {
  2. name: 'Dan',
  3. age: '20',
  4. hobby:'sing'
  5. };
  6. const config2 = {
  7. name: 'Amanda',
  8. age: '25'
  9. }
  10. //{name: "Amanda", age: "25", hobby: "sing"}
  11. console.log(Object.assign(config1, config2));

2.展开运算符…

  1. let obj1 = { name: 'Kobe', age: 17 }
  2. let obj2 = { age: 18 }
  3. let obj3 = {...obj1,...obj2}
  4. console.log(obj3) // {name: 'Kobe', age: 18}

迭代

1.for in

  1. 遍历的属性,包含自身以及原型上所有可枚举的属性,不包含 Symbol 属性
  2. 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

  1. <a name="ReG8U"></a>
  2. ## 2.Object.keys和Object.values 和 Object.entries
  3. **可遍历对象自身可枚举属性(不含以Symbol类型为key的属性),不会遍历原型链上的属性**, 适合搭配forEach, for of等数组遍历方法使用
  4. <a name="lPUxL"></a>
  5. ### Object.keys()
  6. 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 [for...in](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...in) 循环遍历该对象时返回的顺序一致<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1624878/1624979695849-fd6b33bb-6196-4e65-bf25-bb8a9b83a564.png#clientId=u8f7942cd-9fb5-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ub5886e73&margin=%5Bobject%20Object%5D&name=image.png&originHeight=280&originWidth=654&originalType=url&ratio=2&rotation=0&showTitle=false&size=20972&status=done&style=none&taskId=uc80ee793-d38d-4bb2-9ebf-3689ff09574&title=)
  7. <a name="UfEGf"></a>
  8. ### Object.values()
  9. 方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用[for...in](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...in)循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。 <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1624878/1624979756074-18967ff5-ffec-4432-bf7a-81b58cad52cb.png#clientId=u8f7942cd-9fb5-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=RcjCD&margin=%5Bobject%20Object%5D&name=image.png&originHeight=151&originWidth=766&originalType=url&ratio=2&rotation=0&showTitle=false&size=12119&status=done&style=none&taskId=u838d0ae1-6c51-4a05-8150-447fca494ab&title=)
  10. <a name="uvPQH"></a>
  11. ### Object.entries()
  12. 方法返回一个给定对象自身可遍历属性 [key,value] 的数组 <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1624878/1624980048623-1cde0500-bcd5-45dd-85da-693b6c4f4074.png#clientId=u8f7942cd-9fb5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=217&id=u6b707cd1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=375&originWidth=1202&originalType=binary&ratio=2&rotation=0&showTitle=false&size=101866&status=done&style=none&taskId=u6784d39f-22cd-4c37-b5b1-59cb6095d97&title=&width=693.9942626953125)
  13. <a name="SEJnN"></a>
  14. ### 结合 for of 遍历
  15. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/1624878/1644995684732-28736505-db38-4db2-9e73-6752ab071156.png#clientId=u4169e8dc-7424-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=298&id=u0f4eae55&margin=%5Bobject%20Object%5D&name=image.png&originHeight=277&originWidth=506&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24879&status=done&style=none&taskId=u00424771-ced3-4483-890c-9a7c8b846b7&title=&width=543.6666564941406)
  16. <a name="VUnqy"></a>
  17. # 其他
  18. <a name="KoTeL"></a>
  19. ## Object.getOwnPropertyDescriptors
  20. 该方法返回指定对象所有自身属性的描述对象
  21. ```javascript
  22. const school = {
  23. name:"尚硅谷",
  24. cities:['北京','上海','深圳'],
  25. xueke: ['前端','Java','大数据','运维']
  26. };
  27. //对象属性的描述对象
  28. console.log(Object.getOwnPropertyDescriptors(school));
  29. //上边方法返回如下创建对象时设置属性特性,用于深拷贝
  30. const obj = Object.create(null, {
  31. name: {
  32. //设置值
  33. value: '尚硅谷',
  34. //属性特性
  35. writable: true,
  36. configurable: true,
  37. enumerable: true
  38. }
  39. });
  40. console.log(obj)

image.png

Object.setPrototypeOf 设置原型对象 Object.getPrototypeof

  1. const school = {
  2. name: '尚硅谷'
  3. }
  4. const cities = {
  5. xiaoqu: ['北京','上海','深圳']
  6. }
  7. Object.setPrototypeOf(school, cities);
  8. console.log(Object.getPrototypeOf(school));
  9. console.log(school);