如果属性未定义,则比较2个对象

时间:2016-08-24 04:13:36

标签: javascript



"use strict";
let obj1 = {
    key: undefined
};

let obj2 = {
    key: Symbol('')
};

// THIS SHOULD RETURN false
console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true




我已经阅读了the doc,他们说:还有另一种方法可以使用the replacer parameter来完全比较2个对象。就像:

let replacer = function (key, value) {
    if (value === undefined) {
        // do stuff...
    } else if (value['__proto__'].constructor.name === 'Symbol') {
        // do stuff...
    } else {
        // do stuff...
    }

    return value;
};

我的问题:是否有另一种方式比我刚才提到的replacer更快?我不想用这种方式处理很多事情。

例如:如果我有20个函数,例如:Symbol1()Symbol2()Symbol3() ... Symbol20(),我会重复使用if-else语句很多次。

1 个答案:

答案 0 :(得分:2)

首先,看看documentation

  

<强>描述
  要创建新的原始符号,请使用可选字符串编写Symbol()作为其描述:

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
     

上面的代码创建了三个新符号。 请注意,符号(“foo”)可以   不要将字符串“foo”强制转换为符号。它会创建一个新符号   每一次:

  

符号和JSON.stringify()

     

使用时将完全忽略符号键控属性   JSON.stringify():

JSON.stringify({[Symbol("foo")]: "foo"});                 
// '{}'

与传统对象不同,您的Symbol('AnyTextHere')不会返回任何文字,以便JSON.stringify可以将其转换为一个文本。没有返回任何内容,因此JSON.Stringify返回两个案例的空字符串,所以每次答案都是true

修改

来到你的问题Symbol()每次都会返回一个新的符号,所以没有两个符号会一样,即使你通过相同的参数。

所以我认为没有必要比较整个对象,只需将密钥与Symbol()进行比较

"use strict";
let obj1 = {
    key: undefined
};

let obj2 = {
    key: Symbol('')
};

let obj3 = {
    key: Symbol('')
};

// THIS SHOULD RETURN false
console.log(obj1.key === obj2.key); 
// false because Symbol() doesn't match undefined

console.log(obj2.key === obj2.key); 
// true because obj2.key is being compared with self

console.log(obj2.key === obj3.key); 
// false - NOTE that although the structure of obj2 and obj3 are same (COPIED AND PASTED)
// but since NO two Symbol() are same, and so the result is false