JavaScript——表達式和運算符

原始表達式

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ù)組不是正則表達式
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末非迹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子读宙,更是在濱河造成了極大的恐慌彻秆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件结闸,死亡現(xiàn)場離奇詭異唇兑,居然都是意外死亡,警方通過查閱死者的電腦和手機桦锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門扎附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人结耀,你說我怎么就攤上這事留夜。” “怎么了图甜?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵碍粥,是天一觀的道長。 經(jīng)常有香客問我黑毅,道長嚼摩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任霸褒,我火速辦了婚禮磺浙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘路克。我一直安慰自己潮秘,他們只是感情好琼开,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枕荞,像睡著了一般柜候。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上买猖,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天改橘,我揣著相機與錄音,去河邊找鬼玉控。 笑死飞主,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的高诺。 我是一名探鬼主播碌识,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虱而!你這毒婦竟也來了筏餐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤牡拇,失蹤者是張志新(化名)和其女友劉穎魁瞪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惠呼,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡导俘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剔蹋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旅薄。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泣崩,靈堂內(nèi)的尸體忽然破棺而出少梁,到底是詐尸還是另有隱情,我是刑警寧澤矫付,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布凯沪,位于F島的核電站,受9級特大地震影響买优,放射性物質(zhì)發(fā)生泄漏著洼。R本人自食惡果不足惜樟遣,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望身笤。 院中可真熱鬧,春花似錦葵陵、人聲如沸液荸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娇钱。三九已至,卻和暖如春绊困,著一層夾襖步出監(jiān)牢的瞬間文搂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工秤朗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煤蹭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓取视,卻偏偏與公主長得像硝皂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子作谭,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容