运算符
JavaScript中的运算符有==
、===
、!=
、!==
、>
、<
、+
、-
、*
、/
等
当两个操作数类型不同时,大部分运算符会自动执行类型转换,统一类型以进行后续操作
+
运算符:将数字(或布尔值)转换为字符串
+
运算符只要遇到字符串,会执行字符拼接(Concatenation),结果一定为字符串
3+"1"结果为"31"
1+1+"9"+1+1结果为"2911"
true+"love"结果为"truelove"
true+"1"结果为"true1"
true+1+"1"结果为"21"
注意:1+1+"9"+1+1结果为"2911"
,true+1+"1"结果为"21"
,因为+
的结合性是从左到右的
技巧:用
number
生成字符串时,无需用number
的toString()
方法,而是利用+
的拼接特性:
var str=num+"";
结果为一个字符串
-
、*
、/
运算符:将字符串(或布尔值)转化为数字
-
、*
、/
运算符遇到字符串,认为要执行的是算数运算,结果一定为数字
3*"1"结果为3
80/"10"结果为10
"0"-true结果为-1
false-true结果为-1
相等运算符(==
)
相等运算符(==
)的转换
如果要比较的两个操作数的类型不同,相等运算符(==
)尝试将它们转换为相同的类型(尽量转换为数字),再检查它们是否相等
操作数的转换规则
-
字符串将被转换为数字
"99"
被转换为99
"2boys"
被转换为NaN
""
(空字符串)被转换为0
-
布尔值被转换为数字
true
被转换为1
false
被转换为0
-
null
和undefined
比较,结果为相等(因为它们都表示“没有值”)
"99"==99表达式结果为true
0==""表达式结果为true
true==1表达式结果为true
null==undefined表达式结果为true
>
和<
运算符
>
和<
运算符也会进行类型转换
"0"<true表达式结果为true
另外,两个字符串可以比较大小:根据字符的unicode
进行比较
"mango"<"melon"表达式结果为true(因为a的unicode小于e)
"Mango"<"mango"表达式结果为true(因为M的unicode小于m)
严格相等运算符/等同运算符(===
)
相等运算符(
==
)尝试将不同类型的操作数转换为相同的类型
严格相等运算符(===
)不进行类型转换
仅当两个操作数的值和类型都相同,===
才认为它们相等
在不会引入问题的前提下,自动执行类型转换的
==
可提供极大的便利
但在复杂网页中,建议只使用===
,这让代码更清晰、更安全,避免出现古怪的边界情况
不等运算符(!=
和!==
)
类比于==
和===
!=
将操作数类型转换为同一类型后,判断是否不等
!==
不转换:遇到两个不同类型的操作数,直接判断为不等
"99"!=99表达式结果为false
"99"!==99表达式结果为true
比较两个对象是否相等
说到对象相等性,可从简单的角度考虑,也可从复杂的角度考虑。
从简单的角度考虑,对象变量指向同一个对象,就认为它们相等;
从复杂的角度考虑,即使两个对象存储的值不同,只要这两个对象的类型相同,就认为它们相等。(但如何判断它们的类型确实相同呢?这个问题很重要,将在以后讨论。)
对象变量存储的是指向对象的引用
通过==
、===
判断两个对象是否相等(此时==
、===
完全等效):
仅当两个对象变量引用(指向)同一个对象,它们才相等