美文网首页
对象的扩展

对象的扩展

作者: 简单tao的简单 | 来源:发表于2020-02-04 15:00 被阅读0次

Object.is()

ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。JavaScript缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。

console.log(+0==-0) //true
console.log(NaN==NaN)  //false

console.log(+0===-0) //true
console.log(NaN===NaN) //false

console.log(Object.is(+0, -0)) //false
console.log(Object.is(NaN, NaN)) //true

console.log(Object.is({}, {})) //false

ES5实现

Object.defineProperty(Object, 'is', {
  value: function(x, y) {
    if (x === y) {
      // 针对+0 不等于 -0的情况
      return x !== 0 || 1 / x === 1 / y;
    }
    // 针对NaN的情况
    return x !== x && y !== y;
  },
  configurable: true,
  enumerable: false,
  writable: true
});

Object.assign()

Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

var target = { a: 1 };
var source1 = { b: 2 };
var source2 = { c: 3 };

Object.assign(target, source1, source2);
console.log(target) // {a:1, b:2, c:3}

Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

var obj1 = {a: {b: 1}};
var obj2 = Object.assign({}, obj1);

obj1.a.b = 3;
console.log(obj2.a.b) // 3
常见用途
  1. 为对象添加属性
class Point {
  constructor(x, y) {
    Object.assign(this, {x, y});
  }
}
  1. 为对象添加方法
Object.assign(SomeClass.prototype, {
  someMethod(arg1, arg2) {
    ···
  },
  anotherMethod() {
    ···
  }
});

// 等同于下面的写法
SomeClass.prototype.someMethod = function (arg1, arg2) {
  ···
};
SomeClass.prototype.anotherMethod = function () {
  ···
};
  1. 克隆对象
function clone(origin) {
  return Object.assign({}, origin);
}
  1. 合并多个对象
const merge = (target, ...sources) => Object.assign(target, ...sources);

//如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。
const merge = (...sources) => Object.assign({}, ...sources);
  1. 为属性指定默认值
const DEFAULTS = {
  logLevel: 0,
  outputFormat: 'html'
};

function processContent(options) {
  options = Object.assign({}, DEFAULTS, options);
}

对象属性的遍历

方法 -- 说明\可遍历的属性 自身的属性 继承的属性 可枚举属性 不可枚举属性 Symbol 属性
for...in() -- 循环遍历 yes yes yes no no
Object.keys(obj) -- 返回一个数组 yes no yes no no
Object.getOwnPropertyNames(obj) -- 返回一个数组 yes yes yes yes no
Object.getOwnPropertySymbols(obj) -- 返回一个数组 yes
Reflect.ownKeys(obj) -- 返回一个数组 yes yes yes yes yes

对象的方法

  • Object.keys() es5
  • Object.values() es7
  • Object.entries() es7
let obj = { a: 1, b: 2, c: 3 };

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

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

console.log(Object.entries(obj)) // [['a', 1], ['b', 2], ['c', 3]]

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

相关文章

  • JQuery插件

    类扩展: 对象扩展:

  • 《ECMAScript 6 入门》笔记

    变量的解构赋值 字符串的扩展 正则的扩展 数值的扩展 函数的扩展 数组的扩展 对象的扩展 对象的新增方法 表单验证...

  • 对象的扩展

    属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 Object.is(...

  • 对象的扩展

    对象的扩展 属性和方法简写 var foo ='bar' var baz = {foo} <=> va...

  • 对象的扩展

    1、属性方法的简洁表示 属性简写 var foo='foo'; var goo= {'foo':foo};可以写成...

  • 对象的扩展

    属性的简洁表示法 属性名表达式 方法的 name 属性 Object.is() Object.assign() 属...

  • 对象的扩展

    属性的简结表示法 属性名表达式 Object.is() Object.assign() Object.keys()...

  • 对象的扩展

    一、属性的简介表示法 (1)ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁 上面代码表明...

  • 对象的扩展

    ** 参考**书籍:ECMAScript 6 入门作者:阮一峰 属性的简洁表示法ES6 允许直接写入变量和函数,作...

  • 对象的扩展

    简而言之,对象的扩展就是通过类似于 extend 的方法,将对象的功能进行方便的管理(删除或者添加或者是修改)。 ...

网友评论

      本文标题:对象的扩展

      本文链接:https://www.haomeiwen.com/subject/mlnuzctx.html