JavaScript:使用'循环遍历字符串'表现出乎意料

时间:2016-01-06 07:44:12

标签: javascript string

这是一个两部分问题。

我编写了一个函数来使用以下函数

在更大的字符串中查找子字符串的索引
function indexOf(str){
  for (var x = 0; x < this.length; x++) {
    if(this[x] === str) {
      return x;
    }
  }
    return -1;
  };

然后我设置:

var string1="bbbabbaaa"
var string2="ab"

然后我以这种方式调用了我的函数:

string1.indexOf(string2)

我希望在结果中看到-1,因为我期望for循环逐个遍历字符串中的字符并将每个字母与字符串&#34; ab&#34;进行比较。由于没有一个字母相当于&#34; ab&#34;,它不应该找到匹配。但实际返回的是3,这是&#34; a&#34;的索引。所以我的第一个问题是,这里发生了什么? if(this[3] === str)如何回归真实,基本上不比较&#34; a&#34;使用&#34; ab&#34;,哪个应该返回false?

如果我修改我的函数以将string1作为参数传递,我得到预期的-1

function AlternativeIndexOf(str,str2){
  for (var x = 0; x < str.length; x++) {
    if(str[x] === str2) {
      return x;
    }
  }
    return -1;
  };

以这种方式调用函数AlternativeIndexOf(string1, string2),返回-1。

所以我的第二个问题是,如何调用函数AlternativeIndexOf(string1, string2)与调用函数string1.indexOf(string2)不同

2 个答案:

答案 0 :(得分:2)

string1.indexOf(string2)

这是使用Javascript原生 String.prototype.indexOf() 方法,而不是您创建的方法,您尝试override .indexOf函数,但您的方式是这样做是不正确的,而是尝试重新定义String.prototype.indexOf

String.prototype.indexOf = function(elem) {
    // Put your logic here
}

答案 1 :(得分:0)

首先,正如另一个答案所提到的,您需要分配到String.prototype.indexOf

  

所以我的第一个问题是,这里发生了什么? if(this [3] === str)是如何返回true的,是不是基本上将“a”与“ab”进行比较,哪个应该返回false?

您的功能未被调用。被调用的函数是String.prototype.indexOf(你没有覆盖它),它的行为正确;你对String.prototype.indexOf的理解被打破了。有关详细信息,请参阅the String.prototype.indexOf manual。以下是该手册中第二个参数为字符串时String.prototype.indexOf应返回的示例:

  

'Blue Whale'.indexOf('Blue'); //返回0

你有两个字符串;你应该使用一个嵌套在另一个循环中的循环来循环两个字符串的字符,比较它们。例如:

String.prototype.indexOf = function(str) {
    for (var x = 0; x < this.length; x++) {
        var y = 0;
        while (y < str.length && this[x+y] == str[y]) {
            y++;
        }
        if (y == str.length) {
            return x;
        }
    }
    return -1;
};