"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 :(得分: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