1

Object.assign()

对象的合并 将源对象(source)的所有可枚举属性复制到目标对象

Object.assign(target, source1, source2)

如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的。Object.assign()拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举属性。

插播一段知识点:
对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。

let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
//  {
//    value: 123,
//    writable: true,
//    enumerable: true,
//    configurable: true
//  }
  • value:属性值
  • wirtable: 可写性(是否可以修改(赋值))
  • enumerable:可枚举属性(是否可以被遍历到)
  • configurable:可配置属性(是否可以被删除)

Object.create()

创建一个新对象,使用现有的对象来提供新创建的对象的__proto__

Object.create(proto, [propertiesObject])

proto
新创建对象的原型对象。
propertiesObject
可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defindProperties()的第二个参数。

Object.defineProperty()

该方法直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

Object.defineProperty(obj, prop, descriptor)

obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。

Object.defineProperty(obj, "key", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: "static"
});

Object.defineProperties()

直接在一个对象上定义新的属性或修改现有属性,并返回该对象。

Object.defineProperties(obj, props)
var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // etc. etc.
});

Object.is()

Object.is() 判断两个值是否相同。如果下列任何一项成立,则两个值相同:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且

    - 都是正零 +0
    - 都是负零 -0
    - 都是 NaN
    - 都是除零和 NaN 外的其它同一个数字
    

这种相等性判断逻辑和传统的 == 运算符所用的不同,== 运算符会对它两边的操作数做隐式类型转换(如果它们类型不同),然后才进行相等性比较,(所以才会有类似 "" == false 为 true 的现象),但 Object.is 不会做这种类型转换。

这与===运算符也不一样。===运算符(和==运算符)将数字值-0和+0视为相等,并认为Number.NaN不等于NaN。

Object.keys(),Object.values(),Object.entries()

Object.keys():返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名
Object.values:返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值
Object.entries:返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组

let {keys, values, entries} = Object;
let obj = { a: 1, b: 2, c: 3 };

for (let key of keys(obj)) {
  console.log(key); // 'a', 'b', 'c'
}

for (let value of values(obj)) {
  console.log(value); // 1, 2, 3
}

for (let [key, value] of entries(obj)) {
  console.log([key, value]); // ['a', 1], ['b', 2], ['c', 3]
}

Object.getPrototypeOf()

返回指定对象的原型(内部[[Prototype]]属性的值)。
语法:

Object.getPrototypeOf(object)

object:要返回其原型的对象。
返回值:给定对象的原型。如果没有继承属性,则返回 null

const prototype1 = {};
const object1 = Object.create(prototype1);

console.log(Object.getPrototypeOf(object1) === prototype1);
// expected output: true

介绍一个常用操作符 in
如果指定的属性在指定的对象或其原型链中,则in 运算符返回true
语法:
prop in object

var obj ={
    a: 1
}
console.log('a' in obj); // true
console.log('b' in obj); // false

猪猪猪惠婷
298 声望10 粉丝

正在努力成为一名还不错的前端工程师