迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

Js 中 && 运算的那些事

作者:迹忆 最近更新:2022/11/13 浏览次数:

今天女友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);


到了这里,费了这么大的篇幅总算说清这个问题了。还希望广大博友不会嫌我啰嗦,如有问题欢迎在下面留言,大家共同探讨,共同进步。

上一篇:没有了

下一篇:基于dede系统制作sitemap的xml文件

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Do you understand JavaScript closures?

发布时间:2025/02/21 浏览次数:108 分类:JavaScript

The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.

Do you know about the hidden traps in variables in JavaScript?

发布时间:2025/02/21 浏览次数:178 分类:JavaScript

Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av

How much do you know about the Prototype Chain?

发布时间:2025/02/21 浏览次数:150 分类:JavaScript

The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便