JavaScript操作符

原文

博客原文

大綱

前言
1拒炎、一元操作符
2、位操作符
3挨务、布爾操作符(邏輯操作符)
4击你、乘性操作符
5、加性操作符
6谎柄、關(guān)系操作符(比較運(yùn)算符)
7果漾、相等操作符(比較運(yùn)算符)
8、條件操作符
9谷誓、賦值操作符
10绒障、逗號操作符

前言

ECMAScript描述了一組用于操作數(shù)據(jù)值的操作符,包括算數(shù)操作符(如加號和減號)捍歪、位操作符户辱、關(guān)系操作符和相等操作符鸵钝。ECMAScript操作符的與眾不同之處在于,它們能夠適用于很多值庐镐,例如字符串恩商、數(shù)字值、布爾值必逆,甚至對象怠堪。不過,在應(yīng)用于對象時(shí)名眉,相應(yīng)的操作符通常都會調(diào)用對象的valueOf()和(或)toString()方法粟矿,以便取得可以操作的值。

1损拢、一元操作符

1.1陌粹、一元操作符:只能操作一個(gè)操作一個(gè)數(shù)的操作符叫做一元操作符。
1.2福压、一元操作符有遞增掏秩、遞減、一元加荆姆、一元減蒙幻、delete、void胆筒、typeof杆煞、按位非(~)、按位與(8骸)决乎。
1.3、遞增有前置遞增和后置遞增派桩,遞減有前置遞減也有后置遞減
1.4构诚、遞增和遞減操作符對任何類型的數(shù)據(jù)都是有效的,若遇到不是Number類型铆惑,會先將其轉(zhuǎn)換其Number的類型范嘱,轉(zhuǎn)換方法和轉(zhuǎn)型函數(shù)Number()一致。
1.5员魏、一元加和一元減主要用于基本的算數(shù)運(yùn)算丑蛤,其主要是轉(zhuǎn)換數(shù)據(jù)的正負(fù)性,對任何類型的數(shù)據(jù)都有效撕阎,若不是Number類型受裹,將按照Number()的轉(zhuǎn)換方式將其先轉(zhuǎn)換成Number類型。

2、位操作符

2.1棉饶、位操作符用于最基本的層次上厦章,即按內(nèi)存中表示數(shù)值的位來操作數(shù)值。
2.2照藻、位操作符并不直接操作64位的值袜啃,而是先將64位的值轉(zhuǎn)換成32位的整數(shù),然后執(zhí)行操作幸缕,最后再將結(jié)果轉(zhuǎn)換回64位群发。對于開發(fā)人員來說,由于64位存儲格式是透明的发乔,因此整個(gè)過程就像是只存在32位的整數(shù)一樣熟妓。
2.3、ECMAScript會盡力向我們隱藏所有這些信息列疗,換句話說滑蚯,在以二進(jìn)制字符串輸出一個(gè)負(fù)數(shù)時(shí)浪蹂,我們看到的只是這個(gè)負(fù)數(shù)絕對值的二進(jìn)制碼前面加上了一個(gè)負(fù)號抵栈。
2.4、由于運(yùn)算的過程中會將64位數(shù)值轉(zhuǎn)換為32位數(shù)值坤次,而這個(gè)轉(zhuǎn)換過程的副效應(yīng)是在對特殊的值:NaN和Infinity值的時(shí)候古劲,會將其當(dāng)做0來處理。
2.5缰猴、對于非Number的數(shù)值产艾,會先使用Number()方法將其轉(zhuǎn)換成Number類型再進(jìn)行位運(yùn)算。
2.6滑绒、位操作符主要有:

/*
  按位非(NOT)
  按位非操作的本質(zhì):操作數(shù)的負(fù)值減1,但是按位非是在數(shù)值表示的最底層執(zhí)行操作闷堡,因此速度更快
*/
var num1 = 25;
var num2 = ~num1;
console.log(num2);//-26
var num3 = -num1 -1
console.log(num3);//-26
/*
  按位與(AND)
*/
var num1 = 25 & 3;
console.log(num1);//1
/*
  按位或(OR)
*/
var num1 = 25 | 3;
console.log(num1);//27
/*
  按位異或(XOR)
*/
var num1 = 25 ^ 3;
console.log(num1);//26
/*
  左移(<<)
  左移的本質(zhì)是將要左移的數(shù)乘以2的左移次方的結(jié)果
*/
var num1 = 2;
var num2 = num1 << 5;
console.log(num2);//64
console.log(2*32);//64//2^5=32
var num1 = 7;
var num2 = num1 << 5;
console.log(num2);//224
console.log(7*32);//224
/*
  有符號的右移(>>)
*/
var num1 = 64;
var num2 = num1 >> 5;
console.log(num2);
console.log(64/32);//2^5=32
/*
  無符號右移(>>>)
*/
var num1 = 64;
var num2 = num1 >>> 5;
console.log(num2);
console.log(64/32);//2^5=32
3、布爾操作符(邏輯操作符)

