个人而言,我不喜欢像这样的陈述,这是x的良好做法。国际海事组织,这一切都取决于上下文:如果你想检查一些对象存在,if(objectX)
将尽可能if (objectX === undefined)
或if (typeof objectX === 'undefined')
甚至if (typeof objectX == 'undefined')
。
之所以有些人,像道格拉斯·克罗克福德,大力提倡使用的价值和类型检查(===
)是falsy和truthy值,在极少数情况下,产生意想不到的结果:
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
}
再次,这可能只是我的看法,但在绝大多数情况下,这不会破坏你的代码。我甚至会走一步:道格拉斯Crockford的可能声称,使用检查falsy值是不是一个好主意,但他确实像逻辑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
...在你的控制台中试用它,你很快就会看到我在做什么。
这是一个没有任何正确答案的问题,主观的。 –