Skip to content Skip to sidebar Skip to footer

Indexof Empty String Is Zero. Why?

why this is happening in javascript? 'abc'.indexOf('a'); //0 'abc'.indexOf(''); //0 while in the other falsy values, the value is -1: 'abc'.indexOf(); //-

Solution 1:

The answer, fundamentally, is: Because that's how the function is specified to behave. And it makes sense, from a certain perspective.

The main bit related to returning 0 when you search for an empty string is this:

Return the smallest possible integer k not smaller than start such that k + searchLen is not greater than len, and for all nonnegative integers j less than searchLen, the code unit at index k + j within S is the same as the code unit at index j within searchStr; but if there is no such integer k, return the value -1.

Since the length of the search string is 0, both halves of that "and" are satisfied by k = 0: k + searchLen is not greater than the length of the string, and for all nonnegative integers less than the search length (there are zero), the code points match.

Or roughly speaking, in code:

functionindexOf(searchString, position = 0) {
    let s = String(this);
    let searchStr = String(searchString);
    let len = s.length;
    let start = Math.min(Math.max(position, 0), len);
    let searchLen = searchStr.length;
    let k = 0;
    while (k + searchLen <= len) {
        if (s.substring(k, k + searchLen) === searchStr) {
            break;
        }
        ++k;
    }
    const found = k + searchLen <= len;
    return found ? k : -1;
}

Since k + searchLen (0) is <=len (0), k (0)` is returned.

Live Example:

functionindexOf(searchString, position = 0) {
    let s = String(this);
    let searchStr = String(searchString);
    let len = s.length;
    let start = Math.min(Math.max(position, 0), len);
    let searchLen = searchStr.length;
    let k = 0;
    while (k + searchLen <= len) {
        if (s.substring(k, k + searchLen) === searchStr) {
            break;
        }
        ++k;
    }
    const found = k + searchLen <= len;
    return found ? k : -1;
}

console.log(indexOf.call("abcd", ""));

Another way to look at it is this answer related to Java...or to life in general.


Re your question passing in non-strings: One of the first steps is:

Let searchStr be ? ToString(searchString).

...which is let searchStr = String(searchString); in my rough code above. That means false becomes "false" and undefined becomes "undefined". "abc" doesn't contain either "false" or "undefined".

Post a Comment for "Indexof Empty String Is Zero. Why?"