JavaScript if(x),==和===解析(翻译整理)
一、if()中的布尔判断
if ( Expression ) 表达式会通过ES5定义的ToBoolean方法强制把Expression 转换成布尔值。
| 数据类型 | 转换结果 |
| Undefined | false |
| Null | false |
| Boolean | 不变 |
| Number | +0, −0, or NaN 转换为false; 其他的转换为true. |
| String | 空字符串或长度为0的字符串转换为false; 其他的转换为true. |
| Object | true |
示例:
var trutheyTester = function(expr) {
return expr ? "truthey" : "falsey";
}
trutheyTester({}); //truthey (an object is always true)
trutheyTester(false); //falsey
trutheyTester(new Boolean(false)); //truthey (an object!)
trutheyTester(""); //falsey
trutheyTester(new String("")); //truthey (an object!)
trutheyTester(NaN); //falsey
trutheyTester(new Number(NaN)); //truthey (an object!)
二、==
会对不同类型的数据进行强制转换以比较,记住两点即可:
- undefined和null永远互相相等
- 当两个不同类型的值进行比较,Object会被toPrimitive()转化为原始值,String和Boolean会被toNumber()转换为数字或NaN
| Type(x) | Type(y) | Result |
| x和y是同一种数据类型 | 和===判断原则一样一样 | |
| null | Undefined | true |
| Undefined | null | true |
| Number | String | x == toNumber(y) |
| String | Number | toNumber(x) == y |
| Boolean | (any) | toNumber(x) == y |
| (any) | Boolean | x == toNumber(y) |
| String or Number | Object | x == toPrimitive(y) |
| Object | String or Number | toPrimitive(x) == y |
| otherwise… | false | |
toNumber()的转换规则:
| 形式参数类型 | 结果 |
| Undefined | NaN |
| Null | +0 |
| Boolean |
true -->1; false-->+0; |
| Number | 不变 |
| String | “abc” -> NaN “123” -> 123 |
| Object |
1. Let primValue be ToPrimitive(input argument, hint Number). |
ToPrimitive()转换规则:
| 形式参数 | 结果 |
| Object | (在做相等判断进行强制转换时)先调用valueOf(),没有返回值再调用toString(),还没有返回值则报错。 |
| otherwise… | 不变 |
示例:
[0] == true;
//EQUALITY CHECK...
[0] == true; //HOW IT WORKS...
//convert boolean using toNumber
[0] == 1;
//convert object using toPrimitive
//[0].valueOf() is not a primitive so use...
//[0].toString() -> "0"
"0" == 1;
//convert string using toNumber
0 == 1; //false!
“potato” == true;
//EQUALITY CHECK...
"potato" == true; //HOW IT WORKS...
//convert boolean using toNumber
"potato" == 1;
//convert string using toNumber
NaN == 1; //false!
“potato” == false;
//EQUALITY CHECK...
"potato" == false; //HOW IT WORKS...
//convert boolean using toNumber
"potato" == 0;
//convert string using toNumber
NaN == 0; //false!
object with valueOf;
//EQUALITY CHECK...
crazyNumeric = new Number(1);
crazyNumeric.toString = function() {return "2"};
crazyNumeric == 1; //HOW IT WORKS...
//convert object using toPrimitive
//valueOf returns a primitive so use it
1 == 1; //true!
object with toString;
//EQUALITY CHECK...
var crazyObj = {
toString: function() {return "2"}
}
crazyObj == 1; //HOW IT WORKS...
//convert object using toPrimitive
//valueOf returns an object so use toString
"2" == 1;
//convert string using toNumber
2 == 1; //false!
三、===
值和类型都必须严格相等:
- 不同类型永远不相等
- 对象必须引用自同一个对象才相等
- 字符串必须包含相同的字符集合
- 原型(primitives)共享同一个值才相等
- NaN, null and undefined永远不和其他类型相等
- NaN甚至不会和自己相等
| 数据类型 | 值 | 结果 |
| 二者类型不同 | false | |
| Undefined or Null | true | |
| Number | 二者值相等,除了NaN | true |
| String | 二者包含相同的字符 | true |
| Boolean | 二者都是true或false | true |
| Object | 二者引用自同一个对象 | true |
| otherwise… | false | |
参考资料:
1. 《Truth, Equality and JavaScript 》:https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
JavaScript if(x),==和===解析(翻译整理)的更多相关文章
- JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】
原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...
- JavaScript : DOM文档解析详解
JavaScript DOM 文档解析 1.节点(node):来源于网络理论,代表网络中的一个连接点.网络是由节点构成的集合 <p title=“a gentle reminder”> ...
- 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码
[实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...
- Javascript语言精粹之正则表达式知识整理
Javascript语言精粹之正则表达式知识整理 1.正则表达式思维导图 2.正则表达式常用示例 2.1 移除所有标签,只留下innerText var html = "<p>& ...
- JavaScript 对象所有API解析【2020版】
JavaScript 对象所有API解析[2020版] 写于 2019年08月20日,虽然是2019年写的文章,但现在2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromE ...
- JavaScript 上下文环境和作用域,以及 call、apply 和 bind【转载+翻译+整理】
--看到这篇文章,翻译国外的,虽说写得有点矫情,但总体来看,还是相当不错的- 本文内容 我在哪儿?你又是谁 ? this? 用 apply 和 call 掌控上下文环境 bind 之美 本文将说明上下 ...
- JavaScript:如何获得 Private、Privileged、Public 和 Static 成员(属性和方法)【翻译+整理】
本文内容 背景 把我们的对象放在一起 添加一个私有(Private)的属性 添加一个特权(Privileged)的方法 添加一个公共(Public)的属性和方法 添加一个静态(Static)的属性 我 ...
- 关于Javascript的内存泄漏问题的整理稿
写了好长时间javascript小功能模块,从来没有关注过内存泄漏问题.记得以前写C++程序的时候,内存泄漏是个严重的问题,我想是时候关注一下了.网上找了篇文章,Mark一下.原文地址:http:// ...
- javascript ----> Immediately-Invoked Function Expression (IIFE)(翻译)
http://benalman.com/news/2010/11/immediately-invoked-function-expression/ 如果你没有注意到,我对术语有一点点坚持. 所以,在听 ...
随机推荐
- Spring MVC和Spring Data JPA之获取数据表数据放在List集合,显示在JSP页面
涉及到很多xml配置没写:只写具体实现的所有类 1.实体类 对应数据表SYS_SBGL, 主键是SBBM,主键是自动生成的uuid 数据表内容如下(有图有真相): package com.jinhet ...
- 最小生成树之克鲁斯卡尔(Kruskal)算法
学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- > ch05-01
这是<<shaders for game programmers and artists>> 第五章中第一个shader例子--RTT..一直没弄出结果,今天记下来,主要是操作 ...
- vsftp服务器同步文件
首先vsftp同步文件,并没有好的解决方案,网上有一些软件是可以定时同步文件的,我是用的是linux上的一款工具Rsync 首先先了解一下Rsync与scp的区别:点我 1.安装Rsync 两种安装方 ...
- 爬虫从网页中去取的数据中包含 空格
爬虫从网页中爬取的数据中带了一个 这样的空格,使用trim()函数和replace(" ", "")去掉不了,找了一下资料发现,空格有两种一种是从键盘输入的对应 ...
- 安装pyenv virtualenv
地址:https://github.com/pyenv/pyenv-virtualenv Check out pyenv-virtualenv into plugin directory $ git ...
- [C#] 网站程序ASP.NET的性能诊断 - CPU分析
微软提供了标准的CLR性能分析类库 https://github.com/Microsoft/clrmd 这个类库是开源的代码.能够获取CLR runtime里面几乎所有的信息. 如何获取clrmd编 ...
- hacking a friend's Linux buzzer driver in OK335xS
/**************************************************************************** * hacking a friend's L ...
- How to convert int [12] to array<int, 12>
code: // array::data #include <iostream> #include <cstring> #include <array> int m ...