1、JS如何判断两个对象相同

    Object.is()方法确定两个值是否相同

    1. let a = {
    2. key: 'test'
    3. }
    4. let b = a
    5. console.log(Object.is(a, b)) // true
    6. Object.is('foo', 'foo'); // true
    7. Object.is(window, window); // true
    8. Object.is('foo', 'bar'); // false
    9. Object.is([], []); // false
    10. 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 来进行,但是由于两个对象的属性的顺序可能不同,所以如果按照此种方法,需要先给对象的所有属性进行排序。

    错误的示例:

    1. const sortObj = (obj) => {
    2. let result = {}
    3. Object.keys(obj).sort().forEach(item => {
    4. result[item] = obj[item]
    5. })
    6. return result
    7. }

    对象之中的属性,也可能是对象,所以直接通过单层的排序明显是不行的。
    (这里其实也涉及到了对象的深拷贝,使用Object.assign也是行不通的)


    3、JS深拷贝两个对象

    • 方法一、JSON.parse(JSON.stringify(obj))
      • 优点:写起来简单,甚至不用单独搞个函数
      • 缺点:undefined、function等拷贝不了???
    • 方法二、todo
    • 方法三、最稳妥的,使用第三方库 lodash 的 cloneDeep

      我们虽然的确解决了深拷贝的大部分问题。不过很多细节还没有去处理。在生产环境,我们还是要使用lodash的cloneDeep。cloneDeep对每个数据类型都单独处理的非常好。比如ArrayBuffer什么的。我们都没有处理。

    4、JS如何修改对象中属性的顺序,让他们按照英文大小写排序