这是来自nodeschool的功能性javascript研讨会。这是它出现的代码:
function toUpperArray(items) {
if (!items.length) return [] // end condition
var head = items[0] // item to operate
head = head.toUpperCase() // perform action
var tail = items.slice(1) // next
return [head].concat(toUpperArray(tail)) // recursive step
}
toUpperArray(['hello', 'world']) // => ['HELLO', 'WORLD']
我不明白“结束条件”是如何起作用的。我认为条件是将items.length寻找为0,但是它返回一个空数组?我尝试通过让它返回任何东西来运行它,返回undefined因此将undefined添加到最终数组,但我不确定为什么返回一个空数组修复此问题。我希望最后一个数组中的最后一项是一个空数组。
另外,我从未见过没有使用花括号的条件。这有意义吗?
答案 0 :(得分:2)
当数组为空时。即items.length == 0
。以下条件是!= 0
的缩写形式,因为0
在javascript中为false值,而0不应为true
。
if (!items.length) return [];
答案 1 :(得分:2)
这是因为concat
函数调用Array
并且Array
作为参数产生Array
作为结果。基本上你可以用这种方式看到它:
element,[array]
)通过递归调用(递归步骤)与数组的尾部连接element.toUpperCase()
基本上你有一个数组data = [e1, e2, ..., en]
和一个函数f(x)
。你想返回[f(e1), f(e2), ..., f(en)]
,所以你基本上在数组的第一个元素上应用函数,并将结果与同一个数组上没有第一个元素的同一递归函数返回的值连接起来。
答案 2 :(得分:1)
当items.length将为eqal为0(false)时,该函数将返回一个空数组,并将递归递归调用堆栈。以下是我们写这种情况的几种方式:
if(!items.length) //true
if(items.length == 0) //true
if(items.length == false) //true
对于没有花括号的条件。它做了同样的事情,只是它只将当前行或下一行作为"内容"你的病情:
if(randomBoolean)
console.log('this is executed');
console.log('this is always executed');
在该示例中,如果randomBoolean
变量为true,则输出将为:
this is executed
this is always executed
如果randomBoolean
变量为false,您会看到:
this is always executed
答案 3 :(得分:1)
function toUpperArray(items) {
if (!items.length) return [] // end condition
var head = items[0] // item to operate
head = head.toUpperCase() // perform action
var tail = items.slice(1) // next
return [head].concat(toUpperArray(tail)) // recursive step
}
会发生什么?让我们举个例子:
[X,Y]表示你有一个数组[0] = X,数组[1] = Y的数组。所以你有项目[0] ='你好',项目[1] ='世界'。
第一个电话是改变你好'到' HELLO'。
剩下的数组是[' world']。
然后再次调用该函数并将其转换为' WORLD'。
然后再次调用它,没有项目然后它返回一个空数组。这意味着第二次通话也可以通过将[' WORLD']与[]结合来返回。
然后第一个电话可以通过[' HELLO']和[' WORLD']汇总返回,这是[' HELLO' WORLD' 39;]
答案 4 :(得分:-2)
它将数组中的所有值转换为UPPERCASE。
可以使用for循环,但它们基本上只是再次为 next 数组值调用该函数。