Javascript 对于在

Javascript for in

我遇到了一个面试问题,如下所示,但我无法弄清楚 javascript 内部人员如何解释以下代码。

谁能解释一下 JS 引擎是如何解释 for in 的? 这是否意味着“in”不是检查数组中包含的值?

const array = [1,2,3,4,5];

console.log(0 in array)


console.log("0" in array)


console.log(4 in [1,2,3,4,5])


console.log(4 in [1,2,3,4])

如果您正在记录 (let i in [1,2,3,4]),您将看到仅记录数组的索引。由于 [1,2,3,4] 只有索引 3,因此 4 将结果为假,其他选项为真。

也许这就清楚了,如果我们查看对象而不是数组,您会看到 in 实际上是在查看 属性 是否存在于对象

const obj = { foo: "bar"}
console.log( "foo" in obj )
console.log( "bar" in obj )

数组只是另一种类型的对象,它具有类似于数字的属性。

因此您的 console.log(4 in [1,2,3,4]) 正在查看是否存在 属性 4,而不是值 4 是否存在。

在这种情况下,

in 关键字是检查右侧值是否具有左侧给出的 属性 的快速方法。

问题中示例的解释:

const array = [1,2,3,4,5];

0 in array
true

true 是因为 array 变量包含数组对象,该数组对象包含 0 索引处的元素(值为 1 – 您可以使用 array[0])

"0" in array
true

true 是因为 array 变量包含数组对象,该数组对象包含 "0" 键处的元素。 JavaScript 数组实际上是使用字符串 属性 键存储元素的对象。在这种情况下,值 1 存储为 "0" 属性,也可以通过数字 0 索引访问(如上所述)。

4 in [1,2,3,4,5]
true

true 是因为 [1,2,3,4,5] 数组在 4 索引处包含一个元素(值 5

4 in [1,2,3,4]
false

false 是因为 [1,2,3,4] 数组不包含 4 索引处的元素。

Can someone please explain how the JS engine is interpreting for in?

None 这些示例使用 for-in,看起来像这样:

for (const key in something)

他们只是使用 in operator,这完全是另外一回事(尽管也许有些相关)。

该代码中有两件事起作用:

  • in 运算符检查左边命名的 属性(如果需要,名称被转换为字符串)是否存在于右边的对象中(在对象本身上,或者在其任何原型上)。
  • 数组是对象。数组索引实际上是一个 属性 名称。

继续第二点,让我们看一下数组 [1,2,3,4,5]:

+−−−−−−−−−−−−−−−+
|    (array)    |
+−−−−−−−−−−−−−−−+
| "length":   5 | Property name is "length", value is 5
| "0":        1 | Property name is "0", value is 1
| "1":        2 |
| "2":        3 |
| "3":        4 |
| "4":        5 |
| [[Prototype]] |−−−−>Array.prototype, which has various methods
+−−−−−−−−−−−−−−−+

基于该信息:

const array = [1,2,3,4,5];
console.log(0 in array);

in0 转换为 "0" 并在 array 上检查具有该名称的 属性。有一个,所以结果是true.

const array = [1,2,3,4,5];
console.log("0" in array);

in 检查 array 上名为 "0" 属性 的 属性。有一个,所以结果是true.

console.log(4 in [1,2,3,4,5]);

in4 转换为 "4" 并在 [1,2,3,4,5] 上检查具有该名称的 属性。有一个,所以结果是true.

console.log(4 in [1,2,3,4]);

in4 转换为 "4" 并在 [1,2,3,4] 上检查具有该名称的 属性。 没有,所以结果是false


上面提到的数字到字符串的转换是符合规范的,但是JavaScript引擎会尽可能优化数组,如果处理这样一个优化的数组,它可以避免在执行之前将数字转换为字符串查找。