4.5 加性操作符
4.5.1 加法
如果兩個操作符都是數(shù)值呻右,執(zhí)行常規(guī)的加法計算跪妥,然后根據(jù)下列規(guī)則返回結(jié)果:
- 如果有一個操作數(shù)是
NaN
,則結(jié)果是NaN
- 如果是
Infinity
加Infinity
声滥,則結(jié)果是Infinity
- 如果是
-Infinity
加-Infinity
眉撵,則結(jié)果是-Infinity
- 如果是
Infinity
加-Infinity
侦香,則結(jié)果是NaN
- 如果是
+0
加+0
,則結(jié)果是+0
- 如果是
-0
加-0
纽疟,則結(jié)果是-0
- 如果是
+0
加-0
罐韩,則結(jié)果是+0
不過,如果有一個操作數(shù)是字符串污朽,那么就要應(yīng)用如下規(guī)則:
- 如果兩個操作數(shù)都是字符串散吵,則將第二個操作數(shù)與第一個操作數(shù)拼接起來
- 如果只有一個操作數(shù)是字符串,則將另一個操作數(shù)轉(zhuǎn)換為字符串蟆肆,然后再將兩個字符串拼接起來矾睦。
4.5.2 減法
如果兩個操作符都是數(shù)值,執(zhí)行常規(guī)的減法計算炎功,然后根據(jù)下列規(guī)則返回結(jié)果:
- 如果有一個操作數(shù)是
NaN
枚冗,則結(jié)果是NaN
- 如果是
Infinity
減Infinity
,則結(jié)果是NaN
- 如果是
-Infinity
減-Infinity
蛇损,則結(jié)果是-NaN
- 如果是
Infinity
減-Infinity
赁温,則結(jié)果是Infinity
- 如果是
-Infinity
減Infinity
,則結(jié)果是-Infinity
- 如果是
+0
減+0
淤齐,則結(jié)果是+0
- 如果是
+0
減-0
股囊,則結(jié)果是-0
- 如果是
-0
減-0
,則結(jié)果是+0
- 如果有一個操作數(shù)是字符串更啄、布爾值毁涉、
null
或undefined
,則先在后臺調(diào)用Number()
函數(shù)將其轉(zhuǎn)換為數(shù)值锈死,然后再根據(jù)前面的規(guī)則執(zhí)行減法計算。如果轉(zhuǎn)換的結(jié)果是NaN
穆壕,則減法的結(jié)果就是NaN
- 如果有一個操作數(shù)是對象待牵,則調(diào)用對象的
valueOf()
方法取得表示該對象的數(shù)值。如果得到的值是NaN
喇勋,則減法的結(jié)果就是NaN
缨该。如果對象沒有valueOf()
方法,則調(diào)用其toString()
方法并將得到的字符串轉(zhuǎn)換為數(shù)值川背。
4.6 關(guān)系操作符
當關(guān)系操作符的操作數(shù)使用了非數(shù)值時贰拿,也要及你想那個數(shù)據(jù)轉(zhuǎn)換或完成某些奇怪的操作。以下就是相應(yīng)的規(guī)則熄云。
- 如果兩個操作數(shù)都是數(shù)值膨更,則執(zhí)行數(shù)值比較
- 如果兩個操作數(shù)都是字符串,則比較兩個字符串對應(yīng)的字符編碼值
- 如果另一個操作數(shù)是數(shù)值缴允,則將另一個操作數(shù)轉(zhuǎn)換為一個數(shù)值荚守,然后執(zhí)行數(shù)值比較
- 如果一個操作數(shù)是對象,則調(diào)用這個對象的
valueOf()
方法,用得到的結(jié)果按照前面的規(guī)則執(zhí)行比較矗漾。如果對象沒有valueOf()
方法锈候,則調(diào)用toString()
方法,并用得到的結(jié)果根據(jù)前面的規(guī)則執(zhí)行比較 - 如果一個操作數(shù)是布爾值敞贡,則先將其轉(zhuǎn)換為數(shù)值泵琳,然后再執(zhí)行比較。
4.7 相等操作符
在ECMAScript
中誊役,提供兩組操作符:相等和不想等——先轉(zhuǎn)換再比較获列;全等和不全等——僅比較而不轉(zhuǎn)換
4.7.1 相等和不想等
相等操作符由兩個等于號(==
)表示,如果兩個操作數(shù)相等势木,則返回true
蛛倦。而不想等操作符由!=
表示啦桌,如果兩個操作數(shù)不想等溯壶,則返回true
。這兩個操作符都會先轉(zhuǎn)換操作數(shù)(通常為強制轉(zhuǎn)型)甫男,然后再比較它們的相等性且改。
在轉(zhuǎn)換不同的數(shù)據(jù)類型時,相等和不想等操作符遵循下列基本規(guī)則:
- 如果有一個操作數(shù)是布爾值板驳,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——
false
轉(zhuǎn)換為0
又跛,而true
轉(zhuǎn)換為1
- 如果一個操作數(shù)是字符串,另一個操作數(shù)是數(shù)值若治,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值
- 如果一個操作數(shù)是對象慨蓝,另一個操作數(shù)不是,則調(diào)用對象的
valueOf()
方法端幼,用得到的基本類型值按照前面的規(guī)則進行比較
這兩個操作符在進行比較時則要遵循下列規(guī)則:
表達式 | 值 | 表達式 | 值 |
---|---|---|---|
null == undefined |
true |
true == 1 |
true |
"NaN"== NaN |
false |
true == 2 |
false |
5 == NaN |
false |
undefined == 0 |
false |
NaN == NaN |
false |
null == 0 |
false |
NaN != NaN |
true |
"5" == 5 |
true |
false == 0 |
true |
4.7.2 全等和不全等
除了在比較之前不轉(zhuǎn)換操作數(shù)之外礼烈,全等和不全等操作符與相等和不想等操作符沒有什么不同。全等操作符由===
表示婆跑,它只在兩個操作數(shù)未經(jīng)轉(zhuǎn)換就相等的情況下返回true
此熬。不全等操作符由!==
表示滑进,它只在兩個操作數(shù)未經(jīng)轉(zhuǎn)換就不相等的情況下返回true
犀忱。
記住:null == undefined
會返回true
扶关,因為它們是類似的值阴汇;但null === undefined
會返回false
,因為它們是不同類型的值驮审。
五鲫寄、語句
5.1 for-in語句
for-in
語句是一種精準的迭代語句吉执,可以用來枚舉對象的屬性。以下是for-in
語句的語法:
for(var propName in window){
document.write(propName);
}
說明:結(jié)果和常規(guī)的for
循環(huán)沒有什么不同地来,只是語法更簡潔戳玫。但是,如果表示要迭代的對象的變量值為null
或undefined
未斑,for-in
語句會拋出錯誤咕宿。建議在使用此語法之前檢查對象的值是不是null
或undefined
。
5.2 label語句
直接看示例:
start : for(var i = 0; i < count; i++){
alert(i);
}
這個例子中定義的start
標簽可以在將來由break
或continue
語句引用蜡秽。加標簽的語句一般都是要與for
語句等循環(huán)語句配合使用府阀。
5.3 break和continue語句
具體的語法這里不細說,和C
語言一樣芽突。下面看一個示例:
var num = 0;
outermost:
for(var i = 0; i < 10; i++){
for(var j = 0; j < 10; j++){
if(i == 5 && j == 5){
continue outermost;
}
num++;
}
}
alert(num);//95
說明:當i试浙、j
的值都是5
的時候,則跳出循環(huán)寞蚌。
5.4 with語句(不建議使用)
with
語句的作用是將代碼的作用域設(shè)置到一個特定的對象中田巴。看一個示例:
var qs = location.search.substring(1);
var hostName = location.hostName;
var url = location.href;
可以看到上述代碼都包含location
對象挟秤,如果使用with
語句壹哺,可以將上述代碼改寫如下:
with(location){
var qs = search.substring(1);
var hostName = hostName;
var url = href;
}
六、函數(shù)
相關(guān)細節(jié)這里不多數(shù)艘刚。嚴格模式對函數(shù)有一些限制:
- 不能把函數(shù)命名為
eval
或arguments
管宵; - 不能把參數(shù)命名為
eval
或arguments
; - 不能出現(xiàn)兩個命名參數(shù)同名的情況
如果發(fā)生上述情況攀甚,代碼將無法執(zhí)行箩朴。
6.1 理解參數(shù)
在ECMAScript
中,函數(shù)不介意傳遞進來多少各參數(shù)秋度,也不在乎傳遞進來參數(shù)是什么數(shù)據(jù)類型隧饼。也就是說,即便你定義的函數(shù)只接受兩個參數(shù)静陈,在調(diào)用這個函數(shù)時也未必一定要傳遞兩個參數(shù)。實際上诞丽,傳遞進來的參數(shù)全部保存在arguments
對象中鲸拥,此對象與數(shù)組類似(并不是Array
的實例),但是可以像數(shù)組那樣訪問每一個元素僧免。關(guān)于arguments
的行為刑赶,還有一點比較有意思,就是它的值永遠與對應(yīng)命名參數(shù)的值保持同步懂衩。如:
function doAdd(num1, num2){
arguments[1] = 10;
alert(arguments[0] + num2);
}
每次執(zhí)行這個doAdd()
函數(shù)都會重寫第二個參數(shù)撞叨,將第二個參數(shù)的值修改為10
金踪。因為arguments
對象中的值會自動反映到對應(yīng)的命名參數(shù),所以修改arguments[1]
牵敷,也就修改了num2
胡岔,結(jié)果它們都變?yōu)?code>10。注意:沒有傳遞值的命名參數(shù)將自動被賦予undefined
值枷餐。所有的參數(shù)傳遞都是值靶瘸,不可能通過引用傳遞參數(shù)。
6.2 沒有重載
function addSomeNumber(num){
return num + 10;
}
//會覆蓋掉上一個同名函數(shù)
function addSomeNumber(num){
return num + 200;
}
var result = addSomeNumber(100);//300
說明:從代碼中可以看到無法像其他面向?qū)ο笳Z言那樣進行重載毛肋,當然怨咪,可以通過檢查傳入函數(shù)中參數(shù)的類型和數(shù)量并做出不同的反應(yīng)來模仿方法的重載。