Javascript里的if判断与逻辑运算符(||, &&)和比较运算符的特别之处
写JS时不可避免要用到 if 与 逻辑运算符( ||, &&)。
如果你经常阅读Js的第三方组件源码, 会发现有一种写法作为初始化变量的方法经常出现。
var variable = variable || {};
我第一次看到这样的代码时觉得很不可思议,在多数主流语言下(如Java,C#,C/C++)上面得到的结果值毫无疑问会是一个布尔值,且始终为true。
在看看另一句我们自己写时也常使用的
if( variable ){ somethingToDo(); }
虽然用得顺手,可是你真的知道哪些值可以触发 If 而哪些是不可以的吗?
还有顺带的一提的是比较运算符,不过这里只说说"=="和"==="。
鉴于以上问题,于是上MDN上看了一些相关资料,顺带作下笔记。
首先来看一张表 :
Operator | Usage | Description |
Logical AND (&& ) |
expr1&&expr2 | Returns expr1 if it can be converted to false ; otherwise, returns expr2 . Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false . |
Logical OR (|| ) |
expr1||expr2 | Returns expr1 if it can be converted to true ; otherwise, returns expr2 . Thus, when used with Boolean values, || returns true if either operand is true . |
Logical NOT (! ) |
!expr | Returns false if its single operand can be converted to true ; otherwise, returnstrue . |
图就不翻译了,相信不难看懂,可以看出除了非运算符(!),其余两者都可能返回expr。
在MDN注明了,如果expr为非布尔值的话,它们也是会被原封不动地返回的,这与java或者c#的逻辑运算符是不同的。
在看来下什么情况下可以被转为false(MDN值提供了可以被转为false的值,也就是说其余的都是true)
他们包括
null
;NaN;
0
;(这是数字的0)- 空字符串(
""
); undefined
.
知道了这些之后,刚才的第一段代码就很好理解了。也就是说,在 variable 为以上五种情况时会初始化为{}。
而第二段的 if 也很清楚地知道了它的判断情况。随便附上一句MDN关于if的解释(原文点我)。
The if statement executes a statement if a specified condition is truthy. If the condition is falsy, another statement can be executed.
(如果condition是truhy[这是js定义的一种状态]的,那么statement1会被执行,否则其他statemen会被执行)
示例代码如下:
if (condition) statement1 [else statement2]
而关于truthy和falsy的定义在这个逻辑运算符的介绍页面(原文点这)。
If a value can be converted to
true
, the value is so-called truthy. If a value can be converted tofalse
, the value is so-called falsy.
(如果一个值可以转化为true那么称呼它为truthy,如果一个值可以转为false那么称呼为falsy)。
接下来关于严格等于符[strcit equality](===)和类型转化等于符[type-converting equality](==)。
从名字就看出来了,后者在比较时会执行隐式的类型转化在比较,而前者不会。
MDN列出了几点值得注意的地方(原文点我):
- 严格比较时两个字符串必须在字符顺序,字符,长度都相等时才会相等。
- 严格比较时两个数字必须要拥有相同的数值大小。NaN不等于任何值,包括自己。 正负零没有区分。
- 布尔值严格比较,只有当两者都是true或false时才相同.
- 两个不重复的对象无论使用===或者==都不可能相等。
- 当表达式比较的是对象时,只有它们的引用是来自同一个对象时才会为true.
- null和undefine严格相等比较时,只等于自身,而抽象比较(==)时相等。
以上。
这几点都是我们在写Js时常用的,如果没彻底理解的话,恐怕会出一些不可思议的错误(笑),所以作下笔记,方便大家与自己都可以参考。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构