likes
comments
collection
share

为什么'\t' == 0 结果是true |【你不知道的JS】

作者站长头像
站长
· 阅读数 33

打开控制台随机开始了验证,居然是真的,为什么会这样呢?聊一聊这个神奇的事情~

为什么'\t' == 0 结果是true  |【你不知道的JS】

1. 字符串 '\t' 是什么?

首先,让我们看看 '\t' 是什么。'\t' 是一个包含制表符字符的字符串。

制表符是一种特殊字符,通常用于在文本中创建水平间距,就像在文档中的制表符键或者按下 Tab 键一样。它在字符串中以 \t 进行表示。

2. JavaScript 中的类型转换

在 JavaScript 中,== 是相等运算符,它用于比较两个值是否相等。当使用 == 进行比较时,JavaScript 会根据一组隐式类型转换规则来尝试将操作数转换为相同的类型,然后再进行比较。

以下是 == 运算符的隐式类型转换规则的简要描述:

  1. 类型转换:如果两个操作数的类型不同,JavaScript 会尝试将它们转换为相同的类型。

  2. 原始类型比较:如果两个操作数都是原始类型(如数字、字符串、布尔值),它们将会被转换为相同的类型,然后进行比较。

  3. null 和 undefined 比较:如果其中一个操作数是 null,另一个是 undefined,它们会被视为相等。

  4. 字符串和数字比较:如果一个操作数是字符串,另一个是数字,JavaScript 会尝试将字符串转换为数字,然后进行比较。如果字符串不能转换为有效的数字,则比较结果为 false

  5. 布尔值比较:如果一个操作数是布尔值,另一个是非布尔值,布尔值会被转换为数字,然后进行比较。true 被转换为 1false 被转换为 0

  6. 对象和原始类型比较:如果一个操作数是对象,另一个是原始类型,对象会被转换为原始类型,然后再进行比较。这通常涉及到对象的 valueOf()toString() 方法。

  7. 特殊情况:有一些特殊情况,如 NaN-0,它们的比较行为可能比较复杂。

对转换规则有疑惑的可以参考 JavaScript "loose" comparison step by step ,这是一个线上工具,可以将比较过程按照步骤呈现出来。

总之,== 运算符在比较不同类型的值时,会尝试将它们转换为相同类型,然后再进行比较。这种类型转换的行为可能导致一些意外的结果,因此在编写 JavaScript 代码时,最好使用 ===(严格相等运算符)来避免隐式类型转换并确保类型和值都相等。

所以当我们执行'\t' == 0的时候触发了类型转换规则的第 4 步,也就是将'\t'转化为数字类型,我们看结果:

Number("\t"); // 0

是不是很奇怪,我理解的过程是这样:

当 JavaScript 尝试将字符串转换为数字时,它会查看字符串的内容。

如果字符串表示一个有效的数字,它将被转换为数字。但是,如果字符串的内容不是有效的数字字符,JavaScript 会将其转换为 NaN,而有一些特殊含义的字符会被转化为数字 0

在这里,'\t' 中的制表符字符被认为不是有效的数字字符,而是属于特殊的字符,因此它被转换为数字 0

这里你可能会疑惑,为啥'\t'会转成0呢? 举个例子:

const text = "Hello,\nWorld!";
console.log(text);
/* 
Hello,	World! 
*/

所以其实'\t'在输出的时候是一个制表符,没有实际的内容,所以在转换时被转化为了 0

除此之外还有三个特殊字符:

  • \n:表示换行符(Newline)。当你在字符串中使用 \n 时,它表示在这个位置开始新的一行。这通常用于在文本中创建换行。

  • \t:表示制表符(Tab)。当你在字符串中使用 \t 时,它表示在这个位置插入一个制表符,用于产生水平间距。制表符通常用于排列文本中的内容,以使其对齐。

  • \r:表示回车符(Carriage Return)。\r 通常与 \n 一起使用,表示在文本中的某个位置开始新的一行,并回到该行的起始位置,然后继续输入文本。但在大多数情况下,\n 就足够表示换行,\r 不常用。

这三个特殊字符串在进行字符串转换数字时也都是0

Number("\n"); // 0
Number("\t"); // 0
Number("\r"); // 0

当然也有另外一个说法,是字符串中在 toNumber 时它首先会去除空格,然后判断该数字是否为非数字。如果 NaN,则结果为 NaN。如果字符串为空,则结果为 0。

具体的实现,英语好的同学可以看看 ECMA - toNumber

3. 结果

因此,当我们执行 '\t' == 0 比较时,JavaScript 首先将 '\t' 转换为数字,这个过程中 '\t' 被转换为 0,然后与右侧的数字 0 进行比较。由于它们都是数字 0,比较结果为 true

参考

转载自:https://juejin.cn/post/7283690681175015436
评论
请登录