运算符的常见问题
1、算数运算符常见问题
(1)运算浮点时运算会有误差(二进制精度问题影响)。
(2)算术运算符中前后有字符串的出现且有+运算符的情况下则一般会完成字符串的拼接。
(3)如果运算过程中没有字符串且使用+运算符的情况下,其他类型都会转换为Number类型并进行加法运算。
(4)所有类型遇到 - * / % 运算符时,都会隐式转换为数值,然后进行计算。
2、一元运算符和赋值运算符
赋值运算符:
var a = 3;
a += "";
(1)会利用隐式转换完成字符串的拼接。
var a = 5;
var b = a+5+(a+=5);
(2)优先级问题:优先级低的无法直接排在优先级高的后直接运算,通常需要加()来解决问题,不然代码会出现报错。
(3)当进行左移位或者右移位时先转换为二进制。
(4)赋值运算符优先级非常低。
一元运算符:
(1)a++与++a的问题。
从结果来说对于a他们的计算结果相同。
但在两者同时用于计算时,a++时将a先参与运算或者赋值,而++a是将a加1后的结果先参与运算或者赋值。
(2)对于 " ++ " 和 " – " 来说通常都会直接使用算数运算符来处理,一般情况下先转化为数值,然后在进行运算。
var a = 3;
var b = a+++a+++a+a+a+++a+++a;
var c = a+++(a+=a)+a++;
他们的结果都是一定的。
3、关系运算符与逻辑运算符
关系运算符:
(1)它不一定只用于比较两者之间关系,还可以参与计算。
var a=3,
b=4,
c=5;
c+= a<b;
(2)== 优先转换为数值然后进行比较
console.log(0=='') true
console.log(false=='') true
console.log(0==false) true
特殊
console.log(null==undefined) true
只有null与undefined比较才是true,其余都为false。
console.log(NaN==NaN) false
NaN为唯一存在的值,它无法与自身相等,因为它可能是任何一个值。
逻辑运算符
(1)&& 的一些用法
true && true = (第二个值)
true && false = (第二个值)
false && true = (第一个值)
false && false = (第一个值)
例如:
console.log(3&&0); 0
console.log(3&&4); 4
console.log(""&&0); ""
(2)|| 的一些用法
true || true = (第一个值)
true || false = (第一个值)
false || true = (第二个值)
false || false = (第二个值)
var obj;
obj = obj || {a:1}
若obj转换为布尔的值为true,则直接熔断。
如果为false则取第二个值。
位运算
主要用于专项代码,代码不易被看懂。
(1)&运算
特点: 1 & 1 = 1, 1 & 0 = 0,
0 & 1 = 0, 0 & 0 = 0.
25 & 34 = 0;
//25 转化为二进制为 011001;
//34 转换为二进制为 100010;
// 所以计算结果为 000000;
6 & 7 = 7;
37 & 7 = 5;
任何与2^n-1为原数值。(二进制转化所剩后几位时)。
(2)|运算
特点: 1 | 1 = 1, 0 | 1 = 1,
1 | 0 = 1, 0 | 0 = 0.
25 | 34 = 59;
//25 转化为二进制为 011001;
//34 转换为二进制为 100010;
// 所以计算结果为 111011;3*16+11=59.
(3)^异或运算
特点: 1 ^ 1 = 0, 0 ^ 1 = 1,
1 ^ 0 = 1, 0 ^ 0 = 0.
6 ^ 7 = 1;
// 110 ^ 111 = 001
(4)~位非运算
特点:加1取负数
~1 = -2
(5)<< >> 左移右移
a<<b 将a的二进制向左移动b个单位,右边用0填充。
a>>b 将a的二进制向右移动b个单位,并丢弃被移位的值。
(6)三目运算
var a = 3>2 ? 1 : 0;
判断条件是否成立,如果成立返回第一个值,否则返回第二个值。
或者说若转换布尔为真则返回第一个值,否则返回第二个值。
注:
问号前的内容会隐式转换为布尔值
三目运算比赋值运算高
当需要返回是布尔值时,不需要用三目运算。