Javascript 关系运算符显示字符串的奇怪行为
Javascript Relational Operator Showing Weird Behavior with Strings
为什么Javascript关系运算符在比较三个字符串时显示奇怪的结果?是我错了还是Javascript出了问题?
var number1 = 1
var number2 = 1
var number3 = 1
number1 == number2 //true
number1 == number3 //true
number2 == number3 //true
number1 == number2 == number3 //true. Good!
现在问题部分:
var string1 = "a"
var string2 = "a"
var string3 = "a"
string1 == string2 //true
string2 == string3 //true
string1 == string3 //true
为什么下面给出假?
string1 == string2 == string3 //false. WHY IS THAT??
这个:
string1 == string2 == string3
方法:
(string1 == string2) == string3
也就是说:
true == string3
这不是true
,所以它是false
。
如果你想看看这三个字符串是否都一样,你需要
string1 == string2 && string2 == string3
edit — 这一切都与隐含在 ==
运算符行为中的类型转换以及表达式的语法和运算符优先级规则有关。==
运算符是左关联运算符,这意味着像这个问题一样的一串==
表达式用左加权括号处理(如上图我的答案所示(。
为了分解事情,在第一次比较之后,你得到了
true == string3
所以左边有一个布尔值,右边有一个字符串。==
运算符的规则说,在这种情况下,您将比较视为布尔值的数值与其他操作数之间的比较,这给出了
1 == string3
现在我们有一个数字和一个字符串。在这种情况下,==
规则说将字符串转换为数字,这给出了
1 == NaN
当string3
"a"
. 该比较是一个数字和另一个数字之间的比较,因此这是一个简单的数字相等性测试,结果false
。鉴于所有这些,请注意,如果字符串是这样初始化的:
var string1 = "1", string2 = "1", string3 = "1";
然后表达式
string1 == string2 == string3
会true
.同样,也许比原始测试的结果更令人惊讶,
"2" == "2" == "1"
会true
!
首先,Javascript 中的最佳实践是避免==
并使用===
。 ==
运算符非常努力 - 有些人会说太努力了 - 想出一种有效的方法来比较其操作数,因此它可以产生一些令人惊讶的结果。
在第一个示例中,以下代码:
number1 == number2 == number3
其实是这样解释的:
(number1 == number2) == number3
也就是说,Javascript首先比较number1
和number2
,在这种情况下产生true
。 然后它比较结果(true
(和number3
...这也是正确的,因为true == 1
是Javascript中的真实陈述。也就是说,true
的数值为 1。(请注意,即使在布尔上下文中,任何非零数的计算结果为真,或者至少是真数,也只有数字 1 测试等于true
本身。
如果使用 ===
,则会得到不同的结果,因为true === 1
是假的。 事实上,如果x
和y
不是同一类型的值,则x === y
总是假的。
当你到达字符串时,你可以看到即使使用==
也不起作用,因为true == s
对于大多数字符串s
都不正确。 (例外情况是,如果s
是数字"1"的字符串表示,那么它首先被转换为数字 1,正如我们上面所说,它测试为==
到 true
(。
如果你想比较三件事都相等,你需要比较两对它们和它们一起:
if ((number1 === number2) && (number2 === number3)) {...}
所以,总结一下:如果你将number1
和朋友设置为2而不是1,你会在第一个例子中得到false
。如果您将string1
和朋友设置为"1"而不是"a",则在第二个中会得到true
。 如果你使用===
而不是==
,你可以避免所有的混乱。
- 如何在JavaScript中将字符串转换为函数引用
- jQuery中是否内置了任何字符串格式化函数
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- ng打开空字符串
- 正则表达式在字符串中找到base64
- 如何将字符串值从php页面发送到java脚本页面
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 对id以某个字符串开头的元素进行计数
- Javascript逻辑运算符和字符串/数字
- 反向字符串比较
- 如何有效地将游戏数据存储在URL查询字符串中
- 可变大小的JavaScript字符串如何成为基元类型
- 将DOM节点值与字符串Javascript进行比较
- 如何在 Javascript 中将变量的值从字符串转换为整数
- 本地存储中的字符串到字节数组转换
- JavaScript按钮/输入/函数,字符串反转
- 从查询字符串参数推断出正确的数据类型
- Javascript 关系运算符显示字符串的奇怪行为
- 转换具有父子关系的逗号分隔字符串