JS中的逻辑运算符
对于操作数为非boolean类型的数据
&& 或 || 运算前先将其进行隐式类型转换,在进行判断,最终返回原值
1//当操作数为两个时,
2console.log(5&&4+"\n"); // 5隐式转换之后为true,返回4
3console.log(4&&5+"\n"); // 4隐式转换之后为true,返回5
4console.log(""&&5+"\n"); //空字符串转换之后为false,返回""
5console.log(null&&5+"\n"); //操作符中存在null,结果就为null
6console.log(4&&undefined+"\n"); //操作符中存在undefined,结果就为null
7console.log(NaN&&5+"\n"); //操作符中存在NaN,结果就为null
8//当操作数为3个及以上时,
9console.log(5&&4&&6+"\n"); //结果为真时,返回最后一个数的原值 6
当操作数为非Boolean类型的时候,&&运算符依旧遵循“短路”运算法则:
以两个操作数为例: (表达式1,表达式2)
1.如果第一个操作数隐式转换为Boolean之后为true,则返回第二个操作数;
2.如果第一个操作数隐式转换为Boolean之后为false,则返回第一个操作数;
3.在&&运算中,但凡操作数中有 null ,undefined ,NaN 这些特殊值,结果就返回这些值。(虽然这些值转换为Boolean之后为false,但返回是将这些值直接输出)
1//当操作数为两个时,
2console.log(5||4+"\n"); // 5隐式转换之后为true,返回5
3console.log(4||5+"\n"); // 4隐式转换之后为true,返回4
4console.log(""||5+"\n"); //空字符串转换之后为false,返回5
5console.log(null||5+"\n"); //null隐式转换之后为false,返回5
6console.log(4||undefined+"\n"); //4隐式转换之后为true,返回4
7console.log(NaN||5+"\n"); // NaN隐式转换之后为false,返回5
8//当操作数为3个及以上时,
9console.log(5||4||6+"\n"); //结果为真时,返回第一个数的原值 5
以两个操作数为例: (表达式1,表达式2)
1.如果第一个操作数隐式转换为Boolean之后为true,则返回第一个操作数;
2.如果第一个操作数隐式转换为Boolean之后为false,则返回第二个操作数;
3.需要注意的是:||运算符不对 null, undefined, NaN 有特殊要求,而是将他们隐式转换为 false。
!非运算符(非真即假)
对于操作数为非boolean类型的数据
对一个boolean值进行取反操作,即:!true=false !fasle=true
对于操作数为非boolean类型的数据
首先将其转换为Boolean,在进行双取反(两次非运算操作)
1var a =10;
2console.log(typeof a); // number
3console.log(a); //10
4
5a=!!a; // 对a进行两次取反
6console.log(typeof a); //boolean
7console.log( a); // true
!!a==Boolean(a) 对a进行的两次非运算操作相当于是对a进行Bololean的强制类型转化。
像这种隐式类型转换用法更灵活,也比较方便,
1// Number转换为String
2var a= 123;
3a=a+""; //相当于 String(a)或者 a.toString()
4console.log(typeof a); //String
5console.log(a); //123
6
7// String转换为Number
8var str="12345";
9console.log(typeof str); //string
10var str=str*1; //相当于Number(str)或parseInt(str)
11console.log(typeof str); //number
12console.log(str); //12345
所以字符串转化为数字类型,可以通过 str-0, str*1, str/1,这样的运算实现隐式类型转换。
另外需要注意的是,唯一没有 + 运算符,因为解释器会认为 + 号是字符串和数字的拼接。
使用示例:
1// Array Remove - By John Resig (MIT Licensed) - JQuery 之父写的数组中删除某一元素方法
2Array.prototype.remove = function(from, to) {
3 var rest = this.slice((to || from) + 1 || this.length);
4 this.length = from < 0 ? this.length + from : from;
5 return this.push.apply(this, rest);
6};
原文:https://blog.csdn.net/weixin_45599355/article/details/109614367