2016-08-24 7 views
1

比較例2つのオブジェクトプロパティが未定義

"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

でキーを比較し、全体のオブジェクトを比較する必要はありませんと思いますか?たとえば、http://stackoverflow.com/questions/25456013/javascript-deepequal-comparisonを参照してください。 – Blorgbeard

+0

なぜ最初に 'JSON.stringify'を使用していますか? – Blender

+0

btw私はあなたのコードを実行し、両方の構造体が '{}'に解決して、なぜそれが真を返すのかを判断します。 –

答えて

2

まず、ちょうどdocumentation次を参照してください。新しい原始シンボルを作成するには

説明
を、あなたはその説明として、オプションの文字列でSymbol()を書く:

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

上記のコード3つの新しいシンボルを作成します。 Symbol( "foo")は が文字列 "foo"をシンボルに強制しないことに注意してください。 JSON.stringifyを(使用する場合

シンボルJSON.stringify()

シンボルキーイング特性が完全に無視されます:それは新しいシンボル たびを作成します):

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

従来のオブジェクトとは異なり、Symbol('AnyTextHere')はテキストを返さないのでJSON.stringifyは1に変換できます。何も返されていないので、JSON.Stringifyは両方のケースで空文字列を返しますので、毎回答えはtrueです。


EDITあなたの質問に来

Symbol()は常に新しいシンボル毎回返し、そうNO二つのシンボルは、同じパラメータを渡す場合であっても、これまでと同じにしません。

そして私はあなたが右、 `JSON.stringify`が関与する必要はありませんだけで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つのインスタンスを定義するようなものです。彼らは同じですが類似しています。それは助けになる。ありがとう! –

関連する問題