“concat”没有将JavaScript数组连接在一起?

时间:2012-10-10 00:37:35

标签: javascript arrays

我在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'总是保持为空数组。发生了什么事?

2 个答案:

答案 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