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!)

二、==

会对不同类型的数据进行强制转换以比较,记住两点即可:

  1. undefined和null永远互相相等
  2. 当两个不同类型的值进行比较,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).

2. Return ToNumber(primValue).

ToPrimitive()转换规则:

形式参数 结果
Object (在做相等判断进行强制转换时)先调用valueOf(),没有返回值再调用toString(),还没有返回值则报错。
otherwise… 不变

示例:

[0] == true;

 1 //EQUALITY CHECK...
 2 [0] == true;
 3
 4 //HOW IT WORKS...
 5 //convert boolean using toNumber
 6 [0] == 1;
 7 //convert object using toPrimitive
 8 //[0].valueOf() is not a primitive so use...
 9 //[0].toString() -> "0"
10 "0" == 1;
11 //convert string using toNumber
12 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!

三、===

值和类型都必须严格相等:

  1. 不同类型永远不相等
  2. 对象必须引用自同一个对象才相等
  3. 字符串必须包含相同的字符集合
  4. 原型(primitives)共享同一个值才相等
  5. NaN, null and undefined永远不和其他类型相等
  6. 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/

时间: 2024-10-07 09:08:21

JavaScript if(x),==和===解析(翻译整理)的相关文章

关于Javascript的内存泄漏问题的整理稿

写了好长时间javascript小功能模块,从来没有关注过内存泄漏问题.记得以前写C++程序的时候,内存泄漏是个严重的问题,我想是时候关注一下了.网上找了篇文章,Mark一下.原文地址:http://www.blogjava.net/tim-wu/archive/2006/05/29/48729.html 常规循环引用内存泄漏和Closure内存泄漏 要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理. 我记得原来在犀牛书<JavaScript: The D

《深入理解JavaScript系列》系列技术文章整理收藏

<深入理解JavaScript系列>系列技术文章整理收藏 深入理解JavaScript系列来自汤姆大叔的整理贴,原文地址http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 此处收藏供JavaScript学习参考 1深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2深入理解JavaScript系列(2):揭秘命名函数表达式 3深入理解JavaScript系列(3):全面解析Module模式

css图片切换效果分析+翻译整理

Demos:http://tympanus.net/Tutorials/CSS3SlidingImagePanels/ 出处:http://tympanus.net/codrops/2012/01/17/sliding-image-panels-with-css3/ 这个教程将介绍如何使用纯CSS创建一个干净的幻灯图片面板.主要想法是在面板中使用背景图片,然后在点击标签后让动画起效. 今天我们将向您展示如何创建仅适用于CSS一些巧妙的滑动图像面板.该想法是使用背景图像的面板和一个标签上点击时动画

《浅谈JavaScript系列》系列技术文章整理收藏

<浅谈JavaScript系列>系列技术文章整理收藏 1浅谈JavaScript中面向对象技术的模拟 2浅谈javascript函数劫持[转自xfocus]第1/3页 3浅谈javascript 面向对象编程 4老鱼 浅谈javascript面向对象编程 5浅谈javascript的数据类型检测 6浅谈Javascript嵌套函数及闭包 7根据一段代码浅谈Javascript闭包 8浅谈JavaScript编程语言的编码规范 9浅谈Javascript面向对象编程 10浅谈JavaScript

JavaScript : DOM文档解析详解

JavaScript DOM  文档解析 1.节点(node):来源于网络理论,代表网络中的一个连接点.网络是由节点构成的集合 <p title=“a gentle reminder”> Don’t forget to buy this stuff.</p> 节点及其类型 元素节点: 属性节点:元素的属性,可以直接通过属性的方式来操作 文本节点:元素节点的子节点,其内容通常为文本 2.Node接口的特性和方法 现在给出一个演示的HTML文件: html <!doctype h

Javascript Array 非常用方法解析

1. map var ary = Array(3); ary[0] = 2 ary.map(function(elem) { return '1'; }); 结果是["1", undefined * 2], 因为map 只能被初始化过的数组成员调用 2. reduce [].reduce(Math.pow): //typeError, 空数组上调用reduce [3,2,1].reduce(function(x, y) { console.log(x, y); return Math.

几行Python代码快速解析、整理上万份数据文件

在这个世界上,人们每天都在用 Python 完成着不同的工作.而文件操作,则是大家最常需要解决的任务之一.使用 Python,你可以轻松为他人生成精美的报表,也可以用短短几行代码快速解析.整理上万份数据文件. 当我们编写与文件相关的代码时,通常会关注这些事情:我的代码是不是足够快?我的代码有没有事半功倍的完成任务? 在这篇文章中,我会与你分享与之相关的几个编程建议.我会向你推荐一个被低估的 Python 标准库模块.演示一个读取大文件的最佳方式.最后再分享我对函数设计的一点思考. 下面,让我们进

JavaScript的原生Ajax解析

通过JavaScript的Ajax进行详细的解析过程,从而更好的了解Jquery的Ajax. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻烦了.  笔记链接:http://pan.baidu.com/s/1qYdQdKK 密码:pvj2   一.JavaScript原生ajax1.原生ajax代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

javascript中的模式解析——原型模式

理解原型模式,首先要理解prototyoe(这个单词翻译 原型)属性,<javascript高级程序设计>书中描述到——我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法. 我在上一篇构造函数模式所说的,我们构建了一个一个Person函数,然后通过new一个person函数来创建了person1实例,person2实例,既然每个函数都有一个prototype属性,那么我有几个问题想要弄明白: per