您的位置:首页 > Web前端 > JavaScript

JavaScript高级程序设计第三章基本概念——操作符

2018-02-09 09:25 423 查看

一元操作符

只能操作一个值的操作符叫一元操作符。一元操作符是ECMAScript最简单的操作符。
1.递增和递减操作符(前置和后置)
(1)前置递增操作符:var age = 29;
++age;//30这个前置递增操作与一下相同:
var age = 29;
age = age + 1;//30
(2)前置递减操作符:
var age = 30;
--age;//29
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//1+20为21
var num4 = num1 + num2;//现在num1已经是1,所以,1+20为21
(3)后置递增操作符:
后置与前置的最重要的一个区别就是:后置递增递减操作符是在包含它们的语句被求值之后才执行的。
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//因为要等包含它们的语句被求值之后再执行,所以依旧是2+20=22
var num4 = num1 + num2;//在这里被执行之前num1已经--了,所以是1+20=21
(4)应对不同的值时,递增递减操作符遵循的规律:
var a = "2";
var b = "z";
var c = false;
var d = 1.1;
var e = {
valueOf:function(){
return -1;
}
};
a++;//值变成数值3
b++;//值变成NaN
c++;//值变成数值1
d--;//值变成0.10000000000000009
e--;//值变成-2
2.一元加和减操作符对于数值来说,不会有任何影响,对于非数值来说,该操作符会像Number()转型函数一样对这个值进行转换
var a = "2";
var b = "z";
var c = false;
var d = 1.1;
var f = "01";
var e = {
valueOf:function(){
return -1;
}
};
a = +a;//值变成数值2
b = +b;//值变成NaN
c = +c;//值变成数值0
d = +d;//值未变,仍然是1.1
e = +e;//值变成数值-1
f = +f;//值变成数值1
var a = "2";
var b = "z";
var c = false;
var d = 1.1;
var f = "01";
var e = {
valueOf:function(){
return -1;
}
};
a = -a;//值变成数值-2
b = -b;//值变成NaN
c = -c;//值变成数值0
d = -d;//值未变,仍然是-1.1
e = -e;//值变成数值1
f = -f;//值变成数值-1

位操作符

1.按位非(NOT)
var num1 = 25;
var num2 = ~num1;
alert(num2);//-26
var num1 = 25;
var num2 = -num1 - 1;
alert(num2);//-26      这验证了按位非操作的本质:操作数的负值减1

 2.按位与(AND)(&)两位都是1时才返回1,任何一位是0,结果都是0.3.按位或(OR)(|)有一位是1就返回1,只有两位都是0的情况下才返回04.按位异或(XOR)(^)只有一位是1时才返回1,如果两位都是0或者都是1的时候才返回0
 5.左移(<<)这个操作符会将数值的所有位向左移动指定的位数
var a = 2;//二进制10
var b = a << 5; //二进制1000000,十进制的64
 注意在向左移位后,原数值的右侧多了5个空位,用0来补充,左移不会影响操作数的符号位的6.有符号的右移(>>)这个操作符会将数值向右移动,保留符号位。有符号的右移与左移操作恰好相反
var a = 64;//二进制1000000
var b = a >> 5;//二进制的10,十进制的2
 注意在向右移位后,原数值的左侧,也就是符号位的右侧有空位,用符号位的值来填充
 7.无符号右移(>>>)这个操作符会将数值的所有32位都向右移动,对于正数来说,有符号右移和无符号右移结果相同
var a = 64;//二进制1000000
var b = a >>> 5;//二进制的10,十进制的2
 但是对于负数来说,情况不一样。首先无符号右移是以0来填充空位,而不像有符号右移以符号位的值来填充空位,其次,无符号右移操作符会把负数的二进制码当成正数的二进制码,由于负数的二进制码以其正数的二进制补码形式表示,因此会导致无符号右移后的结果非常之大。

布尔操作符

