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.NaN
与NaN
视为不相等。
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; },
});
两类描述符可以共有的配置选项
enumerable
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。 默认为 false。
是否是枚举属性,体现在该属性是否能在for(let key in obj)
中循环,和Object.keys()
被枚举。如果是ture,这两种操作就能得到该属性。是false,就得不到。
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"]