Js 中 && 运算的那些事
今天女友qq头像闪个不停,点开一看着实使我吃了一惊。只见上面写着这样两行js代码:
var num=(7<10&&10);
alert(num);
问题是这样的,这个 num 为啥是10 而不是 true或者1?
(在这里向各位博友说明一下, 本人女友是做前端的,现正在学习javascript,而我本人学习javascript已有一年多了,虽然我的主打语言是PHP,不过工作中也一直在使用js,所以对js也是有些理解的。因此这个问题就摆在了我的面前)
我试着对这个问题进行了如下解答:
首先 我们知道 && 是与运算即逻辑与 && 两边同时为真的时候才为真(true),其它情况为假(false)。在一些语言中0即为假 1即为真(其实非0即为真),例如我们看C语言中的这段代码
这段代码运行的结果 i 的值为 1
&&两边都为真 所以返回的结果为真,又C语言中1即为真 所以i的值为1,这点毋庸置疑。
好接下来我们慢慢的向开头的问题靠近。虽然说‘非0’即为真,那么说 1、10、20或者是其它‘非0’的数都可以认为是‘真’,这些数如果作为if或者循环语句的判断条件也都成立,即 If(20){} 条件为真 if(10){} 条件为真 等等。但是反过来说 ‘真’即为10、20或者30就不是那么贴切了。看C代码中的表达式 &&左边 13<20为真,20 为真,真&&真 当然为真,将‘真’赋值给整型的变量 i时 i的值也就成了1,不是20也不是30。原生的C语言中并没有 布尔 这种数据类型,但是在有布尔类型的语言中 ‘真’并不完全等价于 1。看下面这段PHP代码以及运行结果
从上面不难看出 true 在 值上面等于1 但是并不等价于1。当然在php中输出的时候true也会被输出为1,并不会输出true, 只有字符串“true” 才会被打印出true,这点不再赘述(在这里借此机会说明一下,在php中 === 符号很常用,经常用来判断 false 和 值为0 的情况)。
好我们接着看下面一段PHP代码及运行结果
没错啊 类似于(12<20&&20)的这种表达式返回的是布尔值啊,输出为1。说了这么多了竟然还没有回答出女友问的那个问题,她可能会着急了。噢 No,已经着急了。慢慢来,上面长篇的铺垫肯定是有用的。
现在我们接着说,在js中返回的不是true 或者1 而直接是具体的数值。为什么会是这样?
Js文档中给出的答案和我们理解的相同,两边同为true时才是true,就是简单的逻辑与,并没有给我们明确的答案。但是在js中 &&左边的表达式为真时会去检测其右边表达式的真假,如果两边都为真,那么&&运算会返回右边表达式的值,而不是布尔值。我们看12<20 表达式为true,20 也可以看做是一个表达式,非0即为真,所以右边也是true,没错啊,文档中已经说了,两边同时为true时返回true,那就奇怪了。但是注意了,文档中说的两边同时为true时返回true。12<20表达式返回true没问题,但是20是一个整数,非0即为真,只是说条件成立,但是20并不等价于true,而js中&&运算的机制是 该运算在哪边停止就返回那一边的值,也就是说 当程序检测12<20成立时会继续检测右边的值,当发现也为真时就把20这个值返回,注意是值,20不等价于true 那更不会是1了。
假如左边条件不成立,比如是 12>20 的话,该表达式返回false,左边为假了,运算也就不再向右进行了,直接返回false,如果左边是0 那表达式返回的就是0。说到这应该知道为啥返回20 而不是true或者1了。
举几个例子,我们可以试着推理一下结果,然后再去运行,就能发现其中的奥妙了
1、var i = (12>20&&10); alert(i);
2、var i =(12<20&&true); alert(i);
3、var i =(false&&10); alert(i);
4、var i = (0&&true); alert(i);
5、var i =(true&&0); alert(i);
6、var i =(true&&false); alert(i);
到了这里,费了这么大的篇幅总算说清这个问题了。还希望广大博友不会嫌我啰嗦,如有问题欢迎在下面留言,大家共同探讨,共同进步。
相关文章
使用 PHP MySQLi 函数获取最后插入的 ID
发布时间:2023/05/09 浏览次数:85 分类:MySQL
-
本篇文章简要介绍了 PHP mysqli() 函数并演示了如何使用它从 MySQL 数据库中获取最后插入的 ID。它是一个名为 mysqli 的 MySQL 驱动程序扩展版本,
使用 CSS 和 JavaScript 制作文本闪烁
发布时间:2023/04/28 浏览次数:146 分类:CSS
-
本文提供了使用 CSS、JavaScript 和 jQuery 使文本闪烁的详细说明。
在 PHP 中使用 MongoDB 作为文件存储
发布时间:2023/04/20 浏览次数:133 分类:MongoDB
-
在为大文件创建可扩展存储方面,MongoDB 及其 GridFS(使用 MongoDB 查询语言 - MQL 编写)是市场上最好的文件存储解决方案之一。 在本教程中,您将学习如何在 PHP 中使用 MongoDB 作为文件存储。
如何在 PHP 中获取时间差的分钟数
发布时间:2023/03/29 浏览次数:183 分类:PHP
-
本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。