布爾操作符一共有3個(gè):非(NOT)疑故、與(AND)杠览、或(OR)

3.1、邏輯非(!)
  邏輯非操作符首先會將它的操作數(shù)轉(zhuǎn)換為一個(gè)布爾值,然后再對其求反灵奖。
  邏輯非操作符可以用于將一個(gè)值轉(zhuǎn)換為與其對應(yīng)的布爾值震蒋,通過同時(shí)使用兩個(gè)邏輯非操作符來
達(dá)到Boolean()的效果
  邏輯非操作符遵循下列規(guī)則:
        如果操作數(shù)是一個(gè)對象,返回false;
        如果操作數(shù)是一個(gè)空字符串锰茉,返回true;
        如果操作數(shù)是一個(gè)非空字符串,返回false;
        如果操作數(shù)是數(shù)值0,返回true;
        如果操作數(shù)是任意非0數(shù)值(包括Infinity),返回false;
        如果操作數(shù)是null,返回true;
        如果操作數(shù)是NaN,返回true;
        如果操作數(shù)是undefined,返回true
3.2佛点、邏輯與(&&)
  邏輯與操作可以應(yīng)用于任何類型的操作數(shù),而不僅僅是布爾值黎比。在有一個(gè)操作數(shù)不是布爾值的
情況下恋脚,邏輯與操作就不一定返回布爾值腺办;此時(shí),他遵循下列規(guī)則:
  邏輯與操作屬于短路操作糟描,即如果第一個(gè)操作數(shù)能夠決定結(jié)果怀喉,那么就不會再對第二個(gè)操作
數(shù)求值。即如果第一個(gè)操作數(shù)是false船响,那么返回false躬拢,下列的操作也就沒有了。
    如果第一個(gè)操作數(shù)是對象见间,則返回第二個(gè)操作數(shù)
    如果第二個(gè)操作數(shù)是對象聊闯,則只有在第一個(gè)操作數(shù)的求值結(jié)果為true的情況下才會返回
該對象
    如果兩個(gè)操作數(shù)都是獨(dú)享,則返回第二個(gè)操作數(shù)
    如果有一個(gè)操作數(shù)是null米诉,則返回null
    如果有一個(gè)操作數(shù)是NaN菱蔬,則返回NaN
    如果有一個(gè)操作數(shù)是undefined,則返回undefined
3.3史侣、邏輯或(||)
  與邏輯與操作相似拴泌,如果有一個(gè)操作數(shù)不是布爾值,邏輯或也不一定返回布爾值惊橱;此時(shí)蚪腐,它
遵循下列規(guī)則:
  邏輯非操作符是短路操作符,也就是說税朴,如果第一個(gè)操作數(shù)的求值結(jié)果為true回季,就不會對第
二個(gè)操作數(shù)求值了,也就不會對下列操作進(jìn)行判斷了
    如果第一個(gè)操作數(shù)是對象正林,則返回第一個(gè)操作數(shù)
    如果第一個(gè)操作數(shù)的求值結(jié)果為false泡一,則返回第二個(gè)操作數(shù)
    如果兩個(gè)操作數(shù)都是對象,則返回第一個(gè)操作數(shù)
    如果兩個(gè)操作數(shù)都是null觅廓,則返回null
    如果兩個(gè)操作數(shù)都是NaN鼻忠,則返回NaN
    如果兩個(gè)操作數(shù)都是undefined,則返回undefined
4哪亿、乘性操作符

乘性操作有:乘法粥烁、除法、求模
在操作非數(shù)值的情況下蝇棉,會先將非數(shù)值的數(shù)據(jù)通過Number()的方法將其轉(zhuǎn)換成數(shù)值類型再進(jìn)行計(jì)算

4.1讨阻、乘法
  如果乘積超過了ECMAScript數(shù)值的表示范圍,則返回Infinity和-Infinity
  如果有一個(gè)操作數(shù)是NaN篡殷,則結(jié)果是NaN
  如果是Infinity與0相乘钝吮,則結(jié)果是NaN
  如果是Infinity與非0數(shù)值相乘,則結(jié)果是Infinity或-Infinity,取決于有符號操作數(shù)
