比较2名对象,如果属性为undefined

问题描述:

比较2名对象,如果属性为undefined

"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语句多次。

+0

你的钥匙没有涉及'JSON.stringify',对不对?例如,请参阅http://*.com/questions/25456013/javascript-deepequal-comparison。 – Blorgbeard

+0

为什么你首先使用'JSON.stringify'? – Blender

+0

btw我运行你的代码,并且两个结构都解析成'{}'这就是为什么它返回true。 –

首先,只看到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

+0

非常感谢!我明白你的意思。而且......在这种情况下,比较'obj1'和'obj2'的想法是什么?创建一个新的函数而不使用'JSON.stringify'? –

+0

@HappyCoding我已经更新了我的答案......请参阅已编辑的答案。 –

+0

就像定义同一类的2个实例一样。它们是相同的,但与之相似。这是帮助。谢谢! –