为什么'\t' == 0 结果是true |【你不知道的JS】
打开控制台随机开始了验证,居然是真的,为什么会这样呢?聊一聊这个神奇的事情~
1. 字符串 '\t' 是什么?
首先,让我们看看 '\t'
是什么。'\t'
是一个包含制表符字符的字符串。
制表符是一种特殊字符,通常用于在文本中创建水平间距,就像在文档中的制表符键或者按下 Tab 键一样。它在字符串中以 \t
进行表示。
2. JavaScript 中的类型转换
在 JavaScript 中,==
是相等运算符,它用于比较两个值是否相等。当使用 ==
进行比较时,JavaScript 会根据一组隐式类型转换规则来尝试将操作数转换为相同的类型,然后再进行比较。
以下是 ==
运算符的隐式类型转换规则的简要描述:
-
类型转换:如果两个操作数的类型不同,JavaScript 会尝试将它们转换为相同的类型。
-
原始类型比较:如果两个操作数都是原始类型(如数字、字符串、布尔值),它们将会被转换为相同的类型,然后进行比较。
-
null 和 undefined 比较:如果其中一个操作数是
null
,另一个是undefined
,它们会被视为相等。 -
字符串和数字比较:如果一个操作数是字符串,另一个是数字,JavaScript 会尝试将字符串转换为数字,然后进行比较。如果字符串不能转换为有效的数字,则比较结果为
false
。 -
布尔值比较:如果一个操作数是布尔值,另一个是非布尔值,布尔值会被转换为数字,然后进行比较。
true
被转换为1
,false
被转换为0
。 -
对象和原始类型比较:如果一个操作数是对象,另一个是原始类型,对象会被转换为原始类型,然后再进行比较。这通常涉及到对象的
valueOf()
和toString()
方法。 -
特殊情况:有一些特殊情况,如
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