js操作符
作用:操作数值
包括:一元操作符、布尔操作符、乘性操作符、加性操作符、关系操作符、相等操作符、条件操作符、复制操作符;
一元操作符
只能操作一个值
#####1、递增和递减操作符(前置型和后置型)
var age = 22
++ age;
console.log(age) // 30
// 类似 age = age + 1;
var age2 = 22
-- age2;
console.log(age2) // 21
// 类似 age2 = age2 - 1;
// 执行前置递增或递减的时候,变量的值都是在语句被求值以前改变的。
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;
var num4 = num1 + num2;
// console.log(num3);
// console.log(num4);
这4个操作符对任何值都适用,(整数、字符串、布尔值、浮点数值、对象)
-
包含有效数字的字符串:先将其转化为数值,再执行加减1的操作。(var a = ‘2’; console.log(a++))
-
不包含有效数字的字符串:先将其转化为数值NaN。(var a = ‘s’; console.log(++a))
-
布尔值:先将其转换为Number(false)/Number(true) 0/1,再进行操作。(var a = false; console.log(++a))
-
浮点数:直接执行加减1的操作 (var a = 1.2; console.log(–a))
-
对象:先调用他们的valueOf()或 toString()方法,在转换得到值
总结:前置型是先计算再返回数值,后置型是先返回数值再计算。
#####2、一元加和减操作符
一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响;
在对非数值操作时,会先将其转化为number类型,再进行操作;
var s1 = '01';
var s2 = 1.1;
var s3 = false;
var s4 = 'q';
s1 = +s1;
s2 = +s2;
s3 = +s3;
s4 = +s4;
一元减操作符以一个加号(-)表示,放在数值前面,主要用于表示负数;
var s1 = '01';
var s2 = 1.1;
var s3 = false;
var s4 = 'q';
s1 = -s1;
s2 = -s2;
s3 = -s3;
s4 = -s4;
(一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。)
布尔操作符(非、与、或)
#####1、逻辑非(!)
无论这个值是什么数据类型,这个操作符都会返回一个布尔值。首先将其转化为布尔值[ Boolean() ],然后再对其求反;遵循以下规则:
-
如果操作数是一个对象,返回false;
-
空字符串,返回true;
-
非空字符串,返回false;
-
数值0,返回true;
-
任意非0数值,返回false;
-
为null,返回true;
-
为NaN,返回true;
-
为undefined,返回true;
eg:
!{a:1} // false
!''; // true
!'blue'; // false
!0; // true
!12345; // false
!NaN; true;
!undefined; // true
!false; // true
逻辑非操作符也可以用于将一个值转换为与其对应的布尔值;(!!)用2个!来表示,
同时使用2个逻辑非操作符,实际上就会模拟Boolean转型函数的行为;
console.log(!!'blue'); // true;
console.log(!!0); // false;
console.log(!!''); // false;
console.log(!!NaN); // false;
console.log(!!123); // true;
#####2、逻辑与(&&,有2个操作数)
eg: true && false; ====> false;
逻辑与操作符可以用于任何类型的操作数,而不仅仅是布尔值,如果有一个操作数不是布尔值的情况下,就不一定返回布尔值,遵循以下规则:
-
如果第一个操作数为对象,则返回第二个操作数;
-
如果第二个操作数为对象,则只有在第一个操作数的求值结果为true的时候才会返回该对象;
-
如果两个操作数都为对象,则返回第二个操作数;
-
如果第一个操作数为null,则返回null;
-
如果第一个操作数为NaN,则返回NaN;
-
如果第一个操作数为undefined,则返回undefined;
逻辑与操作符属于短路操作符,如果第一个操作数能够决定结果,就不会再对第二个操作数求值;
如果第一个操作数的求值结果为false,无论第二个操作数是什么值,返回结果都是false;
var obj = {a:2};
console.log(obj && 2) // 2
var obj = {a:2};
console.log(true && obj) // {a:2}
console.log(false && obj) // false
var obj1 = {a:2};
var obj2 = {a:3};
console.log(obj1 && obj2) // {a:3}
console.log(null && 2) // null
console.log(NaN && 'ee') // NaN
console.log(undefined && 'ee') // undefined
var found = true;
var result = (found && value);
console.log(result);//Uncaught ReferenceError: value is not defined
var found = false;
var result = (found && value);
console.log(result);// 输出
#####3、逻辑或(||)
两个操作数进行比较,有一个值为true 返回结果就为true,两个值都为false,才会返回false;它遵循以下规则:
-
如果第一个操作数为对象,则返回第一个操作数;
-
如果第一个操作数的求值结果为false,则返回第二个操作数;
-
如果两个操作数都为对象,则返回第一个操作数;
-
如果两个操作数为null,则返回null;
-
如果两个操作数为NaN,则返回NaN;
-
如果两个操作数为undefined,则返回undefined;
与逻辑非类似,逻辑或操作符也是短路运算符,也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了;
var found = true;
var result = (found || value);
console.log(result);//不会报错 输出为true
var found = false;
var result = (found || value);
console.log(result);//Uncaught ReferenceError: value is not defined
// && 用于判断2个条件是否同时满足
// || 用于判断2个条件里是否满足其中一种
##乘性操作符(乘法、除法、求模)
#####1、乘法(*)
如果参与乘性计算的某个操作数不是数值,后台会先使用Number()将其转换为数值,也就是说,空字符串将被当作0,布尔值将被当作1;
遵循以下规则:
-
如果操作数都是为数值,执行常规的乘法计算,如果乘积超过了ECMAScript数值表示的范围,则返回Infinity 或 -Infinity;
-
如果有一个操作数为NaN,则结果为NaN;
-
如果Infinity与0相乘,则结果为NaN;
-
如果Infinity与非0相乘,返回结果为Infinity或-Infinity;
-
如果Infinity*Infinity,返回Infinity;
-
如果某个操作数不是数值,后台会先使用Number()将其转换为数值,再应用上面的规则;
2 * 3 // 6
2 * NaN // NaN
Infinity * 0 // NaN
Infinity * 2 // Infinity
3 * '4' // 12
3 * false // 0
#####2、除法(/)
-
如果操作数都是为数值,执行常规的除法计算,如果乘积超过了ECMAScript数值表示的范围,则返回Infinity 或 -Infinity;
-
如果有一个操作数为NaN,则结果为NaN;
-
如果是Infinity被Infinity除,结果是NaN;
-
如果是0被0除,结果是NaN;
-
如果是非零的有限数被零除,结果是Infinity或者-Infinity(1/0, -1/0。===> Infinity / -Infinity)
-
如果是Infinity被任何非零的数值除,结果是Infinity或者-Infinity;
4 / 2 // 2
2 / NaN // NaN
NaN / 2 // NaN
'2' / 2 // 1
#####3、求模(%)
取余数;
3 % 2 // 1
2%1 / 0
2 % 0 //0
0 % 2 //0
'4' % 8 // 4
##加性操作符
#####1、加法
var result = 5 + 5;
var result2 = 5 + '5';
console.log(result); // 10
console.log(result2); // 55
// 如果有一个操作数是字符串,则将另一个操作数转化为字符串,然后再做拼接
var num1 = 5;
var num2 = 10;
var message = 'The sum of 5 and 10 is ' + num1 + num2;
// console.log(message);
#####2、减法
var result1 = 5 - true; // 4
var result2 = NaN - 1; // NaN
var result3 = 5 - 3; // 2
var result4 = 5 - ''; // 5 (Number('') =0)
var result5 = 5 - '2'; // 3 (Number('2') =0)
var result6 = 5 - null; // 5 (Number(null) =0)
##关系操作符
######包含小于(<),大于(>),小于等于(<=),大于等于(>=),返回都是布尔值
var a1 = 3 > 2; // true
var a2 = '23' < '3'; // true (通过字符编码进行比较)
var a3 = '23' < 3; // false (字符串和数值进行比较的时候,先将字符串转换为数值进再行比较)
var a4 = 'a' < 3; // false
var a5 = NaN < 2; // false (任何操作数和NaN进行比较,返回的都是false)
##相等操作符
(相等和不相等是先转换再比较,全等和不全等是仅比较不转换)
#####1、相等和不相等
'NaN' == NaN // false
5 == NaN // false
NaN == NaN // false (A,B)
NaN != NaN // true
false == 0 // true
true == 1 // true
true == 2 // false
undefined == 0 // false
null == 0 // false
'5' == 5 // true
false == 0 // true
true == 1 // true
-
如果有一个操作数是布尔值,会先将其转换为数值进行比较
-
如果有一个操作数是字符串,会先将其转换为数值进行比较
-
如果有一个操作数是NaN或是有俩个操作数都是NaN,则相等操作符返回时false,不相等操作符返回true;
-
在比较相等性的时候,不能将null和undefined转换成任何类型;
#####2、全等和不全等
除了在比较之前不转换以外,与相等和不相等操作符没有什么区别。
全等 [ === ]
不全等[ !== ]
var result1 = ('55' == 55); // true
var result2 = ('55' === 55); // false
var result1 = ('55' != 55); // false
var result2 = ('55' !== 55); // true
null == undefined // true
null === undefined // false
// null==undefined会返回true,因为它们是类似的值;
//但null===undefined会返回false,因为它们是不同类型的值。
//既然 null 和 undefined 的行为很相似,并且都表示一个无效的值,那么它们所表示的内容也具有相似性,即有 null == undefined // true
// undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象
由于相等和不相等操作符存在类型转换的问题,而为了保持代码中数据类型的完整性以及严谨性,推荐使用全等和不全等操作符;
##条件操作符
条件运算符也叫三元运算符
语法:条件表达式 ? 语句1 : 语句2;
var a = 1, b = 2, c = 3;
//获取a和b中的最大值
var max = a > b ? a : b;
//获取a b c 中的大值
max = max > c ? max : c;
##赋值操作符
#####1、 简单的复制操作符由(=)号表示,其作用就是把右侧的值赋给左侧的值;
var num = 10; // 把10赋给了num
#####2、复合赋值操作符
-
乘/赋值 (*=)
-
除/赋值 (/=)
-
模/赋值 (%=)
-
加/赋值 (+=)
-
减/赋值 (-=)
var num = 10;
num = num + 10;
num += 10;