总结XVI-Object.is()和Object.defineProperty()

157

Object.is()

Object.is()  方法判断两个值是否为同一个值。

语法

Object.is(value1, value2);

参数

  • value1

    被比较的第一个值。

  • value2

    被比较的第二个值。

返回值

一个 Boolean 类型标示两个参数是否是同一个值。

描述

Object.is() 方法判断两个值是否为同一个值。如果满足以下条件则两个值相等:

  • 都是 undefined

  • 都是 null

  • 都是 true 或 false

  • 都是相同长度的字符串且相同字符按相同顺序排列

  • 都是相同对象(意味着每个对象有同一个引用)

  • 都是数字且

    • 都是 +0
    • 都是 -0
    • 都是 NaN
    • 或都是非零而且非 NaN 且为同一个值

== 运算不同。  == 运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 "" == false 判断为 true), 而 Object.is不会强制转换两边的值。

===运算也不相同。 === 运算符 (也包括 == 运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaNNaN视为不相等。

Object.defineProperty()

它有哪些可配置的选项?

首先,该方法可用于给一个对象添加新的属性,或者,修改已有的属性。

语法:Object.defineProperty(obj, prop, descriptor)

obj:要定义属性的对象

prop:要添加或修改的属性名(一定要加引号!)

descriptor:对象,属性描述符(包括数据描述符和存取描述符两种,只能选其一)

数据描述符:

可以有value writable两个可配置的选项,是一个具有值的属性,该值可以是可写的,也可以是不可写的。

Object.defineProperty(obj,'a',{
    value:1,
    writable:true
})

value就是该属性的值。

writable 表示该属性是否可写。如果不指定,默认是false,表示不能修改obj.a,但是修改了也不会报错,只是改不了,下次再读a的值,还是1.

存取描述符:

由 getter 函数和 setter 函数所描述的属性

var bValue = 38;
Object.defineProperty(o, "b", {
  get() { return bValue; },
  set(newValue) { bValue = newValue; },
});

两类描述符可以共有的配置选项

  1. enumerable

当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。 默认为 false。

是否是枚举属性,体现在该属性是否能在for(let key in obj)中循环,和Object.keys() 被枚举。如果是ture,这两种操作就能得到该属性。是false,就得不到。

  1. configurable

表示对象的属性是否可以被删除,以及除 value 和 writable 特性外的其他特性是否可以被修改。如果不设置,默认就是false。


数据描述符代码示例:

let obj={}
Object.defineProperty(obj,'a',{
  value:1,
  enumerable:true,
})
Object.defineProperty(obj,'b',{
  value:2,
})
Object.defineProperty(obj,'c',{
  value:3,
})
Object.defineProperty(obj,'d',{
  value:4,
  enumerable:true,
})

for(let key in obj){
  console.log(key)
}

console.log(Object.keys(obj))
//结果:
"a"
"d"
["a", "d"]