2016-09-15 50 views
1

任何人都可以解释RegExp.prototype.exec的结果是如何产生的吗?Array中的非索引属性

如果你尝试类似的东西:/d/g.exec("d is a character, dd")结果数组结构如下解释:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

我的问题是,如何阵列已非indexeed像indexinput属性?

通常情况下,数组是一个由整数索引的集合([0...n]);

var re = /d/g; 
 
var str = "domains are always domains"; 
 

 
var result = re.exec(str); 
 

 
console.log("typeof result", typeof result); 
 
console.log("Array.isArray(result)", Array.isArray(result)); 
 
console.log("result.length", result.length); 
 
console.log("result", result);

回答

3

数组是只是一个对象。事实上,你可以进行简单的阵列状物体就是这样:

var fakeArr = {} 
fakeArr[0] = 'foo'; 
fakeArr[1] = 'bar'; 
fakeArr.length = 2; 

区别于普通对象的数组的唯一的事情是.length属性的行为和Array.prototype的各项具体阵列的方法。

+0

我不认为这是,或者至少,这不是全部。例如,什么'Array.isArray(fakeArr)'返回? – Hitmands

+0

'isArray'将返回'false',因为它检查对象是否从'Array'继承,在这种情况下它显然不会。这就是为什么我说* array-like *。还有其他类似数组的对象,例如['arguments'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)(正式记录为*阵列状*)。这意味着你可以像数组一样迭代它('for(var i = 0; i deceze

+1

是的,这确实就是它的全部。数组是一个普通对象+一些额外的属性和方法。 – deceze