JavaScript中if (xx)和a==b的判断

JavaScript中的很多操作都会有隐含的类型转换,这可能会导致一些违反直觉的结果。

if (xx) 的判断

JS的if语句会先对括号内的表达式求值,然后将表达式的结果转换为boolean类型再做判断。转换成boolean类型时遵循下列规则:

  • 如果表达式的值是一个对象,返回true
  • 如果表达式的值是一个空字符串,返回false
  • 如果表达式的值是一个非空字符串,返回true
  • 如果表达式的值是数值0,或NaN,返回false
  • 如果表达式的值是任意非零数值(包括Infinity),返回true
  • 如果表达式的值是null,返回false
  • 如果表达式的值是undefined,返回false

示例:

/* 字符串 */
if ("hello") {
  console.log("true");
} // true

if ("") {
  console.log("true");
} // true

if (" ") {
  console.log("true");
} // true

if ("0.00") {
  console.log("true");
} // true

/* 数值 */
if (0.00) {
  console.log("true");
} // false

/* 对象 */
if ({}) {
  console.log("true");
} // true

if ([]) {
  console.log("true");
} // true

相等操作符 ==

JavaScript中有两种相等运算符,=====
当两个操作数的类型相同时,=====没有什么区别,
当两个操作数的类型不同时,===会直接返回false,而==会先转换操作数的类型,再比较它们是否相等。

"666" == 666 // true,转换后相等
“666" === 666 // false,因为数据类型不同

在转换操作数的类型时,==!=遵循以下规则:

  • 如果其中一个操作数是布尔值,则将其转换为数值——false转换为0,而true转换为1
false -- 0 // true
true -- 1 // true
  • 如果一个操作数是字符串,而另一个是数值,则将字符串转换为数值
"" == true // false,空字符转为数值是0
"5" == 5 // true
"str" == 5 // false,"str"转换为数值是NaN
"NaN" == NaN // false,NaN不等于任何数值
  • 如果一个操作数是对象,则现将对象转换为原始类型的值,调用对象的valueOf()方法,如果得到的还是对象则调用toString()方法转换为字符串。然后再按照上面的规则判断
[] == false // true, [].valueOf()仍返回[], [].toString返回""空字符串
[0] == true // false, 这什么鬼
["0.00"] == true // false

还有一些其他的规则

  • nullundefined相等
null == undefined // true
  • nullundefined与其他类型比较时不会转换为其他类型
null == 0 // false
undefined == 0 // false
  • 如果有一个操作数是NaN,则==返回false;即使两个操作数都是NaN==也返回false
NaN == NaN // false
NaN != NaN // true
  • 如果两个操作书都是对象,则比较它们是不是同一个对象。
var obj1 = {};
var obj2 = {};
console.log(obj1 == obj2); // false

var obj1 = {};
var obj2 = obj1;
console.log(obj1 == obj2); // true

相等和严格相等

使用相等==会进行隐含的类型转换,所以建议不言使用==,只是用严格相等运算符===

0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
' \t\r\n ' == 0 // true
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,546评论 0 13
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,504评论 0 21
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,545评论 19 139
  • 1、标识符 标识符是指变量、函数、属性的名字,或函数的参数。 格式规则: 第一个字符必须是一个字母、下划线(_)或...
    霜天晓阅读 763评论 0 0
  • “如今一个又一个的供货商上门逼债,各种停货断货,银行各种催还贷款,每天起的比鸡早睡的比狗晚,厂房租要到期了要交钱,...
    铠甲加身阅读 954评论 0 0

友情链接更多精彩内容