javascript运算符——算术运算符

时间:2022-11-03 16:36:29

前面的话

  javascript中的算术操作主要通过算术运算符来实现,本文将介绍算术运算符的内容。算术运算符包括一元算术运算符和二元算术运算符两种

一元算术运算符

  一元算术运算符用于一个单独的操作数,并产生一个新值。在javascript中,一元运算符具有很高的优先级,而且都是右结合(right-associative)

  一元算术运算符包括一元加法(+)、一元减法(-)、递增(++)和递减(--)

一元加(+)

  一元加运算符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响

var num = 25;
num = +num; //

  在对非数值应用一元加运算符时,会调用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;//
s2 = +s2;//1.1
s3 = +s3;//NaN
b = +b;//
f = +f;//1.1
o = +o;//-1

  [注意]在new Date()前面使用一元加符号,可以把日期字符串,转换为日期毫秒数

console.log(new Date());//on Jul 11 2016 20:25:54 GMT+0800 (中国标准时间)
console.log(+new Date());//

一元减(-)

  一元减运算符主要用于表示负数

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;//
f = -f;//-1.1
o = -o;//

  [注意]一元加和一元减运算符主要用于基本的算术运算,也可以用于转换数据类型

递增(++)

  递增++运算符对其操作数进行增量(加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;//
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;//
var num4 = num1 + num2;//

  后增量操作符在包含它们的语句被求值之后才执行

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//
var num4 = num1 + num2;//

  在涉及++和--运算符时,如果将其用作后缀表达式,它和表达式应该同一行。否则,行尾将填补分号,同时++或--将作为下一行代码的前缀操作符并与之一起解析

x
--
y

  javascript将其解析为:

x;--y;

  而代码的本意是:

x--;y;

二元算术运算符

  二元算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和求余(%)

加法(+)

  在多数程序设计语言中,加法通常是简单的数字运算符,但在ECMAScript中,加法运算有大量的特殊行为,不仅可以进行数值加法运算,也可以进行字符串连接

  加法运算遵循如下规则:

  【1】如果其中一个操作数是对象,则对象会转换为原始值:日期对象通过toString()方法执行转换,其他对象通过valueOf()方法执行转换。由于多数对象valueOf()方法无法返回一个原始值,于是会通过toString()方法来执行转换

  [注意]除了单数值数组会转换为数字外,其他原生对象都会通过toString()方法转换为字符串形式

  【2】在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换成字符串,进行字符串连接

  【3】否则,两个操作数都将转换成数字或NaN,进行加法操作

//单数值数组和valueOf()返回值为数值的自定义对象会转换为数值
console.log(1 + []);//
var o = {
valueOf: function(){
return -1;
}
}
console.log(1 + o);//
//其他原生对象则转换为字符串
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);//
console.log(false + false);//
console.log(true + true);//

  如果进行字符串连接,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 - []);//

  加法有一个特殊之处,在于时间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);//

  undefined转换为NaN,null转换为0,false转换为0,true转换为1

console.log(1 - undefined);//NaN
console.log(1 - null);//
console.log(1 - false);//
console.log(1 - true);//

乘法(*)

  乘法操作符由一个星号(*)表示,用于计算两个数值的乘积,会通过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);//
console.log(5 % -2);//
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
【3】 W3School-Javascript高级教程——ECMAScript运算符 http://www.w3school.com.cn
【4】《javascript权威指南(第6版)》第4章 表达式和运算符
【5】《javascript高级程序设计(第3版)》第3章 基本概念
【6】《javascript语言精粹(修订版)》第2章 语法

