js操作符
一、一元操作符
1、递增递减
前置型:变量值是在语句被求值以前改变(副效应);
var age = 29;
var anotherAge = --age + 2;
alert(age) //输出28
alert(anotherAge ) //输出30
后置型:包含它们语句被求值之后执行;
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2 ; //等于22 num1原始值运算
var num4 = num1 + num2; //等于21 num1递减后的值运算
递增递减遵循规则(适用于整数、字符串、布尔值、浮点数、对象):
- 数字字符串时:先转为数字值,在执行加减1操作,字符串变量变成数值变量;
- 不包含有效数字字符串的字符时:将变量置位NaN,字符串变量变成数值变量;
- 布尔值时:先转为(false为0,true为1)在执行加减1操作;布尔值变量变成数值变量;
- 浮点数值:执行加减1操作;
- 对象时:先调用valueOf()方法,取得可供操作的值,然后对该值应用前述规则,如果结果为NaN,则调用toString()方法,在执行前述规则,对象变量变成数值变量;
2、一元加、减操作符
放在数值前,对数值不会产生影响;
var n = 25;
n = +n; //任然是25
对非数值时,该操作会对其值执行数据类型转换;
var n = "25";
n = +n; //字符串转换为数值
主要用于表示负数
var n = 25;
n = -n //变成-25
二、位操作符
位操作符用于最基本的层次上,即按内存中表示数值的位来操作数值,ECMAScript数值以IEEE-75464(64位)位格式存储,64位转32位的整数,执行位操作后再转回64位(转换过程严重副效应,即特殊的NaN、Infinity位操作时,会当成0来处理);
32位二进制码,第32位为符号位,0表示整数,1表示负数;
正数(纯二进制码存储)
负数(二进制码存储)格式是二进制补码,计算步骤(以-18为列):
(1)求这个数值绝对值的二进制码(即18的二进制码);
0000 0000 0000 0000 0000 0000 0001 0010
(2)求二进制反码,即0为1,1为0;
1111 1111 1111 1111 1111 1111 1110 1101
(3)得到二进制反码加1;
1111 1111 1111 1111 1111 1111 1110 1101
1
1111 1111 1111 1111 1111 1111 1110 1110 (-18的二进制表示,有符号整数时,不能访问第31位);
1、按位非(NOT)
波浪线表示(~)结果返回数值的反码,按位非操作本质:得到的负值在减1;
var n1 = 25; //二进制 00011001 var n2 = ~n1; //二进制 11100110 console.log(n2) //-26
2、按位与(AND)
和号表示(&),两数值为1则为1,任何一位为0则为0;
var result = 25 & 3;
conosle.log(result ) //输出1
//底层操作
25 = 0001 1001
3 = 0000 0011
AND = 0000 0001
3、按位或(OR)
竖线表示(&),两数值为0则为0,任何一位为1则为1;
var result = 25 | 3;
conosle.log(result ) //输出27
//底层操作
25 = 0001 1001
3 = 0000 0011
OR = 0000 1011
4、按位异或(XOR)
插入表示(∧),两数只有1则为1,两位都是1或0,则为0;
var result = 25 ∧ 3;
conosle.log(result ) //输出26
//底层操作
25 = 0001 1001
3 = 0000 0011
XOR = 0000 1010
5、左移(<<)、有符号右移(>>)、无符号右移(>>>),移动指定上的位置;
三、布尔值操作符
1、逻辑非(!)
- 对象,返回false;
- 空字符串,返回true;非空字符串,返回false;
- 数值0,返回true;
- 非0数值(包括Infinity),返回false;
- null,返回true;
- NaN,返回true;
- undefined,返回true;
2、逻辑与(&&)
有一个为false则为false,第一个操作符返回false,就不会对第二个操作符求值,反之第一个返回true,则继续求值第二个操作符(短路操作符)
- 第一个操作数是对象,则返回第二个操作数;
- 第二个操作数是对象,则只在第一个求值结果为true的情况下才返回该对象;
- 两个操作数都是对象,则返回第二个操作数;
- 有一个操作数是null,则返回null;
- 有一个操作数是NaN,则返回NaN;
- 有一个操作数是undefined,则返回undefined;
3、逻辑或(||)
有一个为true则为true,第一个操作符返回true,就不会对第二个操作符求值,反之第一个返回false,则继续求值第二个操作符(短路操作符)
- 第一个操作数是对象,则返回第一个操作数;
- 第一个操作数结果是false,则返回第二个操作数;
- 两个操作数都是对象,则返回第一个操作数;
- 有一个操作数是null,则返回null;
- 有一个操作数是NaN,则返回NaN;
- 有一个操作数是undefined,则返回undefined;
四、乘性操作符
ECMAScript定义3个乘性操作符:乘法、除法、求模;操作数为非数值的情况下执行(Number())自动类型转换,空字符被当做0,true将被当做1
1、乘法(*)
- 常规乘法计算,如乘积超过ECMAScript数值范围,则返回Infinity或-Infinity;
- 有一个操作数是NaN,则结果是NaN;
- Infinity * 0,则结果是NaN;
- Infinity * 非0,则结果Infinity或-Infinity;
- Infinity * Infinity,则结果Infinity;
- 非数值,则自动转为数值在计算;
2、除法(/)第二个操作数除以第一个操作数
- 常规乘法计算,如乘积超过ECMAScript数值范围,则返回Infinity或-Infinity;
- 有一个操作数是NaN,则结果是NaN;
- Infinity / Infinity,则结果NaN;
- 0 / 0,则结果NaN;
- 0 / 非0有限数,则结果Infinity或-Infinity;
- 非0数 / Infinity,则结果Infinity或-Infinity;
- 非数值,则自动转为数值再计算;
3、求模(%)
- 常规除法计算,返回除得的余数;
- 无穷大 / 有限大,返回NaN;
- 有限大 / 0,返回NaN;
- Infinity / Infinity,返回NaN;
- 有限大 / 无穷大,返回被除数(有限大);
- 被除数是0,返回0;
- 非数值,则自动转为数值再计算;
五、加性操作符
1、加法(+)
两个操作符是数值
- 有一个操作数是NaN;返回NaN;
- Infinity + Infinity,返回Infinity;
- (-Infinity )+ ( -Infinity),返回-Infinity;
- Infinity + (-Infinity),返回NaN;
有一个操作符是字符串
- 两个操作符都是字符串,则拼接连个字符串;
var a = '2' +'3';
console.log(a) //输出'23';
- 有一个是字符串,则将另一个操作数转为字符串,在拼接;
var a = '2' +3; //执行中将数值3转为字符串'3' console.log(a) //输出'23';
有一个操作符对象、数值、布尔值,则调用toString()取得相应的字符串;对于undefined和null,则分别调用String()函数分别取得“undefined”和“null”
ECMAScript编程中常见的错误
var n1 = 5;
var n2 = 10;
var n3 = 'ssss' + n1 + n2;
consoel.log(n3) //输出"ssss510"
var n3 = 'ssss' +( n1 + n2);
consoel.log(n3) //输出"ssss15"
2、减法(-)
- 两数值,返回常规结果;
- 有一个为NaN,返回NaN;
- Infinity - Infinity,返回NaN;
- Infinity - (-Infinity),返回Infinity ;
- (-Infinity)- Infinity ,返回-Infinity ;
- 有一个为字符串、布尔值、null或nudefined,则调用Number()转为数值,进行常规操作,如转换为NaN,返回NaN;
- 有一个为对象,则调用valueOf()取得对象数值,如得到NaN,返回NaN;如没有valueOf()方法,则调用toString()得到的字符串在转为数值;
六、关系操作符
< 、> 、<= 、 >= 操作结果返回一个布尔值
非数值,数据类型转换规则:
- 两个都是数值,直接比较;
- 两个都是字符串,比较两个字符串的字符编码值;
- 一个是数值,则将另一个转为数值;
- 一个是对象,则调用valueOf()取得数值,如没有valueOf()方法,则调用toString()方法比较字符编码;
- 一个是布尔值,将其转为数值;
七、相等操作符
1、相等(==)和不相等(!=),先转换在比较;
数据转换规则:
- 一个为布尔值,先将其转换为数值0或1;
- 字符串与数值,先将字符串转为数值;
- 一个为对象,调用valueOf();
null和undefined比较规则:
- null和undefined相等;
- 比较之前,不能讲null和undefined转换为任何值;
- 一个为NaN,相等返回false,不相等返回true,两个都为NaN,相等返回NaN,NaN不等于NaN;
- 两个为对象,比较是不是同一个对象(是否指向同一个对象),相等返回true,反之false;
2、全等(===)和不全等(!==),直接比较;
null == undefined //true 行为相似,都表示无效值 null === undefined //false 不会主动转换分项的数据类型
八、条件操作符
var max = (n1 > n2) ? n1 : n2
九、赋值操作符
(=)右侧值赋给左侧变量,复合赋值操作:
var n = 10;
n = n + 10; //可改为 n += 10; 这就叫复合赋值
十、逗号操作符
逗号操作符可以在一条语句中执行多个操作:
//多个变量声明
var n1 = 1, n2 = 2;
//赋值,返回表达式最后一项
var n = (5,3,2,6,0); //结果为0