简介
设为一个递归函数,用于推送数组中的值。我在函数块外初始化数组。数组在函数块之外初始化这一事实不应该是一个问题。d/t JavaScript函数的属性用于操作在其范围之外定义的变量。请参阅下文,将相同的代码片段分为两个版本,第一个版本的数组在通用范围内,第二个版本的函数有2个嵌套函数。结果也是粘贴的,是一样的。但是,当数组在函数块之外初始化时,此代码无法通过fcc练习中的测试。
-第一个片段:未通过测试
var newArr = [];
function steamroller(arr) {
while (arr.length > 0) {
if (Array.isArray(arr[0])) {
steamroller(arr[0]);
}
else {newArr.push(arr[0]);
console.log("newArr ", newArr);
}
arr.shift();
}
// I'm a steamroller, baby
return newArr;
}
steamroller([1, {}, [3, [[4]]]]);
及其输出:
Native Browser JavaScript
newArr [ 1 ]
newArr [ 1, {} ]
newArr [ 1, {}, 3 ]
newArr [ 1, {}, 3, 4 ]
=> [ 1, {}, 3, 4 ]
-第二个片段通过测试:
function steamroller(arr) {//1
var newArr = [];
function ude(arr){//2
while (arr.length > 0) {//3
if (Array.isArray(arr[0])) {//4
ude(arr[0]);
}//4c
else {newArr.push(arr[0]);
console.log("newArr ", newArr);
}//3c
arr.shift();
}
// I'm a steamroller, baby
return newArr;
}
return ude(arr);
}
steamroller([1, {}, [3, [[4]]]]);
他的输出:
Native Browser JavaScript
newArr [ 1 ]
newArr [ 1, {} ]
newArr [ 1, {}, 3 ]
newArr [ 1, {}, 3, 4 ]
=> [ 1, {}, 3, 4 ]
问题:
有什么区别?
也许这对您有所帮助。每个对象都有一个内置的toString
方法。
Array.prototype.toString()
toString()
方法返回一个字符串,表示指定的数组及其元素。语法
arr.toString()
参数
无。
说明
Array对象覆盖object的toString方法。对于Array对象,toString方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。
编辑:
如何使用本地数组收集元素的示例。
function steamroller(arr) {
var newArr = [];
while (arr.length) {
if (Array.isArray(arr[0])) {
newArr = newArr.concat(steamroller(arr[0]));
} else {
newArr.push(arr[0]);
}
arr.shift();
}
return newArr;
}
document.write('<pre>' + steamroller([1, {}, [3, [[4]]]]) + '</pre>');
document.write('<pre>' + JSON.stringify(steamroller([1, {}, [3, [[4]]]]), 0, 4) + '</pre>');
答案是,浏览器使用许多连续的值来测试程序。但是,名为"newArray"的数组在两次测试之间不会重新初始化,因为当她是全局变量时,无论何时我们启动函数,它都不会重置。很简单。