摘要:一元運(yùn)算符一元運(yùn)算符只能操作一個(gè)值。邏輯非邏輯非參考數(shù)據(jù)判斷邏輯非運(yùn)算符可以用于任何值。無(wú)論這個(gè)值是什么數(shù)據(jù)類(lèi)型,這個(gè)運(yùn)算符都會(huì)返回一個(gè)布爾值。
前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總
歡迎提issues斧正:運(yùn)算符
JavaScript-運(yùn)算符JavaScript 有一系列操作數(shù)據(jù)值的運(yùn)算符,運(yùn)算符按照特定運(yùn)算規(guī)則對(duì)操作數(shù)進(jìn)行運(yùn)算,將簡(jiǎn)單的表達(dá)式組合成復(fù)雜的表達(dá)式。
一元運(yùn)算符一元運(yùn)算符只能操作一個(gè)值。
累加累減運(yùn)算符:
var xzavier = 123; xzavier++ //把變量累加1,相當(dāng)于xavier = xavier + 1 ++xzavier //把變量累加1,相當(dāng)于xavier = xavier + 1 xzavier-- //把變量累減1,相當(dāng)于xavier = xavier - 1 --xzavier //把變量累減1,相當(dāng)于xavier = xavier - 1
上述代碼不只是++--前后置的區(qū)別,當(dāng)有賦值操作時(shí),區(qū)別為:
var xzavier = 1; var num1 = ++xzavier; //num1 值為2 -- 第1點(diǎn) var num2 = xzavier++; //num2 值為1 -- 第2點(diǎn)
對(duì)于第1點(diǎn):
num1得到的值是 ++xzavier表達(dá)式的返回值,這個(gè)表達(dá)式返回xzavier自加1之后的值,這一點(diǎn)可以在控制臺(tái)打印來(lái)觀察。當(dāng)然,xzavier變量也自加1,值也變?yōu)榱?b>2
對(duì)于第2點(diǎn):
num2得到的值是 ++xzavier表達(dá)式的返回值,這個(gè)表達(dá)式返回xzavier本身的值(自加1之前的值),這一點(diǎn)可以在控制臺(tái)打印來(lái)觀察。之后++后置操作符對(duì)xzavier起作用,于是xzavier自加1,xzavier的值現(xiàn)在是2了。
也就是說(shuō),如果定義num1和num2之后的這個(gè)表達(dá)式返回值作用的優(yōu)先級(jí)為R,那么++前置操作符作用的優(yōu)先級(jí)是大于R的,而++后置操作符作用的優(yōu)先級(jí)是小于R的。
加減運(yùn)算符本應(yīng)參與運(yùn)算,但也可以進(jìn)行類(lèi)型轉(zhuǎn)換:
var xzavier1 = "xzavier", xzavier2 = "123", xzavier3 = false, xzavier4 = 123, xzavier5 = "-123"; +xzavier1 //NaN +xzavier2 //123 +xzavier3 //0 +xzavier4 //123 +xzavier5 //-123 -xzavier1 //NaN -xzavier2 //-123 -xzavier3 //0 -xzavier4 //-123 -xzavier5 //123 // 用+轉(zhuǎn)換規(guī)則手寫(xiě)一個(gè)parseInt function myParseInt(value) { if(typeof value === "number") { return value; } if(typeof value === "string" && value.length > 0) { value = value.match(/^d+/); if (Array.isArray(value)) { return +value[0]; } } return NaN; }
當(dāng)然,還有一些方法也可以被當(dāng)做一元運(yùn)算符,比如:
typeof 方法是一元運(yùn)算符,可操作單個(gè)值,判斷類(lèi)型。
delete 也是一元運(yùn)算符, 它用來(lái)刪除對(duì)象屬性或者數(shù)組元素。
算術(shù)運(yùn)算符在運(yùn)算時(shí)候如果運(yùn)算值不是數(shù)值,那么后臺(tái)會(huì)先使用 Number() 轉(zhuǎn)型函數(shù)將其轉(zhuǎn)換為數(shù)值,隱式轉(zhuǎn)換:
加法
var xzavier = 123 + 456; //579 var xzavier = 1 + NaN; //NaN,只要運(yùn)算中有一個(gè)NaN,計(jì)算值就為NaN var xzavier = 123 + "abc"; //123abc 有字符串時(shí)未字符串連接符 var xzavier = 123 + Object; //123[object Object]
對(duì)象會(huì)內(nèi)部調(diào)用 toString() 或 valueOf() 方法進(jìn)行轉(zhuǎn)換為原始值。(這里有提到 valueOf 和 toString 方法的轉(zhuǎn)換:JavaScript-數(shù)據(jù)類(lèi)型淺析)
減法
var xzavier = 123 - 12; //111 var xzavier = -123 - 12 //-135 var xzavier = 123 - true; //122 true會(huì)隱式轉(zhuǎn)換為1 var xzavier = 123 - "xzavier"; //NaN
乘法
var xzavier = 123 * 2; //246 var xzavier = 123 * NaN; //NaN var xzavier = 123 * true; //123 var xzavier = 123 * ""; //0
除法
var xzavier = 123 / 3; //41 var xzavier = 123 / 4; //30.75 var xzavier = 123 / NaN; //NaN var xzavier = 123 / true; //123 var xzavier = 123 / ""; //Infinity
求余
var xzavier = 123 % 3; //0 var xzavier = 123 % 4; //3 var xzavier = 123 % NaN; //NaN var xzavier = 123 % true; //0關(guān)系運(yùn)算符
用于比較的運(yùn)算符稱作為關(guān)系運(yùn)算符:小于 <、大于 >、小于等于 <=、大于等于 >=、相等 ==、不等 !=、全等(恒等) ===、不全等(不恒等) !==:
兩個(gè)操作數(shù)都是數(shù)值,則數(shù)值比較;
兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對(duì)應(yīng)的字符編碼值;
兩個(gè)操作數(shù)有一個(gè)是數(shù)值,則將另一個(gè)轉(zhuǎn)換為數(shù)值,再進(jìn)行數(shù)值比較;
兩個(gè)操作數(shù)有一個(gè)是對(duì)象,則先調(diào)用 valueOf() 方法或 toString() 方法,再用結(jié)果比較。
321 > 123; //true 123 > 321; //false "123" > 321; //false "321" > "1234"; //true "a" > "b"; //false a=97,b=98 "a" > "B"; //true B=66 1 > Object; //false
在相等和不等的比較上,如果操作數(shù)是非數(shù)值,則遵循一下規(guī)則:
一個(gè)操作數(shù)是布爾值,則比較之前將其轉(zhuǎn)換為數(shù)值,false 轉(zhuǎn)成 0,true 轉(zhuǎn)成 1;
一個(gè)操作數(shù)是字符串,則比較之前將其轉(zhuǎn)成為數(shù)值再比較;
一個(gè)操作數(shù)是對(duì)象,則先調(diào)用 valueOf() 或 toString() 方法后再和返回值比較;
不需要任何轉(zhuǎn)換的情況下,null 和 undefined 是相等的;
一個(gè)操作數(shù)是 NaN,則 == 返回 false,!= 返回 true;并且 NaN 和自身不等;
兩個(gè)操作數(shù)都是對(duì)象,則比較他們是否是同一個(gè)對(duì)象,如果都指向同一個(gè)對(duì)象,則返回 true,否則返回 false;
在全等和全不等的判斷上,只有值和類(lèi)型都相等,才返回 true,否則返回 false。
123 == 123; //true "123" == 123; //true,"123"會(huì)轉(zhuǎn)成成數(shù)值123 false == 0; //true,false 轉(zhuǎn)成數(shù)值就是0 "a" == "A"; //false,轉(zhuǎn)換后的編碼不一樣 123 == {}; //false,執(zhí)行toString()或valueOf()會(huì)改變 123 == NaN; //false,只要有NaN,都是false {} == {}; //false,比較的是他們的地址,每個(gè)新創(chuàng)建對(duì)象的引用地址都不同 null == undefined //true "NaN" == NaN //false 123 == NaN //false NaN == NaN //false false == 0 //true true == 1 //true true == 2 //false undefined == 0 //false null == 0 //false "123" == 123 //true "123" === 123 //false邏輯運(yùn)算符
邏輯運(yùn)算符通常用于布爾值的操作,一般和關(guān)系運(yùn)算符配合使用,有三個(gè)邏輯運(yùn)算符:
邏輯與(AND):&&
num1 && num2 true true true true false false false true false false false false
如果兩邊的操作數(shù)有一個(gè)操作數(shù)不是布爾值的情況下,與運(yùn)算就不一定返回布爾值,此時(shí),遵循已下規(guī)則:
第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù);
第二個(gè)操作數(shù)是對(duì)象,則第一個(gè)操作數(shù)返回 true,才返回第二個(gè)操作數(shù),否則返回 false;
有一個(gè)操作數(shù)是 null,則返回 null;
有一個(gè)操作數(shù)是 undefined,則返回 undefined。
邏輯或(OR):||
num1 || num2 true true true true false true false true true false false false
如果兩邊的操作數(shù)有一個(gè)操作數(shù)不是布爾值的情況下,邏輯與運(yùn)算就不一定返回布爾值,此時(shí),遵循已下規(guī)則:
第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù);
第一個(gè)操作數(shù)的求值結(jié)果為 false,則返回第二個(gè)操作數(shù);
兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù);
兩個(gè)操作數(shù)都是 null,則返回 null;
兩個(gè)操作數(shù)都是 NaN,則返回 NaN;
兩個(gè)操作數(shù)都是 undefined,則返回 undefined。
邏輯非(NOT):!
邏輯非參考: JavaScript數(shù)據(jù)判斷
邏輯非運(yùn)算符可以用于任何值。無(wú)論這個(gè)值是什么數(shù)據(jù)類(lèi)型,這個(gè)運(yùn)算符都會(huì)返回一個(gè)布爾值。它的流程是:先將這個(gè)值轉(zhuǎn)換成布爾值,然后取反,規(guī)則如下:
操作數(shù)是一個(gè)對(duì)象,返回 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。
不過(guò),邏輯非也比較特殊??梢愿玫挠洃洠?的判斷
var xzavier = !(123 > 12); //false var xzavier = !{}; //false var xzavier = !""; //true var xzavier = !"xzavier"; //false var xzavier = !0; //true var xzavier = !123; //false var xzavier = !null; //true var xzavier = !NaN; //true var xzavier = !undefined; //true位運(yùn)算符
在一般的應(yīng)用中,我們基本上用不到位運(yùn)算符。位非 NOT ~、位與 AND &、位或 OR |、位異或 XOR ^、左移 <<、有符號(hào)右移 >>、無(wú)符號(hào)右移 >>>。
var xzavier = ~123; //-124 var xzavier = 123 & 3; //3 var xzavier = 123 | 3; //123 var xzavier = 123 << 3; //984 var xzavier = 123 >> 3; //15 var xzavier = 123 >>> 3; //15
過(guò)程勉強(qiáng)看一下哈,不想寫(xiě)很多0101,所以寫(xiě)在紙上O(∩_∩)O~
var xzavier = 123; //把123賦值給xzavier變量 xzavier = xzavier +123; //246
更多類(lèi)似賦值運(yùn)算符
乘/賦 *=
除/賦 /=
取余/賦 %=
加/賦 +=
減/賦 -=
左移/賦 <<=
有符號(hào)右移/賦 >>=
無(wú)符號(hào)右移/賦 >>>=
三目運(yùn)算符function absN(xzavier) { return xzavier > 0 ? xzavier : -xzavier; } absN(-123); //123 absN(123); //123逗號(hào)運(yùn)算符
逗號(hào)運(yùn)算符用于對(duì)兩個(gè)表達(dá)式求值,并返回后一個(gè)表達(dá)式的值。
"xza", "vier" // "vier" var x = 0; var y = (x++, 10); x // 1 y // 10運(yùn)算符優(yōu)先級(jí)
. [] () 對(duì)象成員存取、數(shù)組下標(biāo)、函數(shù)調(diào)用等 ++ -- ~ ! delete new typeof void 一元運(yùn)算符 乘法 / % 乘法、除法、去模 加法 - + 加法、減法、字符串連接 << >> >>> 位移 < <= > >= instanceof 關(guān)系比較、檢測(cè)類(lèi)實(shí)例 == != === !== 恒等(全等) & 位與 ^ 位異或 | 位或 && 邏輯與 || 邏輯或 ?: 三元條件 = x= 賦值、運(yùn)算賦值 , 多重賦值、數(shù)組元素分隔符 圓括號(hào)()可以用來(lái)提高運(yùn)算的優(yōu)先級(jí),因?yàn)樗膬?yōu)先級(jí)是最高的,即圓括號(hào)中的表達(dá)式會(huì)第一個(gè)運(yùn)算。
幾個(gè)有意思的等式:
[1,2] + [3,4] == "1,23,4"; //true [4,[3,2]][7][0] == 3; //true ++[[]][+[]]+[+[]] == "10"; //true
今天好天氣,打籃球去咯。代碼,籃球,生活...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79971.html
摘要:數(shù)字和解釋因?yàn)闆](méi)有任何一個(gè)操作數(shù)是字符串,將轉(zhuǎn)換為一個(gè)數(shù)字做數(shù)字加法運(yùn)算因?yàn)闆](méi)有操作數(shù)是對(duì)象或字符串,將轉(zhuǎn)換為。結(jié)論以避免潛在的問(wèn)題,不使用加法運(yùn)算符處理對(duì)象,除非你清楚地使用或方法。 前端學(xué)習(xí):教程&模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試資源匯總 JavaScript一路走來(lái),備受爭(zhēng)議,與其說(shuō)它備受爭(zhēng)議,不如說(shuō)它不夠完美。不夠完美?那完美了還得了,它的...
摘要:甚至包括原型鏈上的所有可枚舉的屬性顯然,我們習(xí)慣的數(shù)組遍歷的結(jié)果是只有這樣的結(jié)果的。當(dāng)代碼運(yùn)行到語(yǔ)句時(shí),執(zhí)行上下文的作用域鏈臨時(shí)被改變了。 前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:流程控制 JavaScript-流程控制 JavaScript是單線程的,一個(gè)語(yǔ)句一個(gè)語(yǔ)句的執(zhí)行。語(yǔ)句是執(zhí)行過(guò)程中的流...
摘要:創(chuàng)建數(shù)組數(shù)組字面量數(shù)組構(gòu)造函數(shù)參數(shù)為數(shù)組建議使用數(shù)組字面量方式,性能好,代碼少,簡(jiǎn)潔,畢竟代碼少。數(shù)組判斷方法用來(lái)判斷某個(gè)值是否為。的這是最簡(jiǎn)潔最直接的遍歷數(shù)組元素的語(yǔ)法。把數(shù)組轉(zhuǎn)換為本地?cái)?shù)組,并返回結(jié)果。 前端學(xué)習(xí):前端教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)組&數(shù)組方法使用詳解 Array對(duì)象 之前一...
摘要:對(duì)象創(chuàng)建字面量方式構(gòu)造函數(shù)方式也可以這樣不過(guò)這樣的話,為何不選擇字面量方式字面量方式和方式的寫(xiě)法是等價(jià)的,返回的結(jié)果是同種類(lèi)的對(duì)象。構(gòu)造函數(shù)產(chǎn)生實(shí)例時(shí),實(shí)例通過(guò)其對(duì)應(yīng)原型對(duì)象的訪問(wèn)對(duì)應(yīng)的構(gòu)造函數(shù)對(duì)象。 前端學(xué)習(xí):教程&模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試資源匯總 歡迎提issues斧正:對(duì)象&對(duì)象使用 Object對(duì)象 在 JavaScript 中,對(duì)...
摘要:業(yè)務(wù)越復(fù)雜,邏輯就越復(fù)雜,判斷就越多比較判斷比較判斷是比較兩個(gè)值,返回一個(gè)布爾值,表示是否滿足比較條件。對(duì)于非布爾值的數(shù)據(jù),取反運(yùn)算符會(huì)自動(dòng)將其轉(zhuǎn)為布爾值。 前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:========== JavaScript-判斷 代碼中,多多少少會(huì)有判斷語(yǔ)句。業(yè)務(wù)越復(fù)雜,邏輯就越...
閱讀 2580·2021-08-11 11:16
閱讀 2999·2019-08-30 15:55
閱讀 3401·2019-08-30 12:53
閱讀 1646·2019-08-29 13:28
閱讀 3327·2019-08-28 18:17
閱讀 1033·2019-08-26 12:19
閱讀 2522·2019-08-23 18:27
閱讀 773·2019-08-23 18:17