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时常用的,如果没彻底理解的话,恐怕会出一些不可思议的错误(笑),所以作下笔记,方便大家与自己都可以参考。
Javascript里的if判断与逻辑运算符(||, &&)和比较运算符的特别之处的更多相关文章
- javascript里for循环的一些事情
今天在给一个学妹调她的代码BUG时,她的问题就是在一个for循环里不清楚流程的具体流向,所以导致了页面怎么调都是有问题,嗯确实你如果不清楚语句流向很轻易就会出问题,所以说for循环不会用或者说用的不恰 ...
- Javascript里,想把一个整数转换成字符串,字符串长度为2
Javascript里,想把一个整数转换成字符串,字符串长度为2. 想把一个整数转换成字符串,字符串长度为2,怎么弄?比如 1 => "01"11 => " ...
- javascript里的循环语句
前序:我一直对于for跟for..in存在一种误解,我觉得for都能把事情都做了,为啥还要for...in...这玩意了,有啥用,所以今天就说说JavaScript里的循环语句. 循环 要计算1+2+ ...
- javascript和jquery如何判断元素是否存在最佳。
在传统的Javascript里,当我们对某个页面元素进行某种操作前,最好先判断这个元素是否存在.原因是对一个不存在的元素进行操作是不允许的.例如: document.getElementById(&q ...
- JavaScript 里的 'this' 的一般解释
本文旨在帮助自己和大家理解 JS 里的 this, 翻译.整理并改写自本人关注的一个博主 Dmitri Pavlutin,原文链接如下: https://dmitripavlutin.com/gent ...
- JavaScript根据文件名后缀判断是否图片文件
//JavaScript根据文件名后缀判断是否图片文件 //图片文件的后缀名 var imgExt = new Array(".png",".jpg",&quo ...
- JavaScript里的依赖注入
JavaScript里的依赖注入 我喜欢引用这句话,“程序是对复杂性的管理”.计算机世界是一个巨大的抽象建筑群.我们简单的包装一些东西然后发布新工具,周而复始.现在思考下,你所使用的语言包括的一些内建 ...
- 如何才能通俗易懂的解释javascript里面的"闭包"?
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- 在JavaScript中,如何判断数组是数组?
如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaScript呀,任何你觉得已经习以为常的东 ...
随机推荐
- 201521123101 《Java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) 2 ...
- 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)
中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...
- struts2---自定义类型转换器
从servlet我们知道从页面获取到的参数都是string类型,但是struts2中基本的数据类型,它可以自动帮我们转化为其对应的包装类,就像获取到123,可以自动转化为Integer,但是比如201 ...
- ThinkPHP中:add()和addAll()的区别
1.add()是记录单条插入 // 添加一条数据 $User = M("User"); // 实例化User对象 $data['name'] = 'ThinkPHP'; $data ...
- Linux入门之常用命令(14) kill
Linux kill 命令使用详解 功能说明:删除执行中的程序或工作. 语 法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>] 补充说明: ...
- bzoj3156 防御准备 - 斜率优化
Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 102 3 ...
- 1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖
1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个 ...
- 支持向量机(Support Vector Machine)-----SVM之SMO算法(转)
此文转自两篇博文 有修改 序列最小优化算法(英语:Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法.SMO由微软研究院的 ...
- spring框架总结(04)----介绍的是Spring中的JDBC模板
1.1 Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...
- R语言基础语法
学习一门新的语言,率先学习输出hello world.我们就从这里开始学习. 首先打开RStudio这个IDE,然后在左边输入: > mystr <- "hello world& ...