的符號
  如果是Infinity與Infinity相乘奇瘦,則結(jié)果是Infinity
  如果有一個(gè)操作數(shù)不是數(shù)值棘催,則在后臺調(diào)用Number()將其轉(zhuǎn)換為數(shù)值,然后再應(yīng)用上面的
規(guī)則.
4.2耳标、除法
  如果商超過了ECMAScript數(shù)值的表示范圍醇坝,則返回Infinity或-Infinity
  如果有一個(gè)操作數(shù)是NaN,則結(jié)果是NaN
  如果是Infinity被Infinity除,則結(jié)果是NaN
  如果是零被零除次坡,則結(jié)果是NaN
  如果是非零的有限數(shù)被零除呼猪,則結(jié)果是Infinity或-Infinity,取決于有符號操作數(shù)的符號
  如果是Infinity被任何非零數(shù)值除砸琅,則結(jié)果是Infinity或-Infinity宋距,取決于有符號操作數(shù)
的符號
4.3、求模
  如果被除數(shù)是無窮大值而除數(shù)是有限大的數(shù)值症脂,則結(jié)果是NaN
  如果被除數(shù)是有限大的數(shù)值而除數(shù)是零谚赎,則結(jié)果是NaN
  如果是Infinity被Infinity除,則結(jié)果是NaN
  如果被除數(shù)是有限大的數(shù)值而除數(shù)是無窮大的數(shù)值诱篷,則結(jié)果是被除數(shù)
  如果被除數(shù)是零壶唤,則結(jié)果是零
5、加性操作符

加性操作有:加法兴蒸、減法

