【转】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 && Breturns the value A if A can be coerced intofalse; otherwise, it returns B.A || Breturns 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:
falseundefinednullNaN0(both+0and-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 usercontains 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 Booleanfunction, "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 ...
随机推荐
- LocalStorage、SessionStorage使用详解
https://blog.csdn.net/zhongzh86/article/details/55504381
- bzoj1030 AC自动机+dp
思路:建状态图,在状态图上dp. #include<bits/stdc++.h> #define LL long long #define ll long long #define fi ...
- 推荐Maven的两个仓库
概述 推荐两个maven的仓库,可用于查找依赖,下载jar包. 正文 mvnrepository 这个仓库用来检索依赖.下载jar包:网址:http://mvnrepository.com/ 仓库的主 ...
- JavaScript 对象创建
tips: JavaScript 除了null和undefined之外,其他变量都可以当做对象使用. JavaScript 的基本数据类型有:number boolean string null u ...
- Memory Allocation with COBOL
Generally, the use of a table/array (Static Memory) is most common in COBOL modules in an applicatio ...
- java 日期validate
public static boolean isValidDate(String str) { boolean convertSuccess=true; // 指定日期格式为四位年/两位月份/两位日期 ...
- 使用ICSharpCode.SharpZipLib+Aspose模板批量导出Word
由于是Web端的项目,所以点击按钮之后直接从Aspose模板读取数据,然后在内存中操作,而不是下载到本地后再打包弄到内存中下载.废话不多说,直接上代码 public ActionResult Expo ...
- UML动态模型(顺序图、协作图、状态图)
顺序图:用来表示用例中的行为顺序,当执行一个用例行为时,顺序图中的每条信息 对应了一个类操作或状态机中引起转换的事件.顺序图展示对象之间的交互,这些交互是指在场景或用例的时间六中发生的,顺序图属于动态 ...
- Java高级架构师(一)第38节:Nginx的负载均衡模块
负载均衡: 1.热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务.服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB..... upstream ...
- sqlserver 脚本 多条记录遍历
临时表方式实现多条记录遍历 declare @oper_cart_item_id bigint; declare @oper_cart_id bigint; declare @the_last_cha ...