我在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);
}

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

最佳答案

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

scriptUrls = scriptUrls.concat(urls);

或者,如果您想保留原始的scriptUrls数组,则可以对其中的值进行.push()
scriptUrls.push.apply(scriptUrls, urls);

这使用.apply()urls转换为传递给.push()的各个参数。这样,urls的内容将作为单独的项目添加到scriptUrls中。

另外,请注意.concat()展平了Array。如果您想要一个数组数组,则可以使用scriptUrls.push(urls)

10-06 00:25