1、JS如何判断两个对象相同
Object.is()
方法确定两个值是否相同。
let a = {
key: 'test'
}
let b = a
console.log(Object.is(a, b)) // true
Object.is('foo', 'foo'); // true
Object.is(window, window); // true
Object.is('foo', 'bar'); // false
Object.is([], []); // false
Object.is({}, {}); // false
当比较两个对象时,其实比较的是他们的地址是否相同。
Object.is和== 与===的区别?
- Object.is(+0, -0) // false
- Object.is(NaN, NaN) // true
- +0 === -0 // true
- NaN === NaN // false
Object.is更加符合人们的认知与常理。NaN不与自己相等,其实是JS创立之时的问题。
2、JS如何判断两个对象所有的属性值一致,属性顺序不重要
与第一题不同,该问题需要比较两个对象的所有属性
- 这里我一开始所想的思路是利用 JSON.stringify 来进行,但是由于两个对象的属性的顺序可能不同,所以如果按照此种方法,需要先给对象的所有属性进行排序。
错误的示例:
const sortObj = (obj) => {
let result = {}
Object.keys(obj).sort().forEach(item => {
result[item] = obj[item]
})
return result
}
对象之中的属性,也可能是对象,所以直接通过单层的排序明显是不行的。
(这里其实也涉及到了对象的深拷贝,使用Object.assign也是行不通的)
3、JS深拷贝两个对象
- 方法一、JSON.parse(JSON.stringify(obj))
- 优点:写起来简单,甚至不用单独搞个函数
- 缺点:undefined、function等拷贝不了???
- 方法二、todo
- 方法三、最稳妥的,使用第三方库 lodash 的 cloneDeep
我们虽然的确解决了深拷贝的大部分问题。不过很多细节还没有去处理。在生产环境,我们还是要使用lodash的cloneDeep。cloneDeep对每个数据类型都单独处理的非常好。比如ArrayBuffer什么的。我们都没有处理。
4、JS如何修改对象中属性的顺序,让他们按照英文大小写排序