2016-11-26 29 views
0

这是我的任务:如何使用slice()重写.length()属性?

现在,你应该有字符串的长度属性,例如工作“你好”。长度。你的任务是编写一个名为stringLength的函数,它接受一个字符串作为参数并计算该字符串的长度;然而,正如你可能猜到的那样,你不允许使用字符串的长度属性!

相反,您需要使用名为slice的字符串方法。 出于我们的目的,我们可以将切片视为一个参数 - 从开始切片的索引,并返回从该索引开始的新字符串。

这是我的尝试:

function stringLength(string){ 
    var count = count++; 
    if(string.slice(0)){ 
    return count} 
return stringLength(string.slice(0,-1)) 
} 
console.log(stringLength("game")) 

我试图将字符串的每个字符切回至开始索引,索引0,然后我积累计数变量。我不明白为什么我的count变量没有积累。

+0

这是'切片'的不同定义比javascript使用。 – Ouroborus

回答

4

迭代建议。

function stringLength(string) { 
 
    var count = 0; 
 
    while (string) { 
 
     string = string.slice(1); 
 
     count++; 
 
    } 
 
    return count; 
 
} 
 

 
console.log(stringLength("game"));

递归建议。

function stringLength(string) { 
 
    return string ? 1 + stringLength(string.slice(1)) : 0; 
 
} 
 

 
console.log(stringLength("game"));

+0

我认为我的问题是我没有设置为0?也许这就是它没有积累的原因? – heliu

+0

不仅需要'返回1 + stringLength(...)'。 –

0

我想你可以尝试使用递归这样的:

function stringLength(string) { 
    if (string) { 
     return 1 + stringLength(string.slice(1)) 
    } else return 0 
} 
1

你真的应该尝试自己看着办吧。否则,你真的在​​学习这个主题吗?

function stringLength(string) { 
    if(!string) return 0; 
    var length = -1; 
    while(string.slice(length) !== string) --length; 
    return -length; 
} 

的变化考虑到slice()您奇定义:

function stringLength(string) { 
    var length = 0; 
    while(string.slice(length) !== "") ++length; 
    return length; 
} 
+0

是啊,即时通讯不是很确定说什么,自昨晚以来我一直在这个问题上停滞不前,而且我发布了其他一些尝试。这是否仍然不符合SO礼仪?我真的只是想知道为什么我的count变量没有积累 – heliu

+1

@heliu'string.slice(0)'返回整个字符串,除非字符串为空,否则它是一个真值。这意味着你的'if'语句几乎总是运行。 – Ouroborus

+0

感谢您的回答,但我还没有完全看过一个,试图做我能提示的东西。真棒谢谢 – heliu

1

您的计数变量是每个函数调用单独的变量,所以它总是会得到同样的价值,而不是不断递增。

您可以使用此:

function stringLength(string){ 
 
    return string ? 1 + stringLength(string.slice(0,-1)) : 0; 
 
} 
 
console.log(stringLength("game"))

短的位将被取出来的第一个字符,而不是最后:

return string ? 1 + stringLength(string.slice(1)) : 0; 
2

嗯,我试着写代码的格式与您所做的相同。

function stringLength(str, count){ 
    if(!str.slice(0)){ 
    return count; 
    } 
    return stringLength(str.slice(0,-1), ++count) 
} 
console.log(stringLength("game", 0)) 

我会指出原始代码中的错误,以便它易于理解。

  1. 递归基础案例不正确。 string.slice(0)将返回 真如果字符串非空,所以使用!string.slice(0)

  2. 计数值未初始化并没有被流传下来 递归。

+0

这是有史以来最好的网站 – heliu

+0

谢谢。请标记正确答案并帮助解决问题。 – ArunTejCh