javascript运算符——算术运算符的更多相关文章

  1. javascript中算术运算符规则

    javascript中提供了几种算术运算符,+(加)  -(减)  *(乘)  /(除)  %(余),常规用法与数学上的一致:  但还规定一些特殊规则: 注:JavaScript中保存数值的方式,可以 ...

  2. PHP中的运算符---算术运算符、逻辑运算符、赋值运算符、比较运算符

    1.算术运算符 常见的算术运算符 运算类型 运算符 举例 结果 取反运算 - -$a 返回$a的负值 加法运算 + $a + $b 返回$a与$b的和 减法运算 - $a - $b 返回$a与$b的差 ...

  3. Python新手学习基础之运算符——算术运算符

    算术运算符 之前文章在介绍变量类型的时候,其实已经用过了很多算术符,比如+.-.*././/.** 等,除此之外,还有一个符号是之前内容没提到的,就是 % ,用来返回除法余数的运算符号. 假设有变量x ...

  4. 正经学C#_表达式与其运算符[算术运算符]:《c#入门经典》

    表达式:正如字面意义,它是通过算术运算符来进行运算的数学公式.表达式的意义我们都是很明白的,大白话就是一个公式嘛.不是很难懂. 表达式不是一个单独的存在,必然有操作数或者操作符的.在c#中有操作符有很 ...

  5. java入门---运算符&算术运算符&自增自减运算符&关系运算符&位运算符

        计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 ...

  6. JavaScript 算术运算符

    处理数值的典型情景是数值计算. ㈠JavaScript 算术运算符 算术运算符对数值(文字或变量)执行算术运算. ㈡算术运算符 典型的算术运算会操作两个数值. ⑴这两个数可以是字面量: var x = ...

  7. java中的算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符

    一.算术运算符 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例 ...

  8. Python算术运算符

    Python 运算符 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4和5被称为操作数,"+"号为运算符. Python语言支持 ...

  9. java基础知识-算术运算符和赋值运算符

    1.算术运算符 算术运算符: +,-,*,/,% /:取的是两个数的商,当两个数是整数,不整除的情况,结果不包含小数部分 %:取的是两个数的余数. 字符串和+联合使用:此时的+称为连接符.++,--都 ...

随机推荐

  1. B-tree&B+tree

    B-tree&B+tree B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的 ...

  2. PHP基础笔记汇总

    一.PHP简介PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名)PHP 是一种服务器端的脚本语言,类似 ASPPHP 文件的文件后缀是 ".p ...

  3. McAfee Host Intrusion Prevention

    McAfee Host Intrusion Prevention是一款集防火墙功能和HIPS于一身的主动防御和防火墙软件,将其与 McAfee VirusScan Enterprise 8.5/8.7 ...

  4. open/write/read

    C语言中open函数 作用:打开和创建文件. 简述: 1 2 3 4 #include <fcntl.h> int open(const char *pathname, int flags ...

  5. Qt:基于TCP和UDP的局域网P2P(局域网)通讯封装

    封装了一个类,可以进行在局域网进行P2P通讯(仅局域网可用) 也就是说,假设局域网中有10台电脑,那么从本机发出的数据,将依次派发到这10台电脑(目前的设计中包括自己这台) 在使用方面,构造的时候给端 ...

  6. python的历史与优劣

    历史 Python的创始人是Guido van Rossum,在发明Python语言之前Guido曾参与过一门称作ABC的语言的设计,ABC是专门为非专业程序员设计的:Guido在Python语言的设 ...

  7. R语言-选择样本数量

    功效分析:可以帮助在给定置信度的情况下,判断检测到给定效应值时所需的样本量,也可以在给定置信水平的情况下,计算某样本量内可以检测到的给定效应值的概率 1.t检验 案例:使用手机和司机反应时间的实验 l ...

  8. war包安装jenkins

    转自:https://blog.51cto.com/bigboss/2129358 系统环境: CentOS 7.5 1804 IP:192.168.1.3 关闭selinux.firewalld j ...

  9. 基于DPDK的高效包处理系统

    一.概念 Intel® DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用 ...

  10. mongodb的docker化安装

    查询mongo镜像 docker search mongo 拉取镜像(拉取STARS最多的那个就可以了) docker pull mongo tips:如果拉取不成功,多pull几次就可以了. 使用自 ...