严格的相等运算符与不相等。为什么他们不平等

时间:2015-01-09 22:17:30

标签: javascript

我在JS的冒险开始,所以我有一个问题。我创建了一个小程序,询问你的名字,然后打印出来。而且我想知道为什么这两个序列不能给我相同的结果。如果我没有输入任何东西,这个程序不应该打印任何东西,但在第一种情况下它打印出来,我不知道它为什么会这样做。

do {
  var name = prompt("Who are you?");
} while (name === false);
console.log(name);

do {
  var name = prompt("Who are you?");
} while (!name);
console.log(name);

谢谢:)

5 个答案:

答案 0 :(得分:2)

提示返回一个字符串,因此name变量是一个字符串。

对于===工作,双方需要是同一类型。

在这种情况下,左侧是字符串,右侧不是。

答案 1 :(得分:1)

prompt() will never return false

它可能返回一个空字符串,或null(如果使用取消/ ESC) - 其中任何一个都满足while (! name) - 但这些都不等于false }。

答案 2 :(得分:0)

来自https://developer.mozilla.org/en-US/docs/Web/API/Window.prompt

  

语法

     

result = window.prompt(text,value);

     

result是一个包含用户输入的文本的字符串,或者值为null。

将您的=== false更改为=== null并再试一次。底线window.prompt不会返回布尔值,因此严格的相等检查失败。

答案 3 :(得分:0)

将值与布尔值进行比较不同于值转换为布尔值。

x === false确实在测试x是否具有值false。但!x x转换为布尔值。所以这些是执行的两个不同的操作:

// if (x === false)
(x === false) === true

// if (!x)
(!Boolean(x) === true)

下一条信息是知道不同类型的值如何转换为布尔值。这被定义为spec。这是一段摘录:

  

nullfalse

     

undefinedfalse

     

String:如果参数为空String(其长度为零),则结果为false;否则结果为true

如果您未提供值,则name将是空字符串转换为布尔值false,但不是值false

答案 4 :(得分:0)

首先,您希望在name null 而不是错误的情况下运行脚本吗?

另外,关于等于,请注意

true == 1; // correct!
"2" == 2; // correct!

虽然

true === 1; // false
"2" === 2; // false

这是因为===意味着相同。在比较发生之前,==会尝试将任意一方转换为任何等效值。

JSFiddle