比较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
语句多次。
首先,只看到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
非常感谢!我明白你的意思。而且......在这种情况下,比较'obj1'和'obj2'的想法是什么?创建一个新的函数而不使用'JSON.stringify'? –
@HappyCoding我已经更新了我的答案......请参阅已编辑的答案。 –
就像定义同一类的2个实例一样。它们是相同的,但与之相似。这是帮助。谢谢! –
你的钥匙没有涉及'JSON.stringify',对不对?例如,请参阅http://*.com/questions/25456013/javascript-deepequal-comparison。 – Blorgbeard
为什么你首先使用'JSON.stringify'? – Blender
btw我运行你的代码,并且两个结构都解析成'{}'这就是为什么它返回true。 –