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
常见用途
- 为对象添加属性
class Point {
constructor(x, y) {
Object.assign(this, {x, y});
}
}
- 为对象添加方法
Object.assign(SomeClass.prototype, {
someMethod(arg1, arg2) {
···
},
anotherMethod() {
···
}
});
// 等同于下面的写法
SomeClass.prototype.someMethod = function (arg1, arg2) {
···
};
SomeClass.prototype.anotherMethod = function () {
···
};
- 克隆对象
function clone(origin) {
return Object.assign({}, origin);
}
- 合并多个对象
const merge = (target, ...sources) => Object.assign(target, ...sources);
//如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。
const merge = (...sources) => Object.assign({}, ...sources);
- 为属性指定默认值
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]
}
网友评论