1.逻辑非
逻辑非操作符由一个感叹号(!)表示,无论这个值是什么数据类型都适用,返回一个布尔值,首先将操作数转化为布尔值 之后取反。alert(!false);//true
alert(!"blue");//false
alert(!"");//true
alert(!null);//true
alert(!undefined);//true
alert(!NaN);//true
alert(!0);//true
alert(!1234);//false 2.逻辑与  逻辑与操作符由(&&)表示,有两个操作数,只要其中一个操作数为false,则根本不会看第二个操作数,直接就是false了。
规则:如果第一个操作数是对象,则返回第二个操作数。
   如果第二个操作数是对象,则第一个操作数结果为true的时候才会返回第二个操作数

  如果两个操作数都是对象,则返回第二个操作数
  如果有一个操作数是null,则返回null
  如果有一个操作数是NaN,则返回NaN
  如果有一个操作数是undefined,则返回undefined
3.逻辑或
逻辑或操作符由(||)表示,有两个操作数,只要其中一个操作数为true,则根本不会看第二个操作数,直接就是true了。规则:如果第一个操作数是对象,则返回第一个操作数。   如果第二个操作数是对象,则第一个操作数结果为false的时候才会返回第二个操作数
  如果两个操作数都是对象,则返回第一个操作数  如果两个操作数都是null,则返回null  如果两个操作数都是NaN,则返回NaN  如果两个操作数都是undefined,则返回undefined
        应用实例:
var a = b || c;
         变量a将被赋予b或c中的一个值,如果b的值不是null,则它将被赋予给a,如果b是null,则将c的值赋予给a

乘性操作符

1.乘法(*)
规则:如果操作数都是数值,执行常规的乘法计算
          如果一个操作数是NaN,则结果是NaN
          如果是Infinity与0相乘,则结果是NaN
          如果是Infinity与非0数值相乘,则结果是Infinity或者-Infinity,取决于有符号操作数的符号
   如果是Infinity与Infinity相乘,则结果是Infinity

  如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后在应用上面规则
  2.除法(/)         
  规则:如果操作数都是数值,执行常规的除法计算     如果一个操作数是NaN,则结果是NaN 
     如果Infinity/Infinity,则结果是NaN  
如果0/0,则结果是NaN 如果是Infinity/0,则结果是Infinity 如果是0/Infinity,则结果是0 如果是非零的有限数被零除,则结果是Infinity或者-Infinity,取决于有符号操作数的符号
      如果是Infinity被任何非零数值除,则结果是Infinity或者-Infinity,取决于有符号操作数的符号 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后在应用上面规则3. 求模(%)规则:如果操作数都是数值,执行常规的除法计算,返回除得的余数 如果一个操作数是NaN,则结果是NaN 如果一个无穷大的数除以一个有限大的数,则结果是NaN 例如:(Infinity%2)  如果一个有限大的数除以0,则结果是NaN 例如:(2%0) 如果是0%0,则结果是NaN  如果是Infinity/Infinity,则结果是NaN 如果是Infinity%0,则结果是NaN 如果是0%Infinity,则结果是0 如果有限大的数除以无限大的数Infinity,则结果是被除数,那个有限大的数 如果被除数是0,则结果是0 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后在应用上面规则

加性操作符

1.加法如果两个操作符都是数值,执行常规的加法运算规则:如果一个操作符是NaN,则结果是NaN 如果Infinity加Infinity,则结果是Infinity    如果-Infinity加-Infinity,则结果是-Infinity   如果Infinity加-Infinity,则结果是NaN   如果是+0加+0,则结果是+0   如果是-0加-0,则结果是-0    如果是+0加-0,则结果是+0  不过,如果有一个操作符是字符串,还要加上一下规则  如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来  如果只有一个操作数是字符串,则将另一个操作数转化为字符串,然后再将两个字符串拼接起来
var a = 5 + 5;
alert(a);//10

