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);
in
将 0
转换为 "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]);
in
将 4
转换为 "4"
并在 [1,2,3,4,5]
上检查具有该名称的 属性。有一个,所以结果是true
.
console.log(4 in [1,2,3,4]);
in
将 4
转换为 "4"
并在 [1,2,3,4]
上检查具有该名称的 属性。 没有,所以结果是false
。
上面提到的数字到字符串的转换是符合规范的,但是JavaScript引擎会尽可能优化数组,如果处理这样一个优化的数组,它可以避免在执行之前将数字转换为字符串查找。
我遇到了一个面试问题,如下所示,但我无法弄清楚 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);
in
将 0
转换为 "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]);
in
将 4
转换为 "4"
并在 [1,2,3,4,5]
上检查具有该名称的 属性。有一个,所以结果是true
.
console.log(4 in [1,2,3,4]);
in
将 4
转换为 "4"
并在 [1,2,3,4]
上检查具有该名称的 属性。 没有,所以结果是false
。
上面提到的数字到字符串的转换是符合规范的,但是JavaScript引擎会尽可能优化数组,如果处理这样一个优化的数组,它可以避免在执行之前将数字转换为字符串查找。