13

我在 Webkit 上运行以下代码:

var scriptElements = document.scripts;
var scriptUrls = [];
// URL matching
var regexp = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
for (var i = 0; i < scriptElements.length; i++) {
    element = scriptElements[i];
    var urls = element.innerHTML.match(regexp);
    console.log('local', urls);
    scriptUrls.concat(urls);
    console.log('global', scriptUrls);
}

我看到在“本地”之后打印了非空数组,但“全局”始终保持为空数组。这是怎么回事?

4

2 回答 2

57

.concat创建一个新数组。您需要覆盖旧的。

scriptUrls = scriptUrls.concat(urls);

或者,如果您想保留原始scriptUrls数组,您可以.push()将值放入。

scriptUrls.push.apply(scriptUrls, urls);

这用于.apply()转换urls为传递给的单个参数.push()。这样,内容urlsscriptUrls作为单独的项目添加。


另外,请注意,这会使数组.concat() 变平。如果你想要一个数组数组,那么你会使用scriptUrls.push(urls).

于 2012-10-10T00:38:31.673 回答
2

concat 不会更改此数组或作为参数提供的任何数组,而是返回“一层深”副本,其中包含从原始数组组合的相同元素的副本。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/concat

于 2012-10-10T00:42:07.120 回答