[1]一元加 [2]一元減 [3]遞增 [4]遞減 [5]加法 [6]減法 [7]乘法 [8]除法 [9]求餘 ...
×
目錄
[1]一元加 [2]一元減 [3]遞增[4]遞減[5]加法[6]減法[7]乘法[8]除法[9]求餘前面的話
javascript中的算術操作主要通過算術運算符來實現,本文將介紹算術運算符的內容。算術運算符包括一元算術運算符和二元算術運算符兩種
一元算術運算符
一元算術運算符用於一個單獨的操作數,並產生一個新值。在javascript中,一元運算符具有很高的優先順序,而且都是右結合(right-associative)
一元算術運算符包括一元加法(+)、一元減法(-)、遞增(++)和遞減(--)
一元加(+)
一元加運算符以一個加號(+)表示,放在數值前面,對數值不會產生任何影響
var num = 25; num = +num; //25
在對非數值應用一元加運算符時,會調用Number()轉型函數對這個值進行轉換
var s1 = '01'; var s2 = '1.1'; var s3 = 'z'; var b = false; var f = 1.1; var o = { valueOf:function(){ return -1; } }; s1 = +s1;//1 s2 = +s2;//1.1 s3 = +s3;//NaN b = +b;//0 f = +f;//1.1 o = +o;//-1
一元減(-)
一元減運算符主要用於表示負數
var num = 25; num = -num;//-25
當一元減運算符用於非數值時,會對該值使用Number()轉型函數進行轉換,再將得到的數值轉換成負數
var s1 = '01'; var s2 = '1.1'; var s3 = 'z'; var b = false; var f = 1.1; var o = { valueOf:function(){ return -1; } }; s1 = -s1;//-1 s2 = -s2;//-1.1 s3 = -s3;//NaN b = -b;//0 f = -f;//-1.1 o = -o;//1
[註意]一元加和一元減運算符主要用於基本的算術運算,也可以用於轉換數據類型
遞增(++)
遞增++運算符對其操作數進行增量(加1)操作,操作數是一個左值(lvalue)(變數、數組元素或對象屬性)。運算符通過Number()轉型函數將操作數轉換為數字,然後給數字加1,並將加1後的數值重新賦值給變數、數字元素或者對象屬性
var age = 29; ++age; //相當於 var age = 29; age = age +1;
遞增++運算符的返回值依賴於它相對於操作數的位置。當運算符在操作數之前,稱為前增量(pre-increment)運算符,它對操作數進行增量計算,並返回計算後的值。當運算符在操作數之後,稱為後增量(post-increment)運算符,它對操作數進行增量計算,但返回未做增量計算的(unincremented)值
不管是前增量還是後增量,這個運算符通常用在for迴圈中,用於控制迴圈內的計數器
var i = 1, j = ++i;//i=2 j=2 var i = 1, j = i++;//i=2 j=1
[註意]++x並不總是和x = x+1完全一樣,++運算符從不進行字元串連接操作,它總是會將操作數轉換為數字並增1
var x = '1'; ++x;//2 var x = '1'; x = x + 1;//'11'
遞減(--)
遞減--運算符的操作數也是一個左值,它通過Number()轉型函數把操作數轉換為數字,然後減1,並將計算後的值重新賦值給操作數
和遞增++運算符一樣,遞減--運算符的返回值依賴於它相對操作數的位置,當遞減運算符在操作數之前,操作數減1並返回減1之後的值。當遞減運算符在操作數之後,操作數減1並返回減1之前的值
var age = 29; --age; //相當於 var age = 29; age = age - 1;
前增量操作符與執行語句優先順序相同,整個語句會從左向右求值
var num1 = 2; var num2 = 20; var num3 = --num1 + num2;//21 var num4 = num1 + num2;//21
後增量操作符在包含它們的語句被求值之後才執行
var num1 = 2; var num2 = 20; var num3 = num1-- + num2;//22 var num4 = num1 + num2;//21
在涉及++和--運算符時,如果將其用作尾碼表達式,它和表達式應該同一行。否則,行尾將填補分號,同時++或--將作為下一行代碼的首碼操作符並與之一起解析
x -- y
javascript將其解析為:
x;--y;
而代碼的本意是:
x--;y;
二元算術運算符
二元算術運算符包括加法(+)、減法(-)、乘法(*)、除法(/)和求餘(%)
加法(+)
在多數程式設計語言中,加法通常是簡單的數字運算符,但在ECMAScript中,加法運算有大量的特殊行為,不僅可以進行數值加法運算,也可以進行字元串連接
加法運算遵循如下規則:
【1】如果其中一個操作數是對象,則對象會轉換為原始值:日期對象通過toString()方法執行轉換,其他對象通過valueOf()方法執行轉換。由於多數對象valueOf()方法無法返回一個原始值,於是會通過toString()方法來執行轉換
[註意]除了單數值數組會轉換為數字外,其他原生對象都會通過toString()方法轉換為字元串形式
【2】在進行了對象到原始值的轉換後,如果其中一個操作數是字元串的話,另一個操作數也會轉換成字元串,進行字元串連接
【3】否則,兩個操作數都將轉換成數字或NaN,進行加法操作
//單數值數組和valueOf()返回值為數值的自定義對象會轉換為數值 console.log(1 + []);//1 var o = { valueOf: function(){ return -1; } } console.log(1 + o);//0
//其他原生對象則轉換為字元串 console.log(1 + {});//'1[object Object]' console.log(1 + [1,2]);//'11,2' console.log(1 + new Date());//'1Thu Jun 16 2016 10:27:13 GMT+0800 (中國標準時間)' console.log(1 + /0/);//'1/0/'
如果進行算術加法運算,undefined轉換為NaN,null轉換為0,false轉換為0,true轉換為1
console.log(undefined + undefined);//NaN console.log(null + null);//0 console.log(false + false);//0 console.log(true + true);//2
如果進行字元串連接,undefined轉換為'undefined',null轉換為'null',false轉換為'false',true轉換為'true'
console.log('' + undefined);//'undefined' console.log('' + null);//'null' console.log('' + false);//'false' console.log('' + true);//'true'
因此,利用加號運算符的特性,可以利用''+任意類型值轉換為字元串
在數字加法運算中,Infinity和帶符號的0的處理較為特殊
Number.MAX_VALUE + Number.MAX_VALUE === Infinity;//true Infinity + (-Infinity);//NaN +0 + (-0) === +0;//true
減法(-)
相對於加法,減法就簡單的多,只涉及到數字的減法運算。使用Number()轉型函數將非數值類型轉換為數值或NaN
console.log(1 - {});//NaN console.log(1 - [1,2]);//NaN console.log(1 - /0/);//NaN console.log(1 - []);//1
加法有一個特殊之外,在於時間Date對象進行加法運算時使用toString()轉換為字元串,而在其他數學運算,包括減法、乘法、除法、求餘等運算中,都是使用Number()轉換函數將時間Date對象使用valueOf()轉換為數字
console.log(new Date() + 1);//'Thu Jun 16 2016 11:11:49 GMT+0800 (中國標準時間)1' console.log(new Date() - 1);//1466046941641
undefined轉換為NaN,null轉換為0,false轉換為0,true轉換為1
console.log(1 - undefined);//NaN console.log(1 - null);//1 console.log(1 - false);//1 console.log(1 - true);//0
乘法(*)
乘法操作符由一個星號(*)表示,用於計算兩個數值的乘積,會通過Number()轉型函數將非數值類型轉換為數值或NaN
+ Infinity * 0;//NaN - Infinity * 0;//NaN Infinity * 非0數值;//Infinity或-Infinity Infinity * Infinity;//Infinity
除法(/)
除法操作符由一個斜線(/)表示,執行第一個操作數除以第二個操作數的運算,也會通過Number()轉型函數將非數值類型轉換為數值或NaN
Infinity / Infinity;//NaN 0 / 0;//NaN 非0數值 / 0;//Infinity或-Infinity Infinity / 0;//Infinity Infinity / 非0數值;//Infinity
求模(%)
求模(餘數)操作符是由一個百分號(%)表示,是第一個操作數除以第二個操作數的餘數
//r是餘數,n是被除數,d是除數, //q是整數,在n/d為負時為負,在n/d為正時為正,它應該在不超過n和d的商的前提下儘可能大 r = n - (d * q)
求模結果與第一個操作數的符號保持一致
console.log(5 % 2);//1 console.log(5 % -2);//1 console.log(-5 % 2);//-1 console.log(-5 % -2);//-1
被除數是Infinity,或除數是0,則求模結果是NaN
Infinity % 0 = NaN Infinity % Infinity = NaN Infinity % 非0數值 = NaN 非0數值 % 0 = NaN
在多數編程語言中,求模運算符只接受整數為操作數,而在ECMAScript中,還接受浮點操作數,但由於浮點數不是精確的值,無法得到完全準確的結果
console.log(6.5 % 2.1);//0.19999999999999973
參考資料
【1】ES5/表達式 https://www.w3.org/html/ig/zh/wiki/ES5/expressions
【2】阮一峰Javascript標準參考教程——基本語法之運算符 http://javascript.ruanyifeng.com/grammar/operator.html
【3】W3School-Javascript高級教程——ECMAScript運算符 http://www.w3school.com.cn/js/pro_js_operators_multiplicative.asp
【4】《javascript權威指南(第6版)》第4章 表達式和運算符
【5】《javascript高級程式設計(第3版)》第3章 基本概念
【6】《javascript語言精粹(修訂版)》第2章 語法