個人的には、 xを使用するのが良い習慣であるようなステートメントは好きではありません。IMO、それはすべてコンテキストに依存します。オブジェクトが存在することを確認したい場合は、またはとif(objectX)
同じように実行します。if (objectX === undefined)
if (typeof objectX === 'undefined')
if (typeof objectX == 'undefined')
Douglas Crockfordのように、値と型のチェック(===
)の使用を強く推奨する理由は、まれに、偽の値と真の値が予期しない結果をもたらす可能性があるためです。
var falsy = '';
if (falsy)
{//only when falsy is truthy, but an empty string is falsy
console.log('could be seen as counter-intuitive: var was declared and assigned an empty string, but is falsy');
}
var obj = {falsy:''}
if (!obj.falsy)
{
console.log('I might assume falsy is not set, although it was:');
console.log(obj.hasOwnProperty('falsy'));//true
}
繰り返しますが、これは私の意見かもしれませんが、ほとんどの場合、これによってコードが破損することはありません。さらに一歩進んで、ダグラス・クロックフォードは、偽の値のチェックを使用するのは良い考えではないと主張するかもしれませんが、論理OR(||
)演算子は好きです。
var falsy ='';
var someVar = falsy || 'default value';//this relies heavily on falsy values
厳密に比較するための唯一の「堅実な」議論は次のとおりです。
- 変数をブール値にする必要があるが、再びブール値に
falsy = !!falsy;
強制する場合
- 厳密な比較はわずかに高速ですが、違いに気付く前に多くの比較を行う必要があります
そうは言っても、私は厳密な比較を非常に多く使用する傾向があります。これも個人的なことかもしれませんが、変数の実際のタイプが何であるかを知りたいです。少なくとも、変数を必要なタイプに強制変換することができます。
'1' == 1
'1' === 1
var foo = '00001';
var elements = [foo = ('00000' + (+(foo)+1)).substr(-5)];
while(elements[+(foo)-1])
{
foo = ('00000' + (+(foo)+1)).substr(-5);
elements.push(foo = ('00000' + (+(foo)+1)).substr(-5));
}
さて、これはあなたが良いコードと呼ぶものではありませんが、多くの型ジャグリングが起こっています。ライドの最後に、に割り当てられた値を知りたい場合がありますfoo
。これはこのスニペットの問題ではありませんが、奇数の場合は、whileループ内でfooの数値を使用するとします。
var foo = '00001';
var elements = [foo = ('00000' + (+(foo)+1)).substr(-5)];
while(elements[+(foo)-1])
{
foo = ('00000' + (+(foo)+1)).substr(-5);
elements.push(foo = ('00000' + (+(foo)+1)).substr(-5));
if (+(foo)%2 === 1)
{
foo = +(foo);
//do stuff with foo
}
}
天気をチェックする最も簡単な方法foo
は、ループが完了した後の文字列ですfoo
。直接チェックするif (foo === +(foo))
ことです。この例は少し遠慮がちですが、これと非常によく似たケースに遭遇しました。強い型の言語の利点が実際に示されるのは、このようなときです。それについて言えば:new Date() >= someDateObject
vs Date() >= someDateObject
...コンソールで試してみると、すぐに私が何をしているのかがわかります。