一、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/

转载于:https://www.cnblogs.com/wuyanshun/p/6837954.html

JavaScript if(x),==和===解析(翻译整理)相关推荐

  1. JavaScript引擎工作原理解析

    JavaScript引擎是什么 想知道JavaScript引擎是什么,首先要知道JavaScript(简称js)是什么,相信对于屏幕前的你来说,js是干什么的已经不用再多说,但还是有必要介绍下Java ...

  2. JavaScript中的预解析(变量提升)介绍!

    今天小千为大家介绍一下JavaScript中的预解析(变量提升).从什么是预解析及变量的预解析和函数的预解析及加载流程进行学习(注意:我们这里说的ES5中的预解析). 什么是解析 首先代码执行肯定需要 ...

  3. JavaScript ES2021 新特性解析

    JavaScript ES2021 新特性解析 新特性列表 String.prototype.replaceAll Promise.any 逻辑运算符和赋值表达式 数值分隔符 Intl.ListFor ...

  4. JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)

    4.原型 每个函数都有一个prototype属性,这个属性是一个对象,用途是包含可以由特定类型的所有实例共享的属性和方法. 逻辑上可以这么理解:prototype通过调用构造函数而创建的那个对象的原型 ...

  5. html的代码作用域,JavaScript作用域的全面解析(附代码)

    本篇文章给大家带来的内容是关于JavaScript作用域的全面解析(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 作用域决定了变量的生命周期和可见性,变量在作用域范围之外是 ...

  6. JavaScript基础小节——手写重点整理02

    接上一篇博客<JavaScript基础小节--手写重点整理01>:点这里  继续手写整理了一些我认为容易混淆的一些知识点 如图所示:

  7. 《AutoCAD .NET开发指南2012版》翻译整理已完成,欢迎大家下载!

    <AutoCAD .NET开发指南2012版>根据AutoDesk公司网站上的AutoCAD .NET Developer's Guide2012版翻译整理. 原始文档网址为 http:/ ...

  8. 链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)

    原链接:链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-CSDN博客_链接脚本语法 为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个 ...

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

    常规循环引用内存泄漏和Closure内存泄漏 要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理. 我记得原来在犀牛书<JavaScript: The De ...

  10. 【JavaScript 逆向】某道翻译接口逆向

    前言 现在一些网站对 JavaScript 代码采取了一定的保护措施,比如变量名混淆.执行逻辑混淆.反调试.核心逻辑加密等,有的还对数据接口进行了加密,这次的案例就是对一种 MD5 加密方式的破解. ...

最新文章

  1. SAP EWM - 其他主数据 - 供应链单元
  2. 坦白讲!做 Java 工程师,挺好!
  3. 3,ORM组件XCode(简介)
  4. 第四章 数学知识【完结】
  5. android实现语音合成
  6. 【转】补零与离散傅里叶变换的分辨率
  7. matlab神经网络工具箱创建神经网络,matlab神经网络工具箱创建神经网络
  8. λ表达式_Java 8新特性:学习如何使用Lambda表达式,一看必懂
  9. VS2010解决闪退的方法
  10. nacos实现配置中心,对比config
  11. (三)Web框架-龙卷风Tornado之快速上手
  12. 解决IE浏览器无法使用“IP:端口“直接访问的问题
  13. Win11系统设置自动关机的方法分享
  14. 如何从本地硬盘启动计算机,解密:如何在计算机BIOS中设置硬盘启动
  15. python实现LZW算法
  16. 【离散数学】最小生成树失败普罗米
  17. 第五---七章 交换机和路由器的基本配置
  18. 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
  19. 软考A计划-软件设计师(高级程序员)考试大纲
  20. 《控制工程基础》习题集

热门文章

  1. 年轻人,在公司混日子,伤害的是自己!
  2. NoSQL 已死:我们不需要他了
  3. 关于vue项目的文件组织
  4. 对接支付宝遇到的坑sign check fail: check Sign and Data Fail
  5. 【题解】洛谷P2914[USACO08OCT]断电Power Failure
  6. 阿里云服务器上安装mysql的详细步骤
  7. 6月14号=》136页-145页
  8. SQL Pass北京举办第六次线下活动,欢迎报名
  9. Visual C++ 6.0 简体中文企业版
  10. Xcode 添加 background modes、Associated Domains 等设置项