为什么这同时显示了数组和对象的行为

时间:2018-12-14 14:42:08

标签: javascript arrays regex

请考虑以下javaScript代码。

var obj = /e/.exec("The best things in life are free!");
var k = "";
var x;
for (x in obj) {
  k = k + " " + obj[x] + " " + x + "<br>";
}
document.getElementById("demo").innerHTML = (obj instanceof Array) + " " + obj[0] + " " + obj[1] + " " + obj.index + "<br>" + k;
<h2>JavaScript Regular Expressions</h2>
<p id="demo"></p>

提供输出

JavaScript Regular Expressions
true e undefined 2
e 0
2 index
The best things in life are free! input
undefined groups  

现在,在上面的代码中,我使用了obj[0] obj [1] (which are array only notations), and also obj.index`(该数组不适用于数组)。

现在我真的对obj到底是什么感到困惑。...

1 个答案:

答案 0 :(得分:4)

  

现在在上面的代码中,我使用了obj [0],obj 1(它们是仅数组表示法)

不,不是。例如:

const obj = {answer: 42, 42: "is the answer"};
const str = "answer";
console.log(obj[str]); // 42
console.log(obj[42]);  // is the answer

  

....以及obj.index(对于数组不应该使用)

是的,他们应该。 :-)

javaScript中的标准数组根本不是数组。它们只是以下对象:

  • 继承自Array.prototype
  • 对名为length的属性有特殊的行为。
  • 对于名称与array index的定义相匹配的属性具有特殊的行为(当字符串转换为数字n时,其范围为0 <= n <2 32 -1)。这些是与数组条目对应的属性。我们通常将它们写成不带引号(myArray[0]),但从正式意义上来说,它们是字符串。
  • 具有自己的文字形式([])。

由于它们是对象,因此它们也可以具有属性:

const a = [1, 2, 3];
a.answer = 42;
console.log(a.answer); // 42

JavaScript本身在几个地方(但不是很多)利用了这一事实,包括您发现的RegExp.prototype.exec函数。另一个地方是传递给tag function的第一个参数,该参数包含模板中字符串段的条目以及带有这些段的原始版本的raw属性。

我贫乏的小博客中的更多内容:A Myth of Arrays