在javascript中,哪个是更好的方法来检查条件语句的性能,健壮性,哪种是最佳实践?
var x = null;
// this condition is checked frequently and x will be set to null or some value accordingly
if(x !== null){...}
OR
if(!!x){...}
答案 0 :(得分:4)
你可以做到
if (x) { ... }
简单地说,如果x
是一个真正的价值。
尼娜指出。我总是会添加一些额外的验证,具体取决于我的期望。
if (x && x > 0) { ... }
或
if (x && x instanceof Array)
但我总是在检查x有某种价值,而不是undefined
或null
答案 1 :(得分:1)
从来没有必要写if(!!x){...}
。这与写if(x){...}
完全相同。使用!
运算符两次将一个值转换为一个布尔值,反映它是否是" truthy"或不。但是if
语句无论如何都会这样做:它会测试你提供的价值是否是"真实的"。因此,无论您是否使用!!
,它都会做同样的事情。
if(x !== null){...}
完全是另一回事。它并不仅仅检查x
是否是"真实的",它专门将x
的值与null
进行比较。例如,如果x
的数值为0
,则if(x){...}
或if(!!x){...}
将不执行...
代码,因为{ {1}}是一个" falsy"值,但0
将执行if(x!==null)
代码,因为...
与0
的值不同。
相关示例是null
或if(x!=null){...}
。 (请注意使用if(x==null){...}
或!=
代替==
或!==
。)这是JavaScript中的一个特例。当您使用===
或null
运算符与!=
进行比较时,它实际上会与==
或null
进行比较,并将这两个值视为相同。换句话说,如果undefined
x
或null
,则undefined
将执行if(x==null){...}
代码,但...
1}}不会执行if(x!=null){...}
代码。
通常建议您避开...
和==
运算符,并使用严格比较!=
或===
代替!==
并且null
在某些情况下同样有用,所以这是非严格操作符有用的情况。
无论如何,要问的真正问题是你的代码的目的是什么,你需要在这里测试什么?
答案 2 :(得分:1)
假设您需要检查strict inequality !==
到null
经常检查这个条件,x将被设置为null或相应的值
if (x !== null) { /* */ }
然后你只能使用上面的比较。任何其他比较都会返回错误的结果。
例如
var x = 0;
if (x !== null) { // true
console.log(x + ' !== null');
}
if (x) { // false
console.log(x);
}
// some more checks
console.log(undefined !== null); // true
console.log(undefined != null); // false

答案 3 :(得分:0)
编辑:在我与Nina Scholz的对话中,我在她对这个帖子的回应中得知,我的反应非常错误。我相应地更新了。
根据您希望使用的类型,有许多方法可以检查值。因此,问题不在于性能,而在于正确的评估。从您的示例开始:
if(x != null)
如果x的值为false
或“未定义”,则评估为null
。
下一个案例:
if(!!x)
这是一个完全不同的操作。它将x的值转换为布尔值,并且在大多数情况下if(x)
将以相同的方式工作。但是现在,如果值为falsy,如0,即空字符串,则表达式返回false
。所以,如果期望一个数字,你应该检查零值:
if(x || (0 === x))
请记住,如果x不是int,则表达式返回true。
你期望一个字符串的情况:
if(x || ('' === x))
同样的事情,如果x是12,表达式返回true。
我可以继续做很多例子。不幸的是,某些表达方式以意想不到的方式运行。例如,通过调用isNaN(number)来检查值是否为数字应该很容易,但如果值是空字符串或数组索引的表示('2'),则isNaN返回false 。
我建议您检查this table所有类型转换,以便您更加了解如何检查值的有效性。