Object的常用api

Object.assign()

语法

Object.assign(target, ...sources)

参数

target目标对象,接收源对象属性的对象,也是修改后的返回值。
sources源对象,包含将被合并的属性。

返回值

目标对象

描述

  1. 如果key相同,后面的会覆盖目标对象
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);//{a: 1, b: 4, c: 5}
console.log(returnedTarget);//{a: 1, b: 4, c: 5}

image

  1. 拷贝问题(最好不要再对象里套对象)
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}

obj1.a = 1;
console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}

obj2.a = 2;
console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 0}}

obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 3}}
console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}}

// Deep Clone
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
console.log(JSON.stringify(obj3));
  1. 合并具有相同属性的对象(属性会被后续参数中具有相同属性的其他对象覆盖。)
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };

const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
  1. 原型链上的属性和不可枚举属性不能被复制
const obj = Object.create({ foo: 1 }, {
  bar: {
    value: 2
  },
  baz: {
    value: 3,
    enumerable: true
  }
});

const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }

image

Object.entries()

语法

Object.entries(obj)

参数

obj:可以返回其可枚举属性的键值对的对象

返回值

给定对象自身可枚举属性的键值对数组

示例

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]

const myObj = Object.create({}, { getFoo: { value() { return this.foo; } } });
myObj.foo = 'bar';
console.log(Object.entries(myObj)); // [ ['foo', 'bar'] ]

console.log(Object.entries('foo')); // [ ['0', 'f'], ['1', 'o'], ['2', 'o'] ]

const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}

Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});

Object.fromEntries()

语法

Object.fromEntries(iterable)

参数

iterable:可类似 Array 、 Map 或者其它实现了可迭代协议的可迭代对象

返回值

一个由该迭代对象条目提供对应属性的新对象Object.fromEntries() 执行与 Object.entries 互逆的操作。

示例

const arr = [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ];
const obj = Object.fromEntries(arr);
console.log(obj); // { 0: "a", 1: "b", 2: "c" }

Object.keys()

语法

Object.keys(obj)

参数

obj:可以返回其可枚举属性的对象

返回值

给定对象自身可枚举属性的字符串数组

示例

// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']

// getFoo is a property which isn't enumerable
var myObj = Object.create({},{
  getFoo: {
    value: function () { return this.foo; }
  }
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']

image

Object.values()

语法

Object.values(obj)

参数

obj:可以返回其可枚举属性的对象

返回值

给定对象自身可枚举属性值的数组

示例

var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]

var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']

var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = 'bar';
console.log(Object.values(my_obj)); // ['bar']

console.log(Object.values('foo')); // ['f', 'o', 'o']

image

Object.create()

语法

Object.create(proto, propertiesObject)

参数

proto:已有的对象,作为新创建对象的原型对象
propertiesObject:(可选)对应于 Object.defineProperties() 的第二个参数

返回值

一个新对象,带着指定的原型对象及其属性。

示例

let cars = {
    name: '车名',
    fn: function () {
      console.log(this.name, this.price)
    }
  }
  let car1=Object.create(cars)
  car1.price=123
  car1.name='玛莎拉蒂'
  car1.fn()
  console.log(car1)

image

  let cars = {
    name: '车名',
    fn: function () {
      console.log(this.name, this.price)
    }
  }
  let car1 = Object.create(cars, {
    'price': {
      value: 23,
      writable: true,
      configurable: true,
      enumerable: true//可枚举
    },
    'name': {
      configurable: false,
      get: function() { return '玛莎拉蒂'; },
    }
  })
  car1.fn()
  console.log(car1)
  console.log(Object.assign({}, car1))

image

Object.defineProperties()

语法

Object.defineProperties(obj, props)

参数

obj:要定义或修改属性的对象
props:要定义其可枚举属性或修改的属性描述符的对象,(包含configurable、enumerable、value、writable、get、set;下面方法介绍)。

返回值

传递给函数的对象

示例

 let aa={a:121}
  Object.defineProperties(aa,{
    'a':{
      value:1
    },
    'c':{
      value:'c',
      enumerable:true
    },
    'b':{
      get(){
        return 'b'
      }
    }
  })
  console.log(aa)

image

Object.defineProperty()

语法

Object.defineProperty(obj, prop, descriptor)

参数

obj:要定义或修改属性的对象
prop:要定义或修改的属性的名称或 Symbol
descriptor:要定义或修改的属性描述符。(包含configurable、enumerable、value、writable、get、set)

  1. writable:当 writable 属性设置为 false 时,该属性被称为“不可写的”。它不能被重新赋值。默认为false,不能重新赋值。
    let oo = {}; // 创建一个新对象
    Object.defineProperty(oo, 'a', {
      value: 37,
      writable: false
    });
    Object.defineProperty(oo, 'b', {
      value: 'b',
      writable: true
    });
    oo.a=32424
    oo.b=32424
    console.log(oo.a,oo.b)//37  32424
  1. enumerable: 定义了对象的属性在 for...in 循环和 Object.keys() 中是否可以被枚举。默认为false,不能枚举。
  let bb = {b:22}; // 创建一个新对象
  Object.defineProperty(bb, 'a', {
    value: 37,
    enumerable: false
  });
  Object.defineProperty(bb, 'c', {
    value: 'c',
    enumerable: true
  });
  console.log(Object.assign({}, bb))//{b: 22, c: 'c'}
  1. configurable:表示对象的属性是否可以被删除,以及除 value 和 writable 特性外的其他特性是否可以被修改。
var o = {};
Object.defineProperty(o, 'a', {
  get() { return 1; },
  configurable: false
});

Object.defineProperty(o, 'a', {
  configurable: true
}); // throws a TypeError
Object.defineProperty(o, 'a', {
  enumerable: true
}); // throws a TypeError
Object.defineProperty(o, 'a', {
  set() {}
}); // throws a TypeError (set was undefined previously)
Object.defineProperty(o, 'a', {
  get() { return 1; }
}); // throws a TypeError
// (even though the new get does exactly the same thing)
Object.defineProperty(o, 'a', {
  value: 12
}); // throws a TypeError // 当“configurable”为false时,可以更改“value”,但在这种情况下,由于“get”访问器的原因,不能更改“value”

console.log(o.a); // logs 1
delete o.a; // Nothing happens
console.log(o.a); // logs 1

//如果 o.a 的 configurable 属性为 true,则不会抛出任何错误,并且,最后,该属性会被删除。

返回值

被传递给函数的对象

其他

var o = {};
o.a = 1;
// 等同于:
Object.defineProperty(o, "a", {
  value: 1,
  writable: true,
  configurable: true,
  enumerable: true
});
Object.defineProperty(o, "a", { value : 1 });
// 等同于:
Object.defineProperty(o, "a", {
  value: 1,
  writable: false,
  configurable: false,
  enumerable: false
});
posted @ 2022-06-22 16:52  风紧·扯呼  阅读(59)  评论(0)    收藏  举报