原始表達式
JavaScript中原始表達式包含常量或直接量色瘩、關(guān)鍵字和變量
1.23; //數(shù)字直接量
"hello"; //字符串直接量
/pattern/; //正則表達式直接量
JavaScript中一些保留著構(gòu)成來原表達式
true; //返回一個布爾值:真
false; //返回一個布爾值:假
null; //返回一個值:空
this; //返回當前對象
最后第三種原始表達式是變量
i; //返回變量i的值
sum; //返回sum的值
undefined; //undefined是全局變量杖爽,和null不同,它不是一個關(guān)鍵字
當JavaScript代碼中出現(xiàn)來標識符诗赌,JavaScript會將其當做變量去查找它的值隅要,如果變量名不存在,表達式結(jié)果為undefined钠四。然而焕数,在ECMAScript5的嚴格模式下纱昧,對不存在的變量進行求值會拋出一個引用錯誤異常
對象和數(shù)組的初始化表達式
初始化的結(jié)果是一個新創(chuàng)建的數(shù)組。數(shù)組的元素是逗號分隔的表達式的值:
[]; //一個空數(shù)組:[]內(nèi)留空即表示該數(shù)組沒有任何元素
[1 + 2, 3 + 4]; //擁有兩個元素的數(shù)組堡赔,第一個是3识脆,第二個是7
數(shù)組表達式中的元素初始化表達式也可以是數(shù)組初始化表達式。也就是說加匈,這些表達式是可以嵌套的
var matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
數(shù)組直接量中的列表逗號之間的元素可以省略存璃,這時省略的空位會填充undefined。例如雕拼,下面這個數(shù)組包含5個元素纵东,其中三個元素是undefined
var sparseArray = [1, , , , 5];
對象初始化和數(shù)組初始化表達式非常類似,只是方括號被花括號代替啥寇,并且每個子表達式都包含一個屬性名和一個冒號作為前綴
var p = {x: 2.3, y: -1.2}; //一個擁有兩個屬性成員的對象
var q = {}; //一個空對象
q.x = 2.3; q.y; //q的屬性成員和p的一樣
對象直接量也可以嵌套偎球,比如
var rectangle = {
upperLeft: {x: 2, y: 2},
lowerRight: {x: 4, y: 5}
};
對象直接量中的屬性名稱可以是字符串而不是標識符
var p = {x: 3, y: 4};
var side = 1;
var square = {
"upperLeft": {x: p.x, y: p.y},
'lowerRight': {x: p.x, y: p.y}
};
函數(shù)定義表達式
//這個函數(shù)返回傳入?yún)?shù)值的平方
var square = function (x) {
return x * x;
}
屬性訪問表達式
var o = {x: 1, y: {z: 3}}; //一個示例對象
var a = [o, 4, [5, 6]]; //一個包含這個對象的示例數(shù)組
o.x;
o.y.z;
o["x"];
a[1];
a[2]["1"]
a[0].x
調(diào)用表達式
JavaScript中的調(diào)用表達式是一種調(diào)用函數(shù)或方法的語法表示
function f() {
}
f(); //f是一個函數(shù)表達式
Math.max(1,2,3); //Math.max是一個函數(shù)
對象創(chuàng)建表達式
new Object();
new Point(2, 3);
如果一個對象創(chuàng)建表達式不需要傳入任何參數(shù)給構(gòu)造函數(shù)的話,那么這對圓括號可以省略掉
new Object
new Date
運算符概述
運算符 | 操作 |
---|---|
++ | 前/后增量 |
-- | 前/后減量 |
- | 求反辑甜,減 |
+ | 轉(zhuǎn)換為數(shù)字衰絮,加,字符串連接符 |
~ | 按位求反 |
! | 邏輯非 |
delete | 刪除屬性 |
typeof | 檢測操作數(shù)類型 |
void | 返回undefined值 |
* | 乘 |
/ | 除 |
% | 求余 |
<< | 左位移 |
>> | 有符號右移 |
>>> | 無符號右移 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
instanceof | 測試對象類 |
in | 測試屬性是否存在 |
== | 判斷相等 |
!= | 判斷不等 |
=== | 判斷恒等 |
!== | 判斷非恒等 |
& | 按位與 |
^ | 按位異或 |
| | 按位或 |
&& | 邏輯與 |
邏輯或 | |
?: | 條件運算符 |
= | 變量賦值或?qū)ο髮傩再x值 |
*= | 運算且賦值 |
/= | 運算且賦值 |
%= | 運算且賦值 |
+= | 運算且賦值 |
-= | 運算且賦值 |
&= | 運算且賦值 |
^= | 運算且賦值 |
<<= | 運算且賦值 |
>>= | 運算且賦值 |
>>>= | 運算且賦值 |
, | 忽略第一個操作數(shù)磷醋,返回第二個操作數(shù) |
操作數(shù)的個數(shù)
二元運算符
將兩個表達式合并成一個稍復雜的表達式
一元運算符
將一個表達式轉(zhuǎn)換為另一個稍微復雜的表達式
三元操作符
條件判斷運算符“?:”猫牡,它將三個表達式合并成一個表達式。
算術(shù)表達式
“+”運算符
1 + 2; //=> 3
"hello" + " " + "there"; //=>"hello there"
"1" + "2" //=> "12"
加號的轉(zhuǎn)換規(guī)則優(yōu)先考慮字符串連接邓线,如果其中一個操作數(shù)是字符串或者轉(zhuǎn)換為字符串的對象淌友。另外一個操作數(shù)將會轉(zhuǎn)換為字符串,加法將進行字符串的連接操作骇陈。如果兩個操作都不是類字符串的震庭,那么都將進行算數(shù)加法運算。
1 + 12; //=>4:加法
"1" + "2"; //=> "12":字符串連接
"1" + 2; //=>"12":字符串連接
1 + {}; //=>"1[object object]"
true + true; //2:布爾值轉(zhuǎn)換為數(shù)字后做加法
2 + null; //2:null轉(zhuǎn)換為0后做加法
2 + undefined //NaN:undefined 轉(zhuǎn)換為NaN后做加法
運算結(jié)果是依賴于運算符的運算順序的你雌,
1 + 2 + "blind mice"; //=>"3 blind mice"
1 + (2 + "blind mice"); //=>"12 bind mice"
一元算術(shù)符
一元運算符作用于一個單獨的操作數(shù)器联,并產(chǎn)生一個新值
"+"和"-"是一元運算符,也是二元運算符
一元加法(+)
一元加法運算符把操作數(shù)轉(zhuǎn)換為數(shù)字(或者NaN)婿崭,并返回這個轉(zhuǎn)換后的數(shù)字拨拓。如果操作數(shù)本身就是數(shù)字,則直接返回這個數(shù)字
一元減法(-)
當“-”用來做一元運算符是逛球,它會根據(jù)需要把操作數(shù)轉(zhuǎn)換為數(shù)字千元,然后改變運算結(jié)果的符號
遞增(++)
遞增(++)運算符對其操作數(shù)進行增量操作,運算符將操作數(shù)轉(zhuǎn)換為數(shù)字颤绕,然后給數(shù)字加1幸海,并將加一后的數(shù)值重新賦值給變量祟身,數(shù)組元素或者對象屬性
當在運算符在操作數(shù)之前,稱為“前增”運算符物独,當在運算符之后袜硫,稱為“后增”運算符
var i = 1, j = ++i; //i和j的值都是2
var i = 1, j = i++; //i是2,j是1
遞減(-- )
當遞減運算符在操作數(shù)之后,操作數(shù)減1并返回減1之前的值挡篓。當遞減運算符在操作符的右側(cè)時婉陷,運算符和操作數(shù)之間不能有換行符。
位運算符
按位與(&)
位運算符“&”對它的整型操作數(shù)逐位執(zhí)行布爾與(and)操作官研。只有兩個操作數(shù)中相應(yīng)的位都是1秽澳,結(jié)果中的這一位才是1.
按位或(|)
位運算符“|”對它的整型操作數(shù)逐位執(zhí)行布爾或(OR)操作。如果其中一個操作數(shù)相應(yīng)的位為1戏羽,或者兩個操作數(shù)相應(yīng)位都是1担神,那么結(jié)果中的這一位就為1.
按位異或(^)
位 運算符“|” 對 它的 整型 操 作數(shù) 逐 位 執(zhí)行 布爾 異或( XOR) 操作。 異或 是指 第一個 操 作數(shù) 為 true 或第二個操作數(shù)中只有一個相應(yīng)位為1(不能同時為1)始花,那么結(jié)果中的這一位就是1
左移(<<)
將第一個操作數(shù)的所有二進制進行左移操作妄讯,移動的位數(shù)由第二個操作數(shù)指定,移動的位數(shù)是0~31之間的一個整數(shù)酷宵。將一個值左移1位相當于它乘以2亥贸,左移2位相當于成于4
帶符號右移(>>)
如果第一個操作數(shù)是整數(shù),移位后用0填補高位:如果第一個操作數(shù)是負的浇垦,移位后就用1填補高位炕置。將第一個值右移1位,相當于用他除2男韧,右移兩位相當于除以4
無符號右移(>>>)
運算符“>>>”和運算符">>"一樣讹俊,只是左邊的高位總是填補0,與原來的操作數(shù)符號無關(guān)
關(guān)系表達式
關(guān)系表達式總是返回一個布爾值煌抒,通常在if、while或者for語句中使用關(guān)系表達式厕倍。用以控制程序的執(zhí)行流程寡壮。
相等和不等運算符
= //得到或賦值
== //相等
=== //嚴格相等
!= //不等
!== //嚴格不相等
//(賦值、相等讹弯、恒等)
嚴格 相等 運算符“===” 首先 計算 其 操 作數(shù) 的 值况既, 然后 比較 這 兩個 值, 比較 過程 沒有 任何 類型 轉(zhuǎn)換:
- 如果 兩個 值 類型 不 相同组民, 則 它們 不相等棒仍。
- 如果 兩個 值 都是 null 或者 都是 undefined, 則 它們 不相等臭胜。
- 如果 兩個 值 都是 布爾 值 true 或 都是 布爾 值 false莫其, 則 它們 相等癞尚。
- 如果 其中 一個 值 是 NaN, 或者 兩個 值 都是 NaN乱陡, 則 它們 不相等浇揩。 NaN 和 其他 任何 值 都是 不相等 的, 包括它本身憨颠,通過x!==x來判斷x是否為NaN胳徽,只有在x為NaN的時候,這個表達式的值才為true
- 如果 兩個 值 為 數(shù)字 且 數(shù)值 相等爽彤, 則 它們 相等养盗。 如果 一個 值 為 0, 另一個 值 為-0适篙, 則 它們 同樣 相等往核。
- 如果兩個引用值指向同一個對象,數(shù)組或函數(shù)匙瘪,則它們是相等的铆铆。如果指向不同的對象,則它們是不相等的丹喻,盡管兩個對象具有完全一樣的屬性
相等運算符“==”和恒等運算符相似薄货,但是相等運算符的比較嚴格。如果兩個操作數(shù)不是同一類型碍论,那么相等運算符會嘗試進行一些類型轉(zhuǎn)換谅猾,然后進行比較
- 如果 兩個 操 作數(shù) 的 類型 相同, 則 和 上文 所述 的 嚴格 相等 的 比較 規(guī)則 一樣鳍悠。 如果 嚴格 相等税娜, 那么 比較 結(jié)果 為 相等。 如果 它們 不嚴 格 相等藏研, 則 比較 結(jié)果 為 不相等敬矩。
- 如果兩個操作數(shù)類型不同,“==”相等操作符也可能會認為它們相等蠢挡。弧岳、
- 如果一個值是null,另一個是undefined則它們相等
- 如果一個值是數(shù)字业踏,另一個是字符串禽炬,先將字符串轉(zhuǎn)換為數(shù)字,然后使用轉(zhuǎn)換后的值進行比較
- 如果其中一個值是true勤家,增將其轉(zhuǎn)換為1再進行比較腹尖,false則為0
比較運算符
比較運算符用來檢測連個操作數(shù)的大小關(guān)系(數(shù)值大小或者字母表的順序)
小于(<)
如果第一個操作數(shù)小于第二個操作數(shù),則“<”運算符的計算機結(jié)果為true伐脖;否則為false
大于(>)
如果第一個操作數(shù)大于第二個操作數(shù)热幔,則“>”運算符的計算結(jié)果為true乐设;否則為false
小于等于(<=)
如果第一個操作數(shù)小于或者等于你第二個操作數(shù),則“<=”運算符的計算結(jié)果為true断凶;否則為false伤提。
大于等于(>=)
如果第一個操作數(shù)大于或者等于第二個操作數(shù),則“>=”運算符結(jié)果為false认烁;否則為true肿男;
比較操作數(shù)可能是任意類型。然而却嗡,只有數(shù)字和字符串才能真正執(zhí)行比較操作舶沛,因此那些不是數(shù)字個字符串的操作數(shù)都將進行類型轉(zhuǎn)換
- 如果操作數(shù)為對象,那么這個對象將依照轉(zhuǎn)換規(guī)則轉(zhuǎn)換為原始值:如果valueOf()返回一個原始值窗价,那么直接使用這個原始值如庭。否則,使用toString()的轉(zhuǎn)換結(jié)果進行比較操作撼港。
- 在對象轉(zhuǎn)換為原始值之后坪它,如果鏈各個操作數(shù)都是字符串,那么將依照字母表的順序?qū)蓚€字符串進行比較帝牡。
- 在對象轉(zhuǎn)換為原始值之后往毡,如果至少有一個操作數(shù)不是字符串,那么兩個操作數(shù)都將轉(zhuǎn)換為數(shù)字進行數(shù)值比較靶溜。0和-0是相等的开瞭。Infinity比其它任何數(shù)字都大(本身除外),如果其中一個操作數(shù)是(轉(zhuǎn)換后是)NaN罩息,那么比較操作符總是返回false
對于那些不區(qū)分字母大小寫的比較來說嗤详,則需要首先將字符串全部換為小寫字母或者大寫字母,通過String.toLowerCase()和String.toUpperCase()做大小寫的轉(zhuǎn)換瓷炮。
對于數(shù)字和字符串操作符來說葱色,加號運算符和比較運算符的行為都有所不同,前者更偏愛字符串娘香,如果它的其中一個操作符是字符串的話冬筒,則進行字符串連接操作。而比較運算符則更加偏愛數(shù)字茅主,只有在兩個操作符都是字符串的時候,才會進行字符串的比較:
1 + 2; //加法土榴,結(jié)果是3
"1" + "2"; //字符串連接诀姚,結(jié)果是"12"
"1" + 2; //字符串連接,2轉(zhuǎn)換為"2"玷禽,結(jié)果是"12"
11 < 2; //數(shù)字的比較赫段,結(jié)果為false
"11" < "13"; //字符串比較呀打,結(jié)果為true
"11" < 3; //數(shù)字比較,結(jié)果為false
"noe" < 3; //數(shù)字的比較糯笙,“one”轉(zhuǎn)換為NaN贬丛,結(jié)果為false
in運算符
in運算符希望它的左操作數(shù)是一個字符串或可以轉(zhuǎn)換為字符串,希望它的右操作數(shù)是一個對象给涕。如果右側(cè)的對象擁有一個名為左操作數(shù)值得屬性名豺憔,那么表達式返回true
var point = {x: 1, y: 1}; //定義一個對象
"x" in point; //=> true :對象有一個名為“x”的屬性
"z" in point; //=>false:對象中不存在名為"z"的屬性
"toString" in point; //true 對象繼承了toString()方法
var data = [7,8,9]; //擁有三個元素的數(shù)組
"0" in data; //=> true 數(shù)組包含元素"0"
1 in data; //=> true 數(shù)字轉(zhuǎn)換為字符串
3 in data; //=>false 沒有索引為3的元素
instanceof運算符
instanceof運算符希望左操作數(shù)是一個對象,右操作數(shù)標識對象的類够庙。如果左側(cè)的對象時右側(cè)類的實例恭应,則表達式返回true;否則返回false耘眨。
var d = new Date();
d instanceof Date; //計算結(jié)果為true昼榛,d是由Date()創(chuàng)建的
d instanceof Object; //計算結(jié)果為true,所有的對象都是Object的實例
d instanceof Number; //計算結(jié)果為false剔难,d不是Number對象
var a = [1, 2, 3];
a instanceof Array; //計算結(jié)果為true胆屿,a是一個數(shù)組
a instanceof Object; //計算結(jié)果為true,所有的數(shù)組都是對象
a instanceof RegExp; //計算結(jié)果為false偶宫,數(shù)組不是正則表達式