JavaScript操作符
一元操作符
只能操作一个值的操作符。
递增和递减操作符
- 前置型:位于要操作的变量之前;
- 后置型:位于要操作的变量之后。
如:
var age = 24;
++ age;
//等同于
var age = 24;
age = age + 1;
var age = 24;
-- age;
//等同于
var age = 24;
age = age - 1;
副效应:执行前置递增和递减操作时,变量的值都在语句被求值前改变。
var age = 24;
var newage = --age + 2;
console.log(age); //值为23
console.log(newage); //值为25
console.log(age + newage); //值为48
后置型递增和递减操作是在包含她们的语句被求值之后才执行。
var age = 24;
var newage = age-- + 2;
console.log(age); //值为23
console.log(newage); //值为26
console.log(age + newage); //值为49
递增和递减操作符遵循下列规则:
- 如果字符串包含有效数字字符,先将其转换为数字值,在执行递增和递减操作,字符串变量变成数值变量;
- 如果字符串不包含有效数字字符,将变量的值设置为NaN,字符串变量变成数值变量;
- 布尔值true 或者false,将转换为1或者0,再执行递增和递减操作,布尔值变量变成数值变量;
- 如果应用于浮点数值,执行递增和递减操作;
- 如果应用于对象,先调用对象的valueOf()方法,取得可供操作的值再应用上述规则。
var a = 24;
var b = "a";
var c = true;
var d = 1.1;
var e = {
valueOf: function() {
return -1;
}
};
a++;
b++;
c++;
d--;
e++;
console.log(a); //值为25
console.log(b); //值为NaN
console.log(c); //值为2
console.log(d); //值为0.10000000000000009
console.log(e); //值为0
一元加和减操作符
一元加操作符以一个(+)表示,但是放在数值前面不会产生影响。
再对非数值应用一元操作符时,会先对值进行转换。
一元操作符还能用于表示负数,也就是将正数转换为负数,但对非数值时,也会先对它进行转换。
位操作符
这部分内容来自于developer.mozilla.org/
有符号32位整数
位操作符用于在最基本的层次上,即按照内存中表示数值的位来操作数值。
所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数。补码形式是指一个数的负对应值(negative counterpart)为数值的所有比特位反转后,再加1。反转比特位即该数值进行’非‘位运算,也即该数值的反码。例如下面为整数314的二进制编码:
00000000000000000000000100111010
下面编码 ~314,即 314 的反码:
11111111111111111111111011000101
最后,下面编码 -314,即 314 的补码:
11111111111111111111111011000110
补码保证了当一个数是正数时,其最左的比特位是0,当一个数是负数时,其最左的比特位是1。因此,最左边的比特位被称为符号位(sign bit)。
0 是所有比特数字0组成的整数。
0 (base 10) = 00000000000000000000000000000000 (base 2)
-1 是所有比特数字1组成的整数。
-1 (base 10) = 11111111111111111111111111111111 (base 2)
-2147483648(十六进制形式:-0x80000000)是除了最左边为1外,其他比特位都为0的整数。
-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)
2147483647(十六进制形式:0x7fffffff)是除了最左边为0外,其他比特位都为1的整数。
2147483647 (base 10) = 01111111111111111111111111111111 (base 2)
数字-2147483648 和 2147483647 是32位有符号数字所能表示的最小和最大整数。
按位逻辑操作符
从概念上讲,按位逻辑操作符按遵守下面规则:
- 操作数被转换成32位整数,用比特序列(0和1组成)表示。
- 第一个操作数的每个比特位与第二个操作数的相应比特位匹配:第一位对应第一位,第二位对应第二位,以此类推。
- 位运算符应用到每对比特位,结果是新的比特值。
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
下面的表格总结了JavaScript中的按位操作符:
运算符 | 用法 | 描述 |
---|---|---|
按位与( AND) | a & b |
对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。 |
按位或(OR) | a | b |
对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。 |
按位异或(XOR) | a ^ b |
对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。 |
按位非(NOT) | ~ a |
反转操作数的比特位,即0变成1,1变成0。 |
左移(Left shift) | a << b |
将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。 |
有符号右移 | a >> b |
将 a 的二进制表示向右移b (< 32) 位,保留符号位(即正负号标记)。 |
无符号右移 | a >>> b |
将 a 的二进制表示向右移b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。 |
布尔操作符
布尔操作符一共有以下3个:
- 逻辑非(not)(!)
- 与(and)(&&)
- 或(or)(||)
逻辑非(!)
逻辑非操作符由一个叹号(!)表示,可以用于任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。
逻辑非操作符遵循下列规则:
- 如果操作数是一个对象,返回false;
- 如果操作数是一个空字符串,返回true;
- 如果操作数是一个非空字符串,返回false;
- 如果操作数是数值0,返回true;
- 如果操作时是任意非0数值,(包括infinity),返回false;
- 如果操作数是null,返回true;
- 如果操作数是NaN,返回true;
- 如果操作数是underfined,返回true。
例如:
var a = {
function(){
return 1;
}
};
console.log(!a); //false
console.log(!""); //true
console.log(!"hello world"); //false
console.log(!0); //true
console.log(!2017); //false
console.log(!null); //true
console.log(!NaN); //true
如果同时使用两个逻辑非操作符,可以得到这个值对应的布尔值。
逻辑与(&&)
逻辑与操作符由 && 表示,有两个操作数,如:
var result = true && false;
其值表为:
第一个操作符 | 第二个操作符 | 结果 |
---|---|---|
true | true | true |
true | flase | false |
false | true | false |
false | flase | false |
逻辑与操作符可以应用于任何类型的操作数。
逻辑与操作符遵循下列规则:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是null,返回null;
- 如果有一个操作数是NaN,返回NaN;
- 如果有一个操作数是underfined,返回underfined。
如果第一个操作数是false,无论第二个操作数是什么值,结果都为false。
逻辑或(||)
逻辑或操作符由 || 表示,有两个操作数,如:
var result = true || false;
其值表为:
第一个操作符 | 第二个操作符 | 结果 |
---|---|---|
true | true | true |
true | flase | true |
false | true | true |
false | flase | false |
逻辑与操作符遵循下列规则:
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果为false,则返回第二个操作数;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果有一个操作数是null,返回null;
- 如果有一个操作数是NaN,返回NaN;
- 如果有一个操作数是underfined,返回underfined。
如果第一个操作数是true,无论第二个操作数是什么值,结果都为true。
乘性操作符
3个乘性操作符:
- 乘法;
- 除法;
- 求模。
如果参与乘性计算的某个操作符不是数值,后台会先使用number()转型函数将其转换为数值。
乘法
乘法操作符由一个 * 表示,用于计算两个数值的乘积。
乘法操作符遵循下列规则:
- 数值 * 数值,执行常规乘法计算;
- x * NaN,结果为NaN;
- Infinity * 0,结果为NaN;
- Infinity * y(y不等于0),结果为+-Infinity;
- Infinity * Infinity,结果为Infinity。
除法
除法操作符由一个 / 表示,执行两个数值的除法运算。
除法操作符遵循下列规则:
- 数值 / 数值,执行常规除法计算;
- x / NaN,结果为NaN;
- 0 / 0,结果为NaN;
- 非零有限数 / 0,结果为+-Infinity;
- Infinity / Infinity,结果为结果为NaN;
- Infinity / 任何非零数,结果为+-Infinity。
求模
求模(余数)操作符由一个 % 表示。
求模操作符遵循下列规则:
- 数值 % 数值,执行常规求模计算;
- 无穷大值 % 有限大值,结果为NaN;
- 有限大值 % 0,结果为NaN;
- Infinity % Infinity,结果为NaN;
- 有限大值 % 无穷大值,结果为有限大值;
- 0 % 任何数,结果为0。
加性运算符
加法
加法操作符由一个 + 表示。
加法操作符遵循下列规则:
- 在两个操作数都是数字的时候,会做加法运算
- 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
- 在参数有对象的情况下会调用其valueOf或toString
- 在只有一个字符串参数的时候会尝试将其转换为数字
- 在只有一个数字参数的时候返回其正数值
var a = 5;
var b = 10;
console.log("5加10的值为:" + a + b); //5加10的值为:510
console.log("5加10的值为:" + (a + b)); //5加10的值为:15
减法
加法操作符由一个 - 表示。
加法操作符遵循下列规则:
- x - NaN,结果为NaN;
- Infinity - Infinity,结果为NaN;
- -Infinity - -Infinity,结果为NaN;
- Infinity - -Infinity,结果为Infinity;
- -Infinity - Infinity,结果为-Infinity;
- +0 - +0 = +0;
- +0 - -0 = -0;
- -0 - -0 = +0.
关系操作符
关系操作符一共有4个:
- 小于(<);
- 大于(>);
- 小于等于(>=);
- 大于等于(>=)。
关系操作符遵循下列规则:
- 如果两个操作数都是数值,执行数值比较;
- 如果两个操作符都是字符串,执行两个字符串对应的字符编码值比较;
- 如果两个操作符其中一个是数值,将另一个转换为数值再进行比较;
- 如果两个操作符其中一个是布尔值,将其转换为数值再进行比较。
var a = "Brick";
var b = "alphabet";
console.log(a < b); //true
console.log(a.toLowerCase() < b.toLowerCase()); //false
相等操作符
相等和不相等
先转换再比较
相等操作符由 == 表示;
不相等操作符由 != 表示。
相等操作符遵循下列规则:
- 如果包含布尔值:将false转换为0,true转换为1;
- 如果包含字符串和数值,将字符串转换为数值;
- 如果一个操作符石对象,另一个不是则遵循:
- null == underfined;
- 比较之前,不能将null和underfined转换为其他任何值;
- 如果有一个操作数是NaN,相等操作符返回false,不相等操作符返回true;
- NaN == NaN,相等操作符返回false,不相等操作符返回true;
- 如果两个操作数都是对象,则比较她们是不是同一个对象。
全等和不全等
仅比较不转换
全等操作符由 === 表示;
不全等操作符由 !== 表示。
null == underfined,返回true;
null === underfined,返回false,因为它们是不同类型的值。
条件操作符
语法
condition ? expr1 : expr2
参数
condition:计算结果为true或false的表达式。
expr1, expr2:值可以是任何类型的表达式。
描述
如果条件值为真值(true),运算符就会返回 expr1 的值;否则, 就会返回 expr2 的值。
var a = 13;
var b = 16;
var max = (a > b) ? a : b;
console.log(max); //返回值为16
赋值操作符
赋值操作符由 = 表示。
简单赋值操作:
var age = 18;
复合赋值(在 = 前面添加其他操作符)操作:
var age = 18;
age += 10;
//等同于
age = age + 10;
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作,如:
//逗号操作符用于声明多个变量
var a = 1, b = 2, c = 3;
//逗号操作符用于赋值
var a = (1,2,3,4);
//由于4是表达式中的最后一项,因此a的值就是4
运算符优先级汇总表
Operator precedence练习
// Number + Number -> 数字相加
console.log(1+1); //2
// String + String -> 字符串连接
console.log("2"+"4"); //"24"
// Number + String -> 字符串连接
console.log(2+"4"); //"24"
// 只有一个字符串参数 -> 数值
console.log(+"4"); //4
var a = 1;
a+++a;
// a+++a -> (a++)+a,a++返回值为1,a自增运算结果为2,即1+2=3
typeof a+2;
// typeof a+2 -> (typeof a)+2,typeof a返回值为number,即number+2="number2"
var a = 1;
var b = 3;
console.log( a+++b );
// a+++b -> (a++)+b,a++返回值为1,即1+3=4