美文网首页
对象的扩张

对象的扩张

作者: 我卢本伟真的没有开挂 | 来源:发表于2019-01-09 12:17 被阅读0次

Object.is()

ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
ES5可以通过下面的代码,部署Object.is。
  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)。
Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。
  var target = { a: 1 };
  var source1 = { b: 2 };
  var source2 = { c: 3 };

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

注意点

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

常见用途

(1)为对象添加属性
(2)为对象添加方法
(3)克隆对象
  function clone(origin) {
    return Object.assign({}, origin);
  }
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。
  function clone(origin) {
    let originProto = Object.getPrototypeOf(origin);
    return Object.assign(Object.create(originProto), origin);
  }
(4)合并多个对象
(5)为属性指定默认值

属性的可枚举性

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性。
ES5有三个操作会忽略enumerable为false的属性。
  • ...in循环:只遍历对象自身的和继承的可枚举的属性
  • Object.keys():返回对象自身的所有可枚举的属性的键名
  • JSON.stringify():只串行化对象自身的可枚举的属性
ES6新增了一个操作Object.assign(),会忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
这四个操作之中,只有for...in会返回继承的属性。实际上,引入enumerable的最初目的,就是让某些属性可以规避掉for...in操作。比如,对象原型的toString方法,以及数组的length属性,就通过这种手段,不会被for...in遍历到。
  let obj = { foo: 123 };
  Object.getOwnPropertyDescriptor(obj, 'foo')
  //  {
  //    value: 123,
  //    writable: true,
  //    enumerable: true,
  //    configurable: true
  //  }

属性的遍历

ES6一共有5种方法可以遍历对象的属性。

(1)for...in

for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。

(2)Object.keys(obj)

Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。

(3)Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。

(4)Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有Symbol属性。

(5)Reflect.ownKeys(obj)

Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。

以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。

  • 首先遍历所有属性名为数值的属性,按照数字排序。
  • 其次遍历所有属性名为字符串的属性,按照生成时间排序。
  • 最后遍历所有属性名为Symbol值的属性,按照生成时间排序。

相关文章

  • 对象的扩张

    Object.is() ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它...

  • 历史与牛顿第三定律

    1.国家的扩张行为是什么? 我现在的理解是对扩张对象施加力的行为,改变扩张对象状态的行为。 2.扩张行为的难点是什...

  • VR开发--初步了解SteamVR

    1、360°旋转视角 添加其余的视角-扩张 添加好的层级关系:位置-头部-眼睛-耳朵 2、集成手柄 创建游戏对象,...

  • 扩张

    看着石缝里生长的杂草 突然觉得它们长出的不是希望 不是不屈不挠的顽强 而是实实在在的侵略 是生命意志的扩张 面目可...

  • 扩张

    声东击西还是扩张自己,本来你就什么都知道。你偏觉得你做不到,那就没有办法。直接做到,是不需要接触自我膨胀助纣为虐过...

  • 不断扩张的一天开始了!

    8月28日 不断扩张的一天开始了! 宣告:我要扩张自己的信心,扩张自己的眼界,扩张自己梦...

  • 资本扩张阶段

    资本扩张和运营规模扩张是不一样的,运营规模扩张是企业自己的产品扩大销售数量,资本扩张是一种外延式的扩张。也就是说如...

  • 近世代数理论基础29:代数扩张

    代数扩张 代数扩张 定义:设E是域F的一个扩张,若E中任一元都是F上的代数元,则称E为F的一个代数扩张 扩张次数 ...

  • 扩张形态理论| 2021-09-08

    扩张形态理论 以下跌大趋势为例 正向扩张 下跌的扩张 要先找出 下跌扩张的D,再出反向K .可以转多。 找出 3个...

  • 理论的扩张

    戴蒙德为了解释我们为什么会做危害自己的事情。比如吸毒,酗酒。 借用了札哈维的理论,如下 “ 由以色列动物学家阿莫兹...

网友评论

      本文标题:对象的扩张

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