5

私はJavascriptで次のパターンをよく使用しました。

x = couldBeNullThing || valueIfItIsNull;

それが勝つため:

x = couldBeNullThing ? couldBeNullThing : valueIfItIsNull;

私はまた、同じパターンのわずかな変形を頻繁に使用します。

x = x || valueIfXIsNotDefined;

それはすべて素晴らしいです...問題を除いて、私は最近発見しました:

foo = "";
//assert foo.x === undefined;
foo.x = foo.x || valueIfXIsNotDefined;
//assert foo.x === undefined;

つまり、文字列があり、string.aPropertyThatStringDoesntHave||を実行する場合 foo、fooも実際の値も返されません。代わりに、未定義になります。

誰かがこれがなぜであるか説明できますか?foo.xが未定義の場合、foo.x || anyElseは常にanythingElseになるはずです...では、なぜそうではないのですか?

4

1 に答える 1

2

の概念には精通してassertいますが、JavaScript にその機能があることは知りませんでした。それを念頭に置いて、私は完全に間違っている可能性がありますが、次のステートメントのように思えます。

assert (foo.x || valueIfXIsNotDefined) === undefined;

... という関数を呼び出しassert()、パラメータを渡し、関数foo.x || valueIfXIsNotDefinedからの戻り値を と比較しています。おそらくあなたが必要とするのはこれです:assert()undefined

assert(foo.x || valueIfXIsNotDefined === undefined);

私が似たようなことをしようとするとconsole.log()

var foo = "",
    valueIfXIsNotDefined = "test";
console.log( foo.x === undefined);
console.log(foo.x || valueIfXIsNotDefined === undefined);

次にログに記録します。

true
false

同様に、後:

var result = foo.x || valueIfXIsNotDefined;

resultです"test"

http://jsfiddle.net/YBPyw/

さらに、実際foo.xに何か (文字列だった場所) に等号を代入しようとしてfooも機能しないため、後でテストfoo.xするとundefined.

于 2012-03-24T02:40:32.097 に答える