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--;//值变成-22.一元加和减操作符对于数值来说,不会有任何影响,对于非数值来说,该操作符会像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 152.减法
如果两个操作符都是数值,执行常规的减法运算
规则: 如果一个操作符是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是表达式的最后一项相关文章推荐
- JavaScript高级程序设计 第三章 --- 基本概念
- JavaScript高级程序设计第三章基本概念
- 读书笔记 JavaScript高级程序设计 第三章 基本概念-数据类型
- JavaScript高级程序设计之基本概念之操作符之一元操作符第3.5.1讲笔记
- JavaScript高级程序设计第三章基本概念——语句
- JavaScript高级程序设计之基本概念之操作符之位操作符第3.5.2讲笔记
- JavaScript高级程序设计之基本概念之操作符之布尔操作符第3.5.3讲笔记
- JavaScript高级程序设计之基本概念之操作符之乘性操作符第3.5.4讲笔记
- JavaScript高级程序设计之基本概念之操作符之加性操作符第3.5.5讲笔记
- JavaScript高级程序设计之基本概念之关系操作符第3.5.6讲笔记
- JavaScript高级程序设计之基本概念之相等操作符第3.5.7讲笔记
- JavaScript高级程序设计之基本概念之相等操作符第3.5.8讲笔记
- JavaScript高级程序设计第三版(第三章:JavaScript基本概念)
- 读书笔记 JavaScript高级程序设计 第三章 基本概念-语法
- JavaScript 高级程序设计——第三章基本概念 学习笔记
- javascript高级程序设计第三版 第三章 基本概念
- JavaScript高级程序设计第三章基本概念——函数
- javascript高级程序设计笔记-第三章(基本概念)
- JavaScript高级程序设计 第三章 javascript基本概念
- JavaScript高级程序设计(八):基本概念--操作符