5.1视粮、加法
  如果兩個(gè)操作數(shù)都是數(shù)值细办,則執(zhí)行常規(guī)的加法計(jì)算橙凳,有如下特殊規(guī)則
  如果有一個(gè)操作數(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

如果有一個(gè)操作數(shù)是字符串瓤狐,那么就有如下規(guī)則
  如果操作數(shù)都是字符串瞬铸,則將兩個(gè)字符串拼接起來
  如果有一個(gè)操作數(shù)是字符串,另一個(gè)不是字符串础锐,則會通過toString()方法獲取相應(yīng)的字符
串嗓节,然后再將其拼接起來
5.2、減法
  同樣的皆警,減法對于數(shù)據(jù)的操作也有其特殊性
  如果有一個(gè)操作數(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
6、關(guān)系操作符(比較運(yùn)算符)

關(guān)系操作符:< 外驱、> 系洛、 <= 、>=

6.1略步、不同類型數(shù)據(jù)之間的比較
  如果兩個(gè)操作數(shù)都是數(shù)值描扯,則執(zhí)行數(shù)值比較
  如果兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對應(yīng)的字符編碼值(從頭一一對比趟薄,有結(jié)果
就停止)
  如果一個(gè)操作數(shù)是數(shù)值绽诚,則將另一個(gè)操作數(shù)轉(zhuǎn)換成一個(gè)數(shù)值,然后進(jìn)行比較
  如果一個(gè)操作數(shù)是對象杭煎,則調(diào)用對象的valueOf()方法恩够,用得到的結(jié)果執(zhí)行比較,如果沒有
valueOf()則調(diào)用toString()方法羡铲,用得到的結(jié)果執(zhí)行操作
  如果一個(gè)操作數(shù)是布爾值蜂桶,則將其轉(zhuǎn)換為數(shù)值,然后再比較
  任何操作數(shù)與NaN進(jìn)行比較也切,結(jié)果都是false
7扑媚、相等操作符(比較運(yùn)算符)

相等操作符有相等、不相等(——先轉(zhuǎn)換再比較)和全等雷恃、不全等(——僅比較不轉(zhuǎn)換)疆股。

7.1、如果是不同數(shù)據(jù)類型倒槐,比較之前需要進(jìn)行轉(zhuǎn)型操作
  如果有一個(gè)操作數(shù)是布爾值旬痹,則在比較的時(shí)候先將其轉(zhuǎn)換為數(shù)值,false為0讨越,true為1
  如果一個(gè)操作數(shù)是字符串两残,則另一個(gè)操作數(shù)是數(shù)值,則比較之前先將字符串轉(zhuǎn)換為數(shù)值
  如果一個(gè)操作數(shù)是對象把跨,另一個(gè)不是人弓,則調(diào)用對象的valueOf()方法,得到基本數(shù)據(jù)類型再按
前面的規(guī)則比較
7.2节猿、特殊值的特殊比較
  null和undefined是相等的
  要比較相等性之前票从,不能將null和undefined轉(zhuǎn)換成其他任何職
  如果有一個(gè)操作數(shù)是NaN漫雕,則相等操作符返回false,即使兩個(gè)操作數(shù)都是NaN峰鄙,也返回false
  如果兩個(gè)操作數(shù)都是對象浸间,則比較他們是不是同一個(gè)對
象,如果兩個(gè)操作數(shù)都指向同一個(gè)對象吟榴,則相等
    
    null == undefined  true
    "NaN" == NaN       false
    5 == NaN           false
    NaN == NaN         false
    NaN != NaN         true
    false == 0         true
    true == 1          true
    true == 2          false
    undefined ==0      false
    null == 0          false
    "5" == 5           true
7.3魁蒜、全等和不全等

除了在比較之前不轉(zhuǎn)換數(shù)據(jù)類型之外,全等和不全等操作符與相等和不相等操作符沒有什么區(qū)別吩翻。
由于相等和不相等操作符存在類型轉(zhuǎn)換問題兜看,而為了保持代碼中數(shù)據(jù)類型的完整性,我們推薦使用全等和不全等操作符狭瞎。

8细移、條件操作符

條件操作符算是ECMAScript最靈活的一種操作符

var variable = boolean_expression ? true_value : false_value;

求最大值

var max = (num1 > num2) ? num1 : num2;
9、賦值操作符

簡單的賦值操作符由等于號(=)表示熊锭,其作用就是把右側(cè)的值賦給左側(cè)的變量弧轧。

var num = 10;
10、逗號操作符

使用逗號操作符可以在一條語句中執(zhí)行多個(gè)操作碗殷,如下面的例子所示:

var num1=1,num2=2,num3=3

逗號操作符多用于聲明多個(gè)變量精绎;但除此之外,逗號操作符還可以用于賦值锌妻。在用于賦值時(shí)代乃,逗號操作符總會返回表達(dá)式中的最后一項(xiàng),如下面的例子所示:

var num = (5,1,5,8,0);//num的值為0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仿粹,一起剝皮案震驚了整個(gè)濱河市搁吓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牍陌,老刑警劉巖擎浴,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件员咽,死亡現(xiàn)場離奇詭異毒涧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贝室,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門契讲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滑频,你說我怎么就攤上這事捡偏。” “怎么了峡迷?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵银伟,是天一觀的道長你虹。 經(jīng)常有香客問我,道長彤避,這世上最難降的妖魔是什么傅物? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮琉预,結(jié)果婚禮上董饰,老公的妹妹穿的比我還像新娘。我一直安慰自己圆米,他們只是感情好卒暂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娄帖,像睡著了一般也祠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上近速,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天齿坷,我揣著相機(jī)與錄音,去河邊找鬼数焊。 笑死永淌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佩耳。 我是一名探鬼主播遂蛀,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼干厚!你這毒婦竟也來了李滴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蛮瞄,失蹤者是張志新(化名)和其女友劉穎所坯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挂捅,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芹助,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闲先。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状土。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伺糠,靈堂內(nèi)的尸體忽然破棺而出蒙谓,到底是詐尸還是另有隱情,我是刑警寧澤训桶,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布累驮,位于F島的核電站酣倾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谤专。R本人自食惡果不足惜灶挟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毒租。 院中可真熱鬧稚铣,春花似錦、人聲如沸墅垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽算色。三九已至抬伺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灾梦,已是汗流浹背峡钓。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留若河,地道東北人能岩。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像萧福,于是被迫代替她去往敵國和親拉鹃。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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

  • 一元操作符 只能操作一個(gè)值的操作符鲫忍。 遞增和遞減操作符 前置型:位于要操作的變量之前膏燕; 后置型:位于要操作的變量之...
    Sketch閱讀 332評論 0 0
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,129評論 0 13
  • 第1章 JavaScript 簡介 JavaScript 具備與瀏覽器窗口及其內(nèi)容等幾乎所有方面交互的能力悟民。 歐洲...
    力氣強(qiáng)閱讀 1,115評論 0 0
  • 1.遞增與遞減操作符 前置遞增和遞減操作時(shí)坝辫,變量的值都是在語句被求值之前改變的 后置遞增和遞減操作是在包含他們的語...
    閃電西蘭花閱讀 193評論 0 0
  • 1近忙、標(biāo)識符 標(biāo)識符是指變量、函數(shù)鸦泳、屬性的名字银锻,或函數(shù)的參數(shù)。 格式規(guī)則: 第一個(gè)字符必須是一個(gè)字母做鹰、下劃線(_)或...
    霜天曉閱讀 693評論 0 0