javascript運算符——算術運算符

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/06/16/5589785.html
-Advertisement-
Play Games

[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章 語法


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前記:本來原生的JS是有提供一個函數來實現這個功能(window.clipboardData),但是很遺憾,這個函數僅僅支持IE和FF瀏覽器,所以基本用處不大。下邊介紹的是一個第三方插件庫(ZeroClipboard.js)。 ZeroClipboard.js在Git上的地址為:https://gi ...
  • 近段時間使用html5開發一個公司內部應用,而觸摸事件必然是移動應用中所必須的,剛開始以為移動設備上或許也會支持滑鼠事件,原來是不支持的,好在webkit內核的移動瀏覽器支持touch事件,並且打包成app也毫無壓力。原本以為touch事件應該跟滑鼠事件是一樣的道理,實踐過程中雖然不難,但還是碰到了 ...
  • 一、記錄下幾種盒子居中的方法: 1.0、margin固定寬高居中; 2.0、負margin居中; 3.0、絕對定位居中; 4.0、table-cell居中; 5.0、flex居中; 6.0、transform居中; 7.0、不確定寬高居中(絕對定位百分數); 8.0、button居中。 二、代碼演示 ...
  • jQuery jQuery是一個快速,小,功能豐富的JavaScript庫。 它使 HTML文檔遍歷和操作、事件處理、 動畫和Ajax更簡單和易於使用的API,在工作 眾多的瀏覽器。 和多功能性的結合 可擴展性,jQuery已經改變了數百萬人的方式寫 JavaScript。 網址: 1. "http ...
  • EChart ECharts,一個純 Javascript 的圖表庫,可以流暢的運行在 PC 和移動設備上,相容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari等),底層依賴輕量級的 Canvas 類庫 ZRender,提供直觀,生動,可交互,可高度個性化定製的 ...
  • JS格式化金額,正則方式修改。 ...
  • 實現tab切換的主要html代碼: 實現tab切換的jquery代碼: ...
  • 在之前項目後臺管理界面開發中,不知道有layer這樣好用的組件,我的內心是這樣的的。。。呀!這個框架有彈框,哈哈哈,好開心,不用自己寫遮罩層,不用自己寫彈框,好開森。。 當知道有layer之後。。。。。這麼方便,這麼人性化,好漂亮,哇哦,好簡單。。。 或許我這人看到新鮮的東西都叫好吧,不好的暫時沒發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...