我在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);
}
我看到'local'后打印非空数组,但'global'总是保持为空数组。发生了什么事?
答案 0 :(得分:47)
.concat
创建一个新数组。你需要覆盖旧的。
scriptUrls = scriptUrls.concat(urls);
或者,如果您想保留原始scriptUrls
数组,可以.push()
中的值。
scriptUrls.push.apply(scriptUrls, urls);
这使用.apply()
将urls
转换为传递给.push()
的单个参数。这样,urls
的内容就会作为单个项目添加到scriptUrls
。
另外,请注意.concat()
展平数组。如果你想要一个阵列数组,那么你可以使用scriptUrls.push(urls)
。
答案 1 :(得分:2)
concat不会更改此参数或作为参数提供的任何数组,而是返回“一级深度”副本,其中包含从原始数组组合的相同元素的副本。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/concat