Zlog
首页归档关于
Zlog

一个探索技术、编程和构建 Web 的个人空间。

© 2026 Zlog

导航

首页归档关于

链接

/
|
·
·
·
首页/隐式转换

隐式转换

::: tip 默认的 falsy

Z

Zephyr110

2019年12月28日·2 分钟
|
frontendfrontend-javascript

等价性

“

推荐在任何情景下摒弃 == 操作符,使用 === 替代。

示例:

js
// 故意混淆视野的取反操作,其实比较容易理解
[] == 0 // true
![] == 0 // true
[] == [] // false
[] == ![] // true
// 如果上面的解决了,那这个呢?
0 == null // false

::: tip 默认的 falsy

  • "" (空字符串)
  • 0、-0、NaN (非法的 Number)
  • null、undefined
  • false

非等价性

<、>、<= 和 >= 用于非等价性比较(关系比较)。

当比较的双方都为 String 时按照字典顺序(typical alphabetic rules)比较,当其中一方为 Number 时则均转为 Number 再比较:

js
"aba" > "abb"; // false
"43" > "42"; // true
"43" > 42; // true

当不同类型的值进行比较时:

js
"aba" > 42; // false
"aba" < 42; // false
"aba" == 42; // false
 
// 参考下方的解析,是由于 "aba" 转为数字时结果为 NaN
Number("aba"); // NaN

解析

关于这一部分 ECMA 有规范的说明:5.1 版、6.0 版。

偷懒,借用一下阮一峰的翻译:

  1. 如果 x 不是正常值(比如抛出一个错误),中断执行。
  2. 如果 y 不是正常值,中断执行。
  3. 如果 Type(x) 与 Type(y) 相同,执行严格相等运算 x === y。
  4. 如果 x 是 null,y 是 undefined,返回 true。
  5. 如果 x 是 undefined,y 是 null,返回 true。
  6. 如果 Type(x) 是数值,Type(y) 是字符串,返回 x == ToNumber(y) 的结果。
  7. 如果 Type(x) 是字符串,Type(y) 是数值,返回 ToNumber(x) == y 的结果。
  8. 如果 Type(x) 是布尔值,返回 ToNumber(x) == y 的结果。
  9. 如果 Type(y) 是布尔值,返回 x == ToNumber(y) 的结果。
  10. 如果 Type(x) 是字符串或数值或 Symbol 值,Type(y) 是对象,返回 x == ToPrimitive(y) 的结果。
  11. 如果 Type(x) 是对象,Type(y) 是字符串或数值或 Symbol 值,返回 ToPrimitive(x) == y 的结果。
  12. 返回 false。

根据上述规则则可以得到:

js
// 不符合以上 11 种条件,返回 false
0 == null // false

ToPrimitive

对于以上的规则其中比较难以理解的为该部分了,对象转为原始值需要考虑三种(Boolean、String、Number)情况。

1. Number

所有对象(包括数组、函数)都转为 true。

2. String

对象转为 String 经历以下步骤:

  1. 如果对象具有 toString() 方法,则调用这个方法。如果它返回一个原始值,JavaScript 将这个值转为字符串(如果本身不是字符串的话),并返回这个字符串结果。
  2. 如果对象没有 toString() 方法,或者这个方法并不返回一个原始值,那么 JavaScript 会调用 valueOf() 方法。如果存在这个方法,则 JavaScript 调用它。如果返回值是原始值,JavaScript 将这个值转为字符串(如果本身不是字符串的话),并返回这个字符串结果。
  3. 否则,JavaScript 无法从 toString() 或 valueOf() 获得一个原始值,因此这时它将抛出一个类型错误异常。

3. Number

对象转为 Number 顺序有些区别:

  1. 如果对象具有 valueOf() 方法,后者返回一个原始值,则 JavaScript 将这个原始值转为数字(如果需要的话),并返回这个数字。
  2. 否则,如果对象具有 toString() 方法,后者返回一个原始值,则 JavaScript 将其转换并返回。
  3. 否则,JavaScript 抛出一个类型错误异常。

标签

frontendfrontend-javascript

评论 (0)

评论功能仅在主站可用,请访问 zephyr110.vercel.app

相关文章

OffscreenCanvas

MDN-OffscreenCanvas

2025年12月10日·7 分钟

Service Worker

Web worker 是一种在浏览器中运行的后台脚本,它可以在独立的线程中执行任务,而不会阻塞主线程的执行。Web worker 的主要作用是处理耗时的计算任务,例如图片处理、文本分析、数据处理等,以避免阻塞主线程,提高页面的响应性能

2024年5月28日·4 分钟

vue-tour二次封装

npm install vue-tour

2023年7月22日·7 分钟

← 返回文章列表