Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[] == ! [] 为什么返回 true【热度: 100】 #877

Open
yanlele opened this issue Sep 15, 2024 · 0 comments
Open

[] == ! [] 为什么返回 true【热度: 100】 #877

yanlele opened this issue Sep 15, 2024 · 0 comments
Labels
JavaScript JavaScript 语法部分
Milestone

Comments

@yanlele
Copy link
Member

yanlele commented Sep 15, 2024

关键词:js 隐式转换

这个问题涉及到 JavaScript 中的类型转换和比较操作的规则。

在 JavaScript 中,[] == ![]的比较过程如下:

  1. ![]的计算

    !是逻辑非操作符,它会首先将右侧的操作数转换为布尔值,然后反转该布尔值。对于空数组[],在 JavaScript 中,所有对象(包括数组)在布尔上下文中都被认为是true。因此,![]首先将[]转换为true,然后取反,变成false

  2. 比较[]false

    根据 ECMAScript 规范,在进行抽象等值比较(==)时,如果比较的两个操作数类型不同,JavaScript 会尝试将它们转换成一个共同的可比较类型。在本例中,一边是对象(空数组[]),另一边是布尔值false

    规则是,如果有布尔值参与比较,先将布尔值转换为数值再进行比较。布尔值false转换为数值0

  3. 比较[]0

    现在比较的是对象(空数组[])与数字(0)。根据规范,当比较对象与数字时,对象会先尝试转换为原始值(通过调用它的valueOf和(或)toString方法),用于比较。

    对于空数组[][].toString()结果是""(空字符串)。

  4. 比较""0

    最后的比较是在空字符串("")与数字0之间进行。在这个阶段,字符串会被转换为数字,空字符串转换为数字时结果是0

    因此,最终比较的是0 == 0,这显然是true

因此,[] == ![]返回true的原因是,在 JavaScript 中将操作数从对象到布尔值,再到字符串,最后到数字的一系列隐式类型转换导致的。这也展示了 JavaScript 中类型强制转换规则的复杂性和==运算符可能带来的意外行为。这就是为什么很多 JavaScript 编程风格指南推荐使用===(严格等于运算符),因为它不会进行类型转换,可以避免这种类型的意外结果。

@yanlele yanlele added the JavaScript JavaScript 语法部分 label Sep 15, 2024
@yanlele yanlele added this to the milestone Sep 15, 2024
@yanlele yanlele changed the title eslint 如何设置只校验本次 MR 变更的文件内容【热度: 100】 [] == ! [] 为什么返回 true【热度: 100】 Sep 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript JavaScript 语法部分
Projects
None yet
Development

No branches or pull requests

1 participant