"use strict";
let obj1 = {
key: undefined
};
let obj2 = {
key: Symbol('')
};
// THIS SHOULD RETURN false
console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true
我读过医生,他们说:还有一种方法可以通过使用替换器参数来准确地比较两个类似于这种情况的对象。就像:
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语句。
发布于 2016-08-24 04:35:56
首先,只需查看文档
描述 要创建一个新的原语符号,可以使用一个可选字符串作为
Symbol()的描述: var sym1 =符号();var sym2 =符号(“foo”);var sym3 =符号(“foo”); 上面的代码创建了三个新符号。注意到符号( "foo“)并不强制字符串”foo“成为符号。每次创建一个新符号:符号与JSON.stringify() 在使用JSON.stringify()时,符号键控属性将被完全忽略: JSON.stringify({符号(“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
https://stackoverflow.com/questions/39114311
复制相似问题