【问题标题】:Javascript for in [duplicate]Javascript [重复]
【发布时间】:2021-07-23 18:05:49
【问题描述】:

我遇到了一个如下的面试问题,但我不知道 javascript 内部如何解释以下代码。

有人可以解释一下JS引擎是如何解释的吗? 这是否意味着“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])

【问题讨论】:

  • 最后一个不是在寻找4的值,而是在寻找不存在的index 4
  • in 运算符作用于键,而不是值。并且键是字符串(也适用于数组,尽管您通常不会使用它)
  • 我不知道 javascript,但我猜 a) 数组是对象,元素索引是对象的属性,b) in 查找该属性是否存在于对象上,c ) 通常的 javascript 类型强制“魔法”
  • None 如标题所示,其中没有一个使用“for in”。 for-inin 是完全独立的。

标签: javascript for-in-loop


【解决方案1】:
在这种情况下,

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 索引处的元素。

【讨论】:

  • JavaScript arrays allows querying by an index given in a string form。实际上,Javascript 在内部将所有对象键转换为字符串。
  • @WiktorZychla - 符号除外。 :-)
  • @T.J.Crowder:正确,谢谢 :)
  • @Terite:如果您能在您的回答中纠正这一点,以免混淆未来的读者,他们会以某种方式错过您回答下的评论部分。谢谢。
  • @T.J.克劳德感谢您纠正我!确实我不够精确。我希望不用提及简化“数组实际上是将元素存储为字符串属性值的对象”的 Symbol 案例是可以的。请记住,这个问题属于初学者级别。
【解决方案2】:

有人可以解释一下JS引擎是如何解释in的吗?

没有这些示例使用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引擎会尽可能优化数组,如果处理这样一个优化的数组,它可以避免在查找之前将数字转换为字符串。

【讨论】:

    【解决方案3】:

    如果您正在记录 for(let i in [1,2,3,4]),您将看到仅记录数组的索引。由于 [1,2,3,4] 只有索引 3,所以 4 会返回 false,其他选项都是 true。

    【讨论】:

      【解决方案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 的值。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 2013-05-24
        • 2013-06-09
        • 2018-05-10
        • 2014-03-01
        相关资源
        最近更新 更多