1、運算符的表示以及優先級
Javascript(以下簡寫為Js)的大部分運算符與C或Java是類似的。
記得剛學C語言時老師講的優先級口訣,非常好記:“括、單、算、移、關”“位、邏、條、賦、逗”,此處也可以套用一下,便于記憶。
(1)標點符號表示,比較普遍,略。
(2)用關鍵字表示,和一般的運算符一樣,都是正則運算符,只是更具有可讀性,此處詳細列出幾個。
delete:用于刪除指定的對象的屬性、數組元素或變量;結合性:R;運算數類型:lvalue
typeof:用于返回數據類型;結合性:R;運算數類型:任意
void:用于返回未定義的值;結合性:R;運算數類型:任意
以上三個屬于一元運算符,也叫單目運算符(即口訣中的“單”),運算數只有一個
instenceof:用于檢查對象類型;結合性:L;運算數類型:對象,構造函數
in:用于檢查對象的某個屬性是否存在;結合性:L;運算數類型:字符串(屬性名),對象
以上兩個屬于關系運算符(即口訣中的“關”)
注意:
lvalue:上面提到運算符delete的運算數類型是lvalue,lvalue指的是能夠合法出現在一個賦值表達式左邊的表達式。Js中變量、對象的屬性、數組的元素都是lvalue型的
結合性(associativity):一元運算符、賦值運算符、三元條件運算符結合性是R,從右到左進行運算。
?
2、部分運算符的使用說明
如果運算數非數字,則運算前都會先嘗試將其自動轉換為數字,這是算術運算過程中的通用特性。
(1)除法運算符(/)
Js中所有數字都是浮點型,這一點跟區分整數和浮點數的程序語言不同,如5/2結果是2.5,而不是2
除數為0的結果是正無窮大(Infinity)或者負無窮大(-Infinity),而0/0結果則是特殊值NaN
(2)模運算符(%)
取模運算通常都是整數,但Js中也適用于浮點數,如-4.3%2.1=-0.1
(3)=、==和===
為了區別,可將“=”讀作“得到或賦予”;“==”讀作“等于”;“===”讀作“完全等同”。
==與===用于比較兩個運算數是否相等
相同點:
Js中,數字、字符串、布爾值使用的都是值(value)比較,值相等則相等或等同。
比較對象、數組、函數時使用引用(reference),若兩個變量引用同一個對象,則兩變量才相等。也就是說兩個數組無論如何也不會相等,即使他們存放的元素完全相同。
NaN不與任何一個值(包括NaN本身)相等或等同,檢測一個值是否是NaN,可用全局函數isNaN()。
不同點:
=== | == |
類型不同,則不等同(!==) | 類型不同,仍然可能相等 |
? | ? 如一個是null,一個是undefined,則兩者相等 |
? | ? 若兩者轉換后的值(value)相等,則返回true |
? | ? 若一個是對象,另一個是數字或者字符串,則會先將對象轉換為原始類型的值。Js核心語言內部通常先嘗試valueof()轉換,再嘗試toString()轉換;但是對于Date類,則先執行toString()轉換。 |
(4)比較運算符
比較運算符只能在數字或字符串上執行,所以不是數字或字符串的運算數將會先轉換成數字或字符串。
當字符串與數字比較時,先轉換成數字,再執行數字比較。
(5)in 運算符
二元運算符,要求左邊運算數是一個字符串,或可以轉化為字符串,右邊運算數是一個對象或數組。
如果左邊字符串是右邊對象的一個屬性名,則返回true
(6)instenceof 運算符
二元運算符,要求左邊運算數是一個對象,右邊運算數是對象類的對象名。
如果左邊的對象是右邊對象名的一個實例,則返回true
(7)邏輯&&、||、!
常用于執行布爾代數,另外
“||” 也可以這么使用:var max=width||height||500;這一用法通常是選取一組備選值中第一個定義并且非空的值。
“!”對任何值x應用兩次都可以將該值轉換為一個布爾值。
(8)typeof 運算符
一元運算符,返回運算數的類型
若運算數是數字、字符串或布爾值,返回“number”、“string”或“boolean”
若運算數是對象、數組或null,返回“object”(運算數是Number、String或Boolean這樣的包裝對象時,也返回“object”)
若運算數是函數,返回“function”
若運算數是未定義的,返回“undefined”。
由此可見,typeof不能區別兩種不同的對象類型,若要區別,須使用其他方法,如使用 instenceof 運算符或 constructor 屬性(Object.constructor后面介紹)。
(9)delete 運算符
一元運算符,刪除指定的對象的屬性、數組元素或變量;刪除成功則返回true,刪除失敗返回false。
一些例子:
<script type="text/javascript">n = 123;var p = { x: 1, y: 2 };document.write(delete n); //truedocument.write(delete p.x); //true,刪除對象p的屬性xdocument.write(typeof p.x); //undefined,屬性x已經被刪除,不再存在document.write(delete p); //false,var語句聲明的變量不能被刪除document.write(delete o); //true, o不存在document.write(delete "a"); //true, ECMAScript標準規定,若delete的運算數不是屬性、數組、或變量時,返回true </script>
注意:delete影響的只是屬性值,并不影響被這些屬性引用的對象。
var o = new Object(); o.e1 = new Date(); //屬性e1是對對象Date()的引用 o.e2 = o.e1; //屬性e2也是對Date()的引用 delete o.e1; //只刪除o的屬性e1,對Date()對象沒有任何影響。 document.write(o.e2); //e2屬性此時仍然引用Date()對象
?
(10)數組和對象的存取運算符——“[]”和“.”
“.”要求左邊運算數是一個對象,右邊運算數是一個標識符(即對象的屬性名或方法的直接量名)。若該對象中沒有指定的屬性,則返回undefined
“[]”用于存取數組元素,也可用于存取對象的屬性。
注意:當“[]”用于關聯數組時,由于屬性名動態生成,所以不能使用運算符“.”,只能使用“[]”。
例如在使用for/in遍歷對象屬性時,for(f in o){ document.write(o[f]);} ,不能使用o.f,此處f只是變量而不是o的標識符。