【转】The && and || Operator in JavaScript
原文: https://blog.mariusschulz.com/2016/05/25/the-andand-and-operator-in-javascript
The && and || Operator in JavaScript
-------------------------------------------------
Similar to other C-like programming languages, JavaScript defines the two operators &&
and ||
which represent the logical AND and OR operations, respectively. Using only the two boolean values true
and false
, we can generate the following truth tables:
// Logical AND operation
true && true; // true
true && false; // false
false && true; // false
false && false; // false
// Logical OR operation
true || true; // true
true || false; // true
false || true; // true
false || false; // false
If applied to boolean values, the &&
operator only returns true
when both of its operands are true
(and false
in all other cases), while the ||
operator only returns false
when both of its operands are false
(and true
in all other cases).
Using Logical Operators with Non-Boolean Values
In JavaScript, the logical operators have different semantics than other C-like languages, though. They can operate on expressions of any type, not just booleans. Also, the logical operators do not always return a boolean value, as the specification points out in section 12.12:
The value produced by a
&&
or||
operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions.
The following examples showcase some values produced by &&
and ||
:
"foo" && "bar"; // "bar"
"bar" && "foo"; // "foo"
"foo" && ""; // ""
"" && "foo"; // ""
"foo" || "bar"; // "foo"
"bar" || "foo"; // "bar"
"foo" || ""; // "foo"
"" || "foo"; // "foo"
Both &&
and ||
result in the value of (exactly) one of their operands:
A && B
returns the value A if A can be coerced intofalse
; otherwise, it returns B.A || B
returns the value A if A can be coerced intotrue
; otherwise, it returns B.
They select one of their operands, as noted by Kyle Simpson in his You Don't Know JS series:
In fact, I would argue these operators shouldn't even be called "logical operators", as that name is incomplete in describing what they do. If I were to give them a more accurate (if more clumsy) name, I'd call them "selector operators," or more completely, "operand selector operators."
Control Flow Structures and Truthy Values
In practice, you might not even notice that &&
and ||
don't always produce a boolean value. The body of control flow structures like if
-statements and loops will be executed when the condition evaluates to a "truthy" value, which doesn't have to be a proper boolean:
let values = [1, 2, 3];
while (values.length) {
console.log(values.pop());
}
// 3
// 2
// 1
So when is a value considered "truthy"? In JavaScript, all values are considered "truthy", except for the following six "falsy" values:
false
undefined
null
NaN
0
(both+0
and-0
)""
The above while
-loop works because after popping the last element, values.length
returns the "falsy" value 0
. Therefore, the loop body won't be executed and the loop terminates.
Truthy and Falsy Return Values
Let's look at an example where it actually matters that &&
and ||
don't necessarily produce a boolean value. Imagine you're developing a web application. Users can be signed out, in which case the user
object is null
, or they can be signed in, in which case the user
object exists and has an isAdmin
property.
If you wanted to check whether the current user is an administrator, you would first check whether the user is authenticated (that is, user
is not null
). Then, you would access the isAdmin
property and check whether it's "truthy":
let user = { isAdmin: true };
// ...
if (user && user.isAdmin) {
// ...
}
You might even consider extracting the expression user && user.isAdmin
into a separate isAdministrator
function so you can use it in multiple places without repeating yourself:
function isAdministrator(user) {
return user && user.isAdmin;
}
let user = { isAdmin: true };
if (isAdministrator(user)) {
// ...
}
For user objects with a boolean isAdmin
property, either true
or false
will be returned, just as intended:
isAdministrator({ isAdmin: true }); // true
isAdministrator({ isAdmin: false }); // false
But what happens if the user
object is null
?
isAdministrator(null); // null
The expression user && user.isAdmin
evaluates to null
, its first operand, because user
contains a "falsy" value. Now, a function called isAdministrator
should only return boolean values, as the prefix is
in the name suggests.
Coercion to Boolean Values
In JavaScript, a common way to coerce any value into a boolean is to apply the logical NOT operator !
twice:
function isAdministrator(user) {
return !!(user && user.isAdmin);
}
The !
operator, produces the value false
if its single operand can be coerced into true
; otherwise, it returns true
. The result is always a proper boolean, but the truthiness of the operand is flipped. Applying the !
operator twice undoes the flipping:
!!true = !false = true
!!false = !true = false
!!0 = !true = false
!!1 = !false = true
Another option would've been to call the Boolean
function, which is a slightly more explicit way to convert a given value to a proper boolean value:
function isAdministrator(user) {
return Boolean(user && user.isAdmin);
}
Conclusion
In JavaScript, &&
and ||
don't always produce a boolean value. Both operators always return the value of one of their operand expressions. Using the double negation !!
or the Boolean
function, "truthy" and "falsy" values can be converted to proper booleans.
【转】The && and || Operator in JavaScript的更多相关文章
- What is the !! (not not) operator in JavaScript?
What is the !! (not not) operator in JavaScript? 解答1 Coerces强制 oObject to boolean. If it was falsey ...
- The tilde ( ~ ) operator in JavaScript
From the JavaScript Reference on MDC, ~ (Bitwise NOT) Performs the NOT operator on each bit. NOT a y ...
- [TypeScript] Use the JavaScript “in” operator for automatic type inference in TypeScript
Sometimes we might want to make a function more generic by having it accept a union of different typ ...
- JavaScript简易教程(转)
原文:http://www.cnblogs.com/yanhaijing/p/3685304.html 这是我所知道的最完整最简洁的JavaScript基础教程. 这篇文章带你尽快走进JavaScri ...
- JavaScript constructors, prototypes, and the `new` keyword
Are you baffled(阻碍:使迷惑) by the new operator in JavaScript? Wonder what the difference between a func ...
- JavaScript简易教程
这是我所知道的最完整最简洁的JavaScript基础教程. 这篇文章带你尽快走进JavaScript的世界——前提是你有一些编程经验的话.本文试图描述这门语言的最小子集.我给这个子集起名叫做“Java ...
- 【转】Expressions versus statements in JavaScript
原文地址:http://www.2ality.com/2012/09/expressions-vs-statements.html Update 2012-09-21: New in Sect. 4: ...
- javascript prototype原型链的原理
javascript prototype原型链的原理 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/javasc ...
- JavaScript技巧手冊
js小技巧 每一项都是js中的小技巧,但十分的有用! 1.document.write(""); 输出语句 2.JS中的凝视为// 3.传统的HTML文档顺序是:documen ...
随机推荐
- 6.Spark streaming技术内幕 : Job动态生成原理与源码解析
原创文章,转载请注明:转载自 周岳飞博客(http://www.cnblogs.com/zhouyf/) Spark streaming 程序的运行过程是将DStream的操作转化成RDD的操作, ...
- gvim 编辑器配置
"关才兼容模式 set nocompatible "模仿快捷键,如:ctrt+A 全选.Ctrl+C复制. Ctrl+V 粘贴等 source $VIMRUNTIME/vimrc_ ...
- django-BBS(1)
1.首先分析BBS的设计需要,然后设计相应的数据库.填写在models.py 中 2.修改setting.py中的内容: a.将appname加入INSTALLED_APP中 b.修改DATABASE ...
- 19. Remove Nth Node From End of List【Medium】【删除单链表倒数第n个结点】
Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
- go chapter 4 - 不定长参数
https://www.cnblogs.com/chase-wind/p/5644838.html 空接口可以指向任何数据对象,所以可以使用interface{}定义任意类型变量,同时interfac ...
- 解决vscode按下ctrl+S的时候自动格式化
按下ctrl+S的时候自动格式化 为什么需要这种操作? 优点: 保存的时候格式化,让我们的代码自动格式化,减少人工调整. 缺点: 有一些打好包的JS有时候修改一下,但不需要格式化,因为打好包就是要压缩 ...
- C++中的读入输出优化及清新脱俗的宏命令
C和C++有了#define,从此它就变了模样 宏命令就是#define,#if,#error之类的 本文主要介绍宏命令和相关的骚操作 读入输出优化 inline int read() { int a ...
- AGC 022 B - GCD Sequence
题面在这里! 锻炼脑子的小构造题... 一开始被 a[]<=30000 且 序列 gcd = 1所困扰,但是发现这并没有什么,因为我接下来发现了一种总是能构造出 序列和是6的倍数的方案. 首先如 ...
- 【贪心】AtCoder Grand Contest 018 B - Sports Festival
假设我们一开始选取所有的运动项目,然后每一轮将当前选择人数最多的运动项目从我们当前的项目集合中删除,尝试更新答案.容易发现只有这样答案才可能变优,如果不动当前选取人数最多的项目,答案就不可能变优. 我 ...