使用 `status == true` 时,布尔条件始终为 false

Emi*_*era 19 javascript boolean

所以我刚开始学习 javascript,我现在在函数模块中,我正在玩它,突然我遇到了一个疑问:

为什么是这样:

if(x==true){
 return 1;
}
Run Code Online (Sandbox Code Playgroud)

与此不同:

if(x){
 return 1;
}
Run Code Online (Sandbox Code Playgroud)

?

你看,我有这个代码:

function isAdult(age){
    if(age >= 18){
        return true;
    }
    return false;
}

function nameAndAge(string, boolean){
    if(boolean == true){

        var my_string = string + " is adult";
        return my_string
    }
    var my_string = string + " is under age";
    return my_string

}

var talisa_age = 22;
var talisa_name = "Talisa Maegyr";

var status = isAdult(talisa_age);

var str = nameAndAge(talisa_name,status);
console.log(str)
Run Code Online (Sandbox Code Playgroud)

无论“talisa_age”值如何,我都会得到以下输出:

"Talisa Maegyr is under age"
Run Code Online (Sandbox Code Playgroud)

但是,如果我将 nameAndAge 的验证更改为

"Talisa Maegyr is under age"
Run Code Online (Sandbox Code Playgroud)

代码按预期工作......

ggo*_*len 28

如果你console.log(typeof status)会看到它是一个字符串。为什么?答案是它status是一个特殊变量 ,window.status它不再对窗口状态栏产生任何影响,但在分配值时仍会转换回字符串(大概用于显示)。

该标准规定

由于历史原因,对象status上的Window属性必须在获取时返回它设置的最后一个字符串,并且在设置时必须将自身设置为新值。当Window对象被创建,必须将属性设置为空字符串。它不做任何其他事情。

因此,您的条件是if ("true" == true)*,即使使用强制也是错误的。将其更改为if ("true")似乎有效,因为非空字符串是真实的

如果您将变量命名为其他类似status_程序正常行为的名称。更好的是,避免在全局范围内和/或使用变量声明,const或者let更可取var并且可以帮助防止像这样的奇怪错误。

问题的最小再现:

console.log(typeof status);
var status = 42;
console.log(typeof status);
Run Code Online (Sandbox Code Playgroud)

一些可能的修复:

var status_ = 42;
console.log(typeof status_);

const status = 42;
console.log(typeof status);

(() => {
  var status = 42;
  console.log(typeof status);
})();
Run Code Online (Sandbox Code Playgroud)

* : 请注意,某些浏览器将其window.status视为只读,例如 IE11。status""在这种情况下,你会得到不同的异常行为。


进一步阅读:

  • @AlexWayne 类似的哈哈问题/答案就是我喜欢 StackOverflow 的原因。 (6认同)
  • 我正在调试这个,我以为我失去了理智。但是,是的,这就是为什么你总是使用“const”或“let”。 (3认同)

归档时间:

查看次数:

1564 次

最近记录:

5 年,4 月 前