如何理解javascript强制?

how to understand javascript coercion?

我在看this talk,16:34上有一个javascript强制测试:

这些计算背后的确切逻辑是什么?

了解具有功能的symboled之间的逻辑:

1.) 5(整数型)减4(字符串型)结果1、4实现为int

2.) 5(整数类型)加4(字符串类型)结果54,5实现为字符串

3.)+plus !is not {}括号结果为true

4.)加上数组一+[1],结果1

5.)加上数组一和数组二(多数据集),结果Nan,不行

6.)7 (int) 减去字符串 ("a"),结果 Nan 因为它不可能

7.)7 除以 0,如果数字除以 0 总是无穷大,则结果与数学函数一样无穷大

Wiki:Coercion /koʊˈɜːrʃən/ 是通过恐吓或威胁或其他形式的压力或武力迫使另一方非自愿地采取行动的做法。

像数字 1 是 int 不适合和强写的字符串

只是为了帮助您理解 language.Hope 背后的逻辑,这对您有帮助 :)

What is your resource of choice to understand type coercion in javascript?

spec.

一些例子:

  • 为了理解为什么 5 - "4" === 1,我会查找 binary - operator in the spec 并查看每个参数都调用了 ToNumber

  • 要理解为什么 +!{}[true] === 1,我首先要理解 {}[true] 使用 bracket notation property accessor, which uses ToPropertyKey on the value, which will use ToString on true since true is not a Symbol, so it is the same as {}["true"], and since that object has no property called "true" the result is undefined, then to understand why +!undefined === 1 I would look at the spec for the unary logical ! operator and see that it uses ToBoolean (before negating the result), and ToBoolean converts undefined to false. To understand why +true === 1, I would look at the spec for the unary + operator and see that it calls ToNumber on its operand, and ToNumber 计算 true1

这些规则实际上非常简单直观,一旦您习惯了它们,很快就会发生这种情况。如果您从规范中了解它们,就不会感到惊讶。

5 - "4"  // 1

- 运算符将其操作数强制转换为数字。请参阅它使用的 the subtraction operator and the abstract ToNumber 操作。

5 + "4"  // 54

当任一操作数是字符串时,+ 是字符串连接,而不是加法,如果需要,另一个操作数将被强制转换为字符串。请参阅 the addition operator and the abstract ToPrimitive and ToString 操作。

+!{}[true]  // 1

解释这个毫无意义。不要在你的代码中这样做。

哦,好的:

  • {}[true] 首先计算。 true 被强制转换为 "true"(通过上面链接的 ToString),因为它在 属性 访问器中使用并且不是符号。 {} 是一个空对象,所以 {}[true]undefined,留下 +!undefined.
  • !undefinedtrue,因为它通过抽象 ToBoolean operation, and then negates thatundefined 强制为布尔值以获得 true.
  • +true 是 1,因为上面链接了 ToNumber。
+[1]  // 1

[1] 是一个包含 1 的数组。将 + 应用到 运行 通过 ToPrimitive,最终结果是 [1].join(","),给我们..."1"。由于 ToNumber,+"1" 为 1。

+[1, 2]  // NaN

和上面几乎一模一样,但是由于字符串"1,2"不能完全解析为数字,我们得到NaN.

7 - "a"  // NaN

几乎和我们的第一个例子一模一样。 ToNumber("a")NaN,任何涉及 NaN 的计算(例如减法)都会导致 NaN

7 / 0 // Infinity

在JavaScript中,除以0定义为无穷大;见 Applying the / Operator.

如你所见,这些都是可以通过参考规范来理解的。有些是棘手的,但真正棘手的是你在现实世界中几乎 运行 不会遇到的事情。

要了解强制转换,您只需要了解正在发生的事情。首先,JavaScript 是一种动态类型语言。与其他一些编程语言不同,JavaScript 不需要您定义变量的类型。

示例:

var a = 1
//you are not telling JavaScript that
// 1 is an integer, you are just defining it as is

因此,在尝试分解您列出的示例之前,您接下来必须了解要将 method 应用于对象,两种方法必须相同 type

示例:

5 + "hello" = ?
// in math, you can't possibly add a number to a word right?
// and JavaScript realises that. 
// But instead of throwing an error, it "coerces" the
// integer 5, into a string "5",
// giving you the answer "5hello"

最后,我将使用前两个示例作为强制对比。

第一个是5 - "4" = 1,第二个是5 + "4" = "54"。 结果差异的主要原因很大程度上是因为所涉及的符号。虽然我们可以 "add" 串在一起(简单地连接它们)但是我们应该如何 "minusing" 串?

虽然这可能是对 JavaScript 中强制转换的非常简短的解释,但希望它能让您更清楚地了解情况。