JavaScript运算符

算数运算符

运算符 + - * / %

+ 加号运算符

功能:

1.对数字代数求和

2.对字符串进行连接

3.将一个数值转换成字符串 ——>数值+""

注意:任何数据类型+字符串都等于字符串

字符串拼接时:

数值+字符串——>将数值直接转为字符串拼接

字符串+字符串——>两者直接拼接

- 减号运算符

功能:

1.对数值进行减法操作;

2.对操作数进行“取反”操作;

3.将字符串转换成数值;数值型字符串-0=该数值,非数值-0==NaN

*  / 乘号、除号运算符

功能:对两个数进行乘法或除法运算

正负规则:同号为正,异号得负

% 取余运算符

两个数相除取余数。

余数是正还是负,和第一个运算数的符号相同

复合赋值运算符  += -= *=  /= %=

分别相加、相减、相乘、相除和取余后赋值。


自增和自减运算符

++  --

对唯一的运算数进行递增或者递减操作(每次加1或者减1)

注意点:

1.运算数必须是一个变量、数组的一个元素或者对象的属性

2.如果运算数是非数值则运算符会将它转成数值直接返回,不会再+或-

3.符号位置决定运算结果:

运算数之前——>先进行递增或者递减,再进行求值

运算数之后——>先求值,再进行递增或者递减操作


关系运算符(比较运算符)

大小运算 >  <  >=  <=

如果左边  大于/小于/大于等于/小于等于  右边,返回true,否则返回false

操作规则:

1.数值与数值比较——>比较代数值

2.仅一个运算数是数值——>将另一个运算数转成数值,并比较它们的代数值

3.字符串与字符串——>逐个字符比较它们的Unicode数值

4.字符串与非数值——>将运算数转换成字符串进行Unicode比较

5.运算数即非数字也非字符串——>转换成数字或者字符串后进行比较

6.运算数无法转换成数值或者字符串——>返回false

7.与NaN比较——>返回false

等值运算

相等比较==    !=

比较两个运算符的返回值,看返回值是否相等或不等

存在类型转换:

布尔值:true-----1;false-----0;

对象:调用valueOf()

字符串与数值比较:字符串转换成数值

比较原则:

1.null与undefined相等

2.NaN不等于任何数值,包括自身

3.对象,是不是同一对象,是的话 == 是true

相同比较  ===   !==

不存在隐示类型转换的绝对等于和绝对不等于,比较两个运算数的返回值及数据类型是否相同或不同

比较原则:

1.只有数据类型和数值相同才为相同

2.原始值和引用值之间是绝对不等于

3.引用值之间比较的是它们的引用(内存地址)


对象运算符

in:判断左边是否是右边的成员

instancesof:判断左边对象实例是否是右边的这个类或构造函数构造出来的

new:创建并初始化一个新的对象

delete:删除指定对象的属性,数组元素或者变量

.和[]:存取对象和数组元素

():函数调用,改变运算符的优先级等    


逻辑运算符

&&逻辑与

规则:

1.第一个操作数是对象,返回第二个;

2.第一个操作数值为true,第二个为对象时,返回第二的对象;

3.两个都是对象时,返回第二个;

4.其中一个操作数是null或者undefined或者NaN时,对应返回null、undefined、NaN,如果同时是这三个值中的两个,返回第一个数;(暂时感觉0也是这个规律)

特性:

1.当且仅当两个运算数的值为true时,返回true,否则返回false;

2.短路操作:当第一个操作数的值是false时,则不再对第二个操作数进行求值了,返回第一个。

|| 逻辑或

规则:

1.第一个操作数是对象,返回第一个;

2.第一个操作数值为false,返回第二个;

3.两个都是对象时,返回第一个;

4.两个操作数是null或者undefined或者NaN时,对应返回null、undefined、NaN(0也是这个规律)

特性:

1.当且仅当两个运算数的值为false时,返回false,否则返回true;

2.短路操作:当第一个操作数的值是true时,则不再对第二个操作数进行求值了,返回第一个。

!逻辑非

非运算符返回值的为true的有:undefined、null、NaN、0、""

false的有:对象、非空字符串、非0数值

特性:

1.当运算的值为false则返回true,否则返回false。

2.连续使用两次,可将任意类型转成布尔值(true or false)。


位运算符

基础知识:

1.类型:

(1).有符号:数字位是 前31位  ,符号位是第32位

(2).无符号:只能是正数,第32位表示数值,数值范围可以加大

2.数值范围:-2147483648到2147483647

3.存储方式:

正数:纯二进制存储,31位中每一位表示2的幂,用0补充无用位

负数:2进制补码存储,补码的计算步骤:

(1.确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)

(2.求得二进制反码,即要把 0 替换为 1,把 1 替换为 0

(3.在二进制反码上加 1

4.当做0来处理的特殊值NaN和Infinity

逻辑位运算

返回值为1的:按位非~0、按位与&对应位全是1、按位或| 任何一位是1、按位异或^ 即不同时为1也不同时为0    

返回值为0的:按位非~1、按位与&任意一位是0、按位或| 对应位全位0、按位异或^ 对应位全0或全1    

位移操作:

左移<<:将数值的所有位左移指定的位数,所有空位用0补充。左移1位对其乘2,左移2位对其乘4,以此类推;

有符号右移>>:将数值的所有位右移指定的位数,移出的位被舍弃,保留符号位,右移1位对其除2,右移2位对其除4,以此类推(在舍弃移出位后的基础上除);

无符号右移>>>:

正数:与有符号右移结果相同

负号:会出现无限大的数值

复合赋值运算符 

位操作符与等号结合,复合赋值不会有性能方面的提升   


其他运算符

1.?:  条件运算符,又叫三目运算符,是简洁的if else

2.typeof 类型判定运算符

3.逗号操作符,在一行语句中执行多个不同的操作,特殊的(1,2)会看一眼第一个,然后返回第二个数。



*以下是关于位运算符知识,来至于官方文档:ECMAScript 位运算符

位运算符是在数字底层(即表示数字的 32 个数位)进行操作的。

ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在 ECMAScript 中,所有整数字面量默认都是有符号整数,

有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围从 -2147483648 到 2147483647。

可以以两种不同的方式存储二进制形式的有符号整数,一种用于存储正数,一种用于存储负数。正数是以真二进制形式存储的,前 31 位中的每一位都表示 2 的幂,从第 1 位(位 0)开始,表示 20,第 2 位(位 1)表示 21。没用到的位用 0 填充,即忽略不计。

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:

1.确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)

2.求得二进制反码,即要把 0 替换为 1,把 1 替换为 0

3.在二进制反码上加 1

有趣的是,把负整数转换成二进制字符串后,ECMAScript 并不以二进制补码的形式显示,而是用数字绝对值的标准二进制代码前面加负号的形式输出。

var iNum = -18;

iNum.toString(2);//输出 "-10010"

这段代码输出的是 "-10010",而非二进制补码,这是为避免访问位 31。为了简便,ECMAScript 用一种简单的方式处理整数,使得开发者不必关心它们的用法。

另一方面,无符号整数把最后一位作为另一个数位处理。在这种模式中,第 32 位不表示数字的符号,而是值 231。由于这个额外的位,无符号整数的数值范围为 0 到 4294967295。对于小于 2147483647 的整数来说,无符号整数看来与有符号整数一样,而大于 2147483647 的整数则要使用位 31(在有符号整数中,这一位总是 0)。

把无符号整数转换成字符串后,只返回它们的有效位。

注意:所有整数字面量都默认存储为有符号整数。只有 ECMAScript 的位运算符才能创建无符号整数。

~位运算 NOT

位运算 NOT 由否定号(~)表示

~位运算 三步的处理过程:

1.把运算数转换成 32 位数字

2.把二进制数转换成它的二进制反码

3.把二进制数转换成浮点数

注:~位运算 实质上是对数字求负,然后减 1

& 位运算 AND

位运算 AND 由和号(&)表示,直接对数字的二进制形式进行运算。它把每个数字中的数位对齐,然后用对应的规则对同一位置上的两个数位进行 AND 运算(两个1才为1,否则为0)

| 位运算 OR

位运算 OR 由符号(|)表示,也是直接对数字的二进制形式进行运算。在计算每位时,OR 运算符采用OR对应的规则计算(有1即为1,否则为0)

^  位运算 XOR

位运算 XOR 由符号(^)表示,当然,也是直接对二进制形式进行运算。XOR 不同于 OR,当只有一个数位存放的是 1 时,它才返回 1。(相同为0,不同为1)

左移运算 <<

左移运算由两个小于号表示(<<)。它把数字中的所有数位向左移动指定的数量的空位,用 0 填充这些空位。

注意:左移运算保留数字的符号位,即符号仍然存储在第 32 位中

有符号右移运算    >>

有符号右移运算符由两个大于号表示(>>)。它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。

同样,移动数位后会造成空位。这次,空位位于数字的左侧,但位于符号位之后。ECMAScript 用符号位的值填充这些空位,创建完整的数字

无符号右移运算 >>>

无符号右移运算符由三个大于号(>>>)表示,它将无符号 32 位数的所有数位整体右移。对于正数,无符号右移运算的结果与有符号右移运算一样。

对于负数,情况就不同了。

无符号右移运算用 0 填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理。

由于无符号右移运算的结果是一个 32 位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字,如何得到这种结果的呢?

要实现这一点,需要把这个数字转换成无符号的等价形式 如:-64 >>> 0;

然后,用 Number 类型的 toString() 获取它的真正的位表示

你可能感兴趣的:(JavaScript运算符)