今天,我考虑到我在学校作业中检查变量是对还是错的方式,对代码进行了评论。
我写的代码是这样的:
var booleanValue = true;
function someFunction(){
if(booleanValue === true){
return "something";
}
}
他们说最好这样写:
var booleanValue = true;
function someFunction(){
if(booleanValue){
return "something";
}
}
我对“ === true”部分的评论是,不需要它,可能会造成混乱。
但是我的想法是,最好检查变量是否为布尔值,尤其是因为Javascript是一种松散类型的语言。
在第二个示例中,字符串也将返回“ something”。
所以我的问题;将来松散“ === true”部分是否更整洁,还是检查变量类型的好习惯?
编辑:
在我的“真实”代码中,布尔值表示图像是否已删除,因此boolValue唯一应具有的值是true或false。
例如,0和1不应在该变量中。
首先,事实:
if (booleanValue)
if
对于任何真实值(booleanValue
包括true
,任何非零数字,任何非空字符串值,任何对象或数组引用等),将满足该语句。
另一方面:
if (booleanValue === true)
if
如果booleanValue
正好等于,这将满足条件true
。没有其他真实的价值可以满足它。
另一方面,如果您这样做:
if (someVar == true)
然后,Javascript将要做的是强制键入类型true
以匹配的类型,someVar
然后比较两个变量。在很多情况下,这可能不是人们想要的。因此,在大多数情况下,您要避免使用,==
因为关于Java语言如何强制将两种类型的内容强制转换为相同类型的规则相当长,除非您了解所有这些规则并且可以预期JS解释器在何时执行的所有操作给定两种不同的类型(大多数JS开发人员无法做到),您可能希望==
完全避免。
作为一个令人困惑的例子:
var x;
x = 0;
console.log(x == true); // false, as expected
console.log(x == false); // true as expected
x = 1;
console.log(x == true); // true, as expected
console.log(x == false); // false as expected
x = 2;
console.log(x == true); // false, ??
console.log(x == false); // false
对于值2
,您会认为这2
是一个真实值,因此可以与相比true
,这是正确的,但这不是类型强制的工作原理。它正在转换右手值以匹配左手值的类型,因此将其转换true
为数字,1
以便进行比较2 == 1
,这肯定不是您想要的。
因此,买家要当心。==
除非您明确知道要比较的类型,并且知道所有可能的类型强制算法如何工作,否则最好避免在几乎所有情况下使用。
因此,它实际上取决于期望值booleanValue
以及您希望代码如何工作。如果您事先知道它只会有一个true
orfalse
值,那么可以将其与
if (booleanValue === true)
只是多余的代码,是不必要的,
if (booleanValue)
更紧凑,可以说更清洁/更好。
另一方面,如果您不知道booleanValue
可能是什么,并且想要测试它是否真的设置为true
不允许其他自动类型转换,那么
if (booleanValue === true)
不仅是一个好主意,而且是必需的。
例如,如果您查看.on()
jQuery中的实现,则它具有可选的返回值。如果回调返回false
,则jQuery将自动停止事件的传播。在这种特定情况下,由于jQuery只希望停止false
返回时的传播,因此他们明确检查返回值,=== false
因为他们不希望undefined
or0
或""
or或其他任何将自动类型转换为false的内容也可以满足比较。
例如,这是jQuery事件处理回调代码:
ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
您可以看到jQuery正在明确寻找ret === false
。
但是,考虑到代码的需求,jQuery代码中还有许多其他地方需要进行更简单的检查。例如:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
...
如果您写:if(x === true)
,则只有x = true才成立
如果您写:if(x)
,则对于任何非x都为true ”(空字符串),false,null,undefined,0,NaN。
在简单的“如果”中,变量将强制为布尔值,并且在对象上使用toBoolean:
Argument Type Result
Undefined false
Null false
Boolean The result equals the input argument (no conversion).
Number The result is false if the argument is +0, −0, or NaN;
otherwise the result is true.
String The result is false if the argument is the empty
String (its length is zero); otherwise the result is true.
Object true.
但是与===的比较没有任何类型强制性,因此它们必须相等而没有强制性。
如果您说该对象甚至可能不是布尔值,那么您可能不仅要考虑true / false。
if(x===true){
...
} else if(x===false){
....
} else {
....
}
这取决于您的用例。检查类型也可能有意义,但是如果只是一个标志,则不是。
通常,省略会更干净,更简单=== true
。
但是,在Javascript中,这些语句是不同的。
if (booleanValue)
如果将执行booleanValue
是truthy -比其他任何东西0
,false
,''
,NaN
,null
,和undefined
。
if (booleanValue === true)
仅在booleanValue
精确等于时执行true
。
身份(===)
运算符的行为与相等(==)
运算符的行为相同,只是不进行类型转换,并且类型必须相同才能被视为相等。
由于检查的值是Boolean
首选,因此最好直接使用它以减少编码,并且完全相同==true
由于您已经清楚地将其初始化为bool,因此我认为===
不需要运算符。
如果变量只能采用布尔值,那么使用较短的语法是合理的。
如果它可能被分配其他类型,并且需要区分true
来自1
或者"foo"
,则必须使用=== true
。
我认为您的推理是正确的。但实际上,我发现省略===
比较是很常见的。我认为有以下三个原因:
- 它通常不会增加表达式的含义-在已知该值仍然是布尔值的情况下。
- 由于JavaScript中存在大量类型不确定性,因此当您获得意外
undefined
或null
有价值的信息时,强制进行类型检查会咬住您。在这种情况下,通常您只是希望测试失败。(尽管我试图用“快速失败”的座右铭来平衡这一观点)。 - JavaScript程序员喜欢使用类型来快速操作,特别是在布尔表达式中,因为我们可以。
考虑以下示例:
var someString = getInput();
var normalized = someString && trim(someString);
// trim() removes leading and trailing whitespace
if (normalized) {
submitInput(normalized);
}
我认为这种代码并不罕见。它处理情况getInput()
回报undefined
,null
或一个空字符串。由于有两个布尔值,submitInput()
因此仅当给定输入是包含非空格字符的字符串时才调用布尔求值。
在JavaScript中,&&
如果第一个参数为假,则返回其第一个参数;如果第一个参数为真,则返回第二个参数;所以normalized
会undefined
,如果someString
是不确定的,等等。这意味着上述布尔表达式的输入实际上都不是布尔值。
我知道很多程序员在看到这样的代码时习惯于强大的类型检查能力。但是请注意,应用强类型键入可能需要显式检查null
或undefined
值,这会使代码混乱。在JavaScript中不需要。
这取决于。如果您担心变量最终可能会变成TRUE。然后必须进行严格检查。否则由您决定。但是,我怀疑该语法whatever == TRUE
是否会混淆任何知道自己在做什么的人。
在Javascript中,布尔值的概念很模糊。考虑一下:
var bool = 0
if(bool){..} //evaluates to false
if(//uninitialized var) //evaluates to false
因此,当您使用if语句(或任何其他控制语句)时,不必使用“布尔”类型var。因此,我认为,如果您知道语句是布尔值,则语句的“ === true”部分是不必要的,但是如果您的值是模棱两可的“真实”变量,则绝对必要。可以在javscript中找到有关布尔的更多信息。
Revisa https://www.w3schools.com/js/js_comparisons.asp
例:
var p=5;
p==5 ? true
p=="5" ? true
p==="5" ? false
===表示相同的类型也等于相同的值==只是相同的值
如果需要测试对象,也可以使用布尔对象进行测试
error={Boolean(errors.email)}
文章标签:javascript , semantics
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!