标签:
【5】操作符
(1)一元操作符:只能操作一个值的操作符
++a --a 前置
a++ a-- 后置
(这四个操作符对任何值都适用,不能转换成数字的转换为NaN)
(2)位操作符:按内存中表示数值的位来操作数值
- ECMAScript中所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值,而是先将64位转化为32位的整数,然后执行操作,最后再将结果转化为64位。
- 对于有符号的整数,32位中的前31位用于表示整数的值。第32位用于表示数值的符号(符号位):0表示正数,1表示负数。
- 符号位的值决定了其他位数值的格式:
正数:以纯二进制存储
负数:二进制补码
步骤:1》求这个数值绝对值的二进制码;
2》求二进制的反码,即将0替换为1,将1替换为0;
3》得到的二进制反码加1。
//-18求补码
//18的二进制码 0000 0000 0000 0000 0000 0000 0001 0010
//求反码 1111 1111 1111 1111 1111 1111 1110 1101
//反码加1 1
//————————————————————————————————————————————————————————————————————————————
//得 1111 1111 1111 1111 1111 1111 1110 1110
- 在对特殊的NaN和Infinity值应用位操作时,这两个值都会被当成0来处理。
- 对非数值应用位操作符,会先使用Number()函数进行转换。
1》按位非(~):执行按位非的结果就是返回数值的反码
2》按位与(&):按位与操作只在两数值的对应位都是1才返回1,任何一位是0,结果都是0
3》按位或(|):按位或操作只在两数值的对应位都是0才返回0,任何一位是1,结果都是1
4》按位异或(^):按位异或操作在两数值的对应位都是1或0返回0,只有一位是1,才返回1
5》左移(<<)::左移操作符会将数值的所有位向左移动指定的位数,向左移位后,原数值的右侧多出来的空位会以0来填充;左移不会影响操作数的符号位
6》有符号的右移(>>):会将数值向右移动,但保留符号位,向右移位后,原数值的左侧多出来的空位会以符号位的值来填充 7》无符号的右移(>>>):对正数,有符号右移和无符号右移结果相同,对于负数,无符号右移以0来填充空位,并且会把负数的二进制码当成正数的二进制码
(3)布尔操作符
1》逻辑非(!)
- !对象 //false
- !空字符串 //true
- !非空字符串 //false
- !数值0 //true
- !任意非0数值(包括Infinity) //false
- !null //true
- !NaN //true
- !undefined //true
使用两个逻辑非操作符模拟Boolean()转型函数的行为。
2》逻辑与(&&)
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是null,则返回null;
- 如果有一个操作数是NaN,则返回NaN;
- 如果有一个操作数是undefined,则返回undefined;
逻辑与操作是短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值(第一个操作数是false)。
3》逻辑或(||)
逻辑或操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑或操作就不一定返回布尔值:
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果为false,则返回第二个对象;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果两个操作数都是null,则返回null;
- 如果两个操作数都是NaN,则返回NaN;
- 如果两个操作数都是undefined,则返回undefined;
逻辑或操作也是短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值(第一个操作数是true)。
(4)乘性操作符
1》乘法(*)
- 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超出了ECMAScript数值的表示范围,则返回Infinity或-Infinity;
- 如果有一个操作数是NaN,则结果是NaN;
- 如果是Infinity与0相乘,则结果是NaN;
- 如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
- 如果是Infinity与Infinity相乘,则结果是Infinity;
- 如果有一个数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
2》除法(/)
- 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果商超出了ECMAScript数值的表示范围,则返回Infinity或-Infinity;
- 如果有一个操作数是NaN,则结果是NaN;
- 如果是0被0除,则结果是NaN;
- 如果是非0的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
- 如果是Infinity被Infinity除,则结果是NaN;
- 如果是Infinity被任何非0数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
- 如果有一个数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
3》求模、余数(%)
- 如果操作数都是数值,执行常规的除法计算,返回除得的余数;
- 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN;
- 如果被除数是有限大的数值而除数是0,则结果是NaN;
- 如果是Infinity被Infinity除,则结果是NaN;
- 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
- 如果被除数是0,则结果是0;
- 如果有一个数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
(5)加性操作符
1》加法(+)
- 如果两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果:
- 如果有一个操作数是NaN,则结果是NaN;
- 如果是Infinity加Infinity,则结果是Infinity;
- 如果是-Infinity加-Infinity,则结果是-Infinity;
- 如果是Infinity加-Infinity,则结果是NaN;
- 如果是+0加+0,则结果是+0;
- 如果是-0加-0,则结果是-0;
- 如果是+0加-0,则结果是+0。
- 如果有一个操作符是字符串,那么应用如下规则:
- 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
- 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
- 如果有一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用字符串的规则。对于null和undefined,则分别调用String()函数并取得字符串"null"和"undefined"。
2》减法(-)
- 如果两个操作符都是数值,执行常规的算数减法操作并返回结果:
- 如果有一个操作数是NaN,则结果是NaN;
- 如果是Infinity减Infinity,则结果是NaN;
- 如果是-Infinity减-Infinity,则结果是NaN;
- 如果是Infinity减-Infinity,则结果是Infinity;
- 如果是-Infinity减Infinity,则结果是-Infinity;
- 如果是+0减+0,则结果是+0;
- 如果是-0减-0,则结果是+0;
- 如果是+0减-0,则结果是-0;
- 如果有一个操作符是字符、布尔值、null或undefined。则在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是NaN,则减法的结果就是NaN;
- 如果有一个操作数是对象,则调用对象的valueOf()方法取得表示该对象的数值。如果得到的值是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用toString()方法并将得到的字符串转化为数值。
(6)关系操作符
小于(<)、大于(>)、小于等于(<=)、大于等于(>=) 这几个操作符都返回一个布尔值
- 如果两个操作数都是数值,则执行数值比较。
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
- 如果一个操作数是数值,则将另一个操作数转化为一个数值,然后执行数值比较。
- 如果一个操作数是对象,则调用这个对象的valueOf()方法,并用得到的结果根据前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。
- 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
- 任何操作数与NaN进行关系比较,结果都是false。
(7)相等操作符
1》相等和不相等(==和!=)——先转换再比较
先转换操作数再比较相等性,在转换不同的数据类型时,相等和不相等遵循以下规则:
- 如果有一个操作数是布尔值,则在比较相等性前先将其转换为数值---false转换为0,true转换为1;
- 如果一个操作数是字符串,另一个操作数是数值,则在比较相等性前将字符串转换为数值;
- 如果一个操作数是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则比较;
- null和undefined是相等的;
- 在比较相等性之前,不能将null和undefined转换为其他任何值;
- 如果有一个操作符是NaN,则相等操作符返回false,不相等操作符返回true;即使两个操作数都是NaN,也一样,因为按照规则,NaN不等于NaN;
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false;
表达式 |
值 |
null == undefined |
true |
"NaN" == NaN |
false |
5 == NaN |
false |
NaN == NaN |
false |
NaN != NaN |
true |
5 =="5" |
true |
false == 0 |
true |
true == 1 |
true |
true == 2 |
flase |
undefined == 0 |
false |
null == 0 |
false |
2》全等和不全等()——仅比较而不转换
两个操作数在未经转换的情况下相等返回true,不相等返回false;
undefined == null;//true
undefined === null;// false
(8)条件操作符
variable = boolean_expression ? true_value : false_value ;
(9)赋值操作符
简单赋值(=)将右侧的值赋给左侧的变量
乘/赋值(*=)
除/赋值(/=)
模/赋值(%=)
加/赋值(+=)
减/赋值(-=)
左移/赋值(<<=)
有符号右移/赋值(>>=)
无符号右移/赋值(>>>=)
(10)逗号操作符
逗号操作符多用于声明多个变量;
var num1 = 0 , num2 = 1 , num3 = 2 ;
除此之外,逗号操作符还可用于赋值,逗号操作符总会返回表达式中最后一项。
var num = {1,2,3,4,5}; //num值为5
JS基本概念(3)
标签:
原文地址:http://www.cnblogs.com/LS-tuotuo/p/5878189.html