var b = 5 + "5";
alert(b);//55    第一个操作符也被转化成字符串,变成了字符串拼接
var num1 = 5;
var num2 = 10;
var num3 = "The sum is "+num1 +num2;
alert(num3);// The sum is 510
var num1 = 5;
var num2 = 10;
var num3 = "The sum is"+(num1 +num2);
alert(num3);//The sum is 15
2.减法
如果两个操作符都是数值,执行常规的减法运算
规则: 如果一个操作符是NaN,则结果是NaN
         如果是Infinity减Infinity,则结果是NaN
  如果是-Infinity减-Infinity,则结果是NaN
  如果是Infinity减-Infinity,则结果是Infinity
  如果是-Infinity减Infinity,则结果是-Infinity  如果是+0减+0,则结果是+0  如果是+0减-0,则结果是+0 如果是-0减-0,则结果是+0 如果是-0减+0,则结果是-0var a = 5 - true;//4 true被转化成1
var b = NaN - 1;//NaN
var c = 5 -3;//2
var d = 5 - "";//5 ""被转化成0
var e = 5 - "2";//3 "2"被转化成2
var f = 5 - null;//5 null被转化成0
var g = 5 - Infinity;//-Infinity
var h = Infinity - 5;//Infinity

关系操作符

小于(<) 大于(>) 小于等于(<=) 大于等于(>=)
规则: 如果两个操作数都是数值,则执行数值比较
    如果两个操作符都是字符串,则比较两个字符串对应的字符编码值 如果一个操作数是数值,则将另一个操作数也转化为数值,然后执行数值比较 如果一个操作数是对象,先调用valueOf(),没有调用toString() 如果一个操作数是布尔值,则现将其转化为数值,然后再执行比较。
比较两个字符串:比较的是字符串的字符编码,大写字母的字符编码全部小于小写字母alert("Brick" < "alphabat");//true
alert("brick" < "alphabat");//false 在都为小写的时候,在字母表位置靠后的大
比较两个数字字符串:alert("23" < "3");//true 两个操作数都是字符串,比较字符编码("2"的字符编码是50,"3"的字符编码是51)
alert("23" < 3);//false 一个操作数是数值,则将另一个也转换成数值再比较 23与3比较

alert("a" < 3);//false 字母"a"不能转化成合理的数值,因此就被转化成NaN,任何操作数与NaN进行比较,结构都是false

alert(5 < Infinity);//true
alert(5 < -Infinity);//false

相等操作符

相等不相等——先转换再比较,去等不全等——仅比较不转换1.相等(==)和不相等(!=)规则:true转化为1,false转化为0   null和undefined是相等的
    在比较相等性之前,不能将null和undefined转化成任何值
   如果一个操作数是NaN,则相等操作符返回false,不相等操作符返回true,及时两个操作符都是NaN,相等操作符也返回false, NaN不等于NaN
   如果两个操作数都是对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,则返回truenull == undefined;//true
NaN == NaN;//false
false == 0;//true
undefined == 0;//false
null == 0;//false
"5" == 5;//true2.全等(===)和不全等(!==)

仅比较,不转化alert("55" == 55);//true 因为转化之后相等
alert("55" === 55);//false 因为仅比较,数据类型不相等
alert(null == undefined);//true
alert(null === undefined);//false  类型不相同

条件操作符(三目运算符)

var max = (num1 > num2) ? num1 : num2;//max将会保存num1和num2中的最大值,如果num1>num2成立,则返回:前面的num1值,否则返回:后面的num2值

赋值操作符

乘/赋值(*=)
除/赋值(/=)
模/赋值(%=)
加/赋值(+=)
减/赋值(-=)
左移/赋值(<<=)
有符号右移/赋值(>>=)
无符号右移/赋值(>>>=)
设计这些操作符的主要目的是简化赋值操作符,使用它们不会带来任何性能的提升

逗号操作符

使用逗号操作符可以在一条语句中执行多个操作:var num1 = 1, num2 = 2, num3 = 3;//用于声明多个变量使用逗号操作符还可以用来赋值,在用来赋值时,逗号操作符总会返回表达式中的最后一项:var num = (5, 1, 4, 6, 0);//num的值为0,因为0是表达式的最后一项
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: