JavaScript中 !!、&&和||以及其他运算符的故事

  先吐槽下谷哥的搜索,在搜索框中输入关键词"!!",没有搜索结果...,在度娘中这样搜索却能找到我想要的答案,然后segmentfault.com里面的搜索也是完全对"!!"关键词不作反应,最后安利下百度的 site:segmentfault !! 这种搜索方式,还是可以找到比较满意的资料的。

1. 关于 JavaScript 中的 !!

while(!!_tempNode && _tempNode.nodeType != 1){
    _tempNode = _tempNode.nextSibling;
}

  是这段代码引起了我的注意,因为这里面 _tempNode 的取值只会是 null 或者是 Node对象,感觉这个 !! 出现的道理不是很明确。后来才发现这里的一个重要知识点,就是 !! 和 && / || 连用的情况。如果 && / || 连接两侧的数据类型都是 Boolean 类型,那么答案显而易见。但是一旦出现有不是 Boolean 类型的数值,却没有进行转换,就会出现想不通的情况。两者都遵循这样一个规律,有一个操作数不是布尔值的情况下,逻辑与、逻辑或(&&/||)就不一定返回 Boolean 类型的值。

(1). 逻辑与

- 如果第一个操作数是对象,则返回第二个操作数;

- 如果第二个操作数是对象,则只有在第一个操作数的求值结果是 true 的情况下才会返回该对象;

- 如果两个操作数都是对象,则返回第二个操作数;

- 如果有一个操作数是null / NaN / undefined,则返回null / NaN / undefined;

(2). 逻辑或

- 如果第一个操作数是对象,则返回第一个操作数;

- 如果第一个操作数的求值结果是false,则返回第二个操作数;

- 如果两个操作数都是对象,则返回第一个操作数;

- 如果两个操作数都是null / NaN / undefined,则返回null / NaN / undefined;

之前代码中的情况:“_tempNode && _tempNode.nodeType != 1”,如果没有 !! 带来的类型转换,这里就完全脱离了这行代码的本意。

时间: 2024-10-24 03:55:20

JavaScript中 !!、&&和||以及其他运算符的故事的相关文章

javascript中的【~~】运算符

javascript中的[~~]运算符,简单一点的用法就是可以将一些变量转化为Number(数字)类型的. 将数字类型的字符串转化为纯数字. var a = '123'; console.log(~~a); // 输出数字类型的123 如果字符串中带了其他字母,符号,或者其他除数字外的东西,一律输出Number类型的0. var a = '123a'; console.log(~~a); // 输出0 任何boolen类型的,如果为TRUE则输出1,FALSE输出0. var a = 1 ==

JavaScript中的6种运算符总结

JavaScript 运算符主要包括: 算术运算符 赋值运算符 比较运算符 三元运算符 逻辑运算符 字符串连接运算符 运算符 说明 例子 运算结果 + 加 y = 2+1 y = 3 - 减 y = 2-1 y = 1 * 乘 y = 2*3 y = 6 / 除,返回结果为浮点类型 y = 6/3 y = 2 % 求余,返回结果为浮点类型要求两个操作数均为整数 y = 6%4 y = 2 ++ 递加,分为前加和后加对布尔值和 NULL 将无效 y = 2++y(前加)y++(后加) y = 3

Javascript中&&和&,||和|运算符两个不同点

1.性能上的比较 如果&&的第一个运算数是false,就不再考虑第二个运算数,直接返回false:如 果||的第一个运算数是true,也不再考虑第二个运算数,直接返回true.&和|运算符却不是这样的,它们总是要比较两个运算数才得出结果, 因而性能上&&和||会比&和|好. 由于&&和||可能不考虑第二个运算数,所以我们应尽量避免在它们右边使用具有副作用(赋值.递增.递减和函数调用)的表达式,除非非常清楚自己再做什么. if((a == nu

javascript中运算符的优先级

运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出JavaScript运算符.具有相同优先级的运算符按从左至右的顺序求值. 其中圆括号可用来改变运算符优先级所决定的求值顺序.这意味着圆括号中的表达式应在其用于表达式的其余部分之前全部被求值. z = 78 * (96 + 3 + 45) 在该表达式中有五个运算符: =, *, (), +

JavaScript中“typeof”运算符与“instanceof”运算符的差异

在JavaScript中,运算符“typeof”和“instanceof”都可以用来判断数据的类型,那么这两个运算符有什么不同之处呢? 差异一:使用方式不同. 最明显的差异就是这两个运算符的使用方式了.“typeof”是一元运算符,其后直接跟需要进行类型判断的数据:而“instanceof”是二元运算符,其左侧是需要判断的数据,右侧是用于比较的类型. //typeof是一元运算符: var amount = 108; console.log(typeof amout);//控制台输出“numbe

JavaScript中逗号运算符和this

遇到一道题目,写出下面的输出: 结果如下: 第一个是child's name没有问题,第二个指定的也是child,依然是child's name,第三个和第二个实际上是一样的,(parentObj.child=parentObj.child)相当于(parentObj.child),都是函数名,第四个又是什么鬼呢. 逗号运算符是很少见的,查了资料才知道,使用逗号运算符时,先计算左操作数的值,再计算右操作数的值,最后返回右操作数的值.因此,(parentObj.child,parentObj.ch

JavaScript中易犯的小错误-------常见错误四:比较运算符

JavaScript中易犯的小错误-------常见错误四:比较运算符JavaScript中一个比较便捷的地方,便是它可以给每一个在比较运算的结果变量强行转化成布尔类型.但是从另一方面来考虑,有时候它也会为我们带来很多不便,下面的这些例子便是一些一直困扰很多程序员的代码实例:console.log(false == '0');console.log(null == undefined);console.log(" \t\r\n" == 0);console.log('' == 0);

javascript中算术运算符规则

javascript中提供了几种算术运算符,+(加)  -(减)  *(乘)  /(除)  %(余),常规用法与数学上的一致:  但还规定一些特殊规则: 注:JavaScript中保存数值的方式,可以保存正零(+0)和负零(-0):正零与负零被认为相等. 乘性操作符(*): 如果结果太大或太小,那么生成的结果是 Infinity 或 -Infinity. 如果某个运算数是 NaN,结果为 NaN. Infinity 乘以 0,结果为 NaN Infinity 乘以 0 以外的任何数字,结果为 I

JavaScript中的逗号运算符

JavaScript中的逗号运算符(,)是顺序执行两个表达式. expression1, expression2 其中,expression1是任何表达式,expression2是任何表达式. 逗号运算符(,)导致按从