Piszemy funkcję myTrim, która działa tak jak w PHP, czyli pozwala nam wybrać trimowany znak. Do dzieła.

Ok, najpierw funkcja trimSpaces:

function trimSpaces(str){

    let trimmedChar = " ";

    let left = 0;
    let right = str.length - 1;

    while(str[left] === trimmedChar){
        left++;
    }

    while(str[right] === trimmedChar){

        if(str[right -1] !== trimmedChar)
            break;
        right--;
    }
    
    return str.substring(left, right);
}

let msg = "  Hello World  ";
console.log(trimSpaces(msg));
//Hello World

Substring działa w ten sposób, że bierze indeks pierwszego elementu, jaki ma zostać włączony oraz indeks pierwszego elementu, jaki ma zostać wyłączony.

A zatem potrzebujemy pierwszy lewy, który spacją nie jest oraz ostatni prawy, który spacją jeszcze jest – stąd taka a nie inna konstrukcja pętli.

Dodajemy opcję wybierania znaku oraz robimy polyfill:

String.prototype.myTrim = function(trimmedChar = " "){

    let left = 0;
    let right = this.length - 1;

    while(this[left] === trimmedChar){
        left++;
    }

    while(this[right] === trimmedChar){

        if(this[right -1] !== trimmedChar)
            break;

        right--;
    }
    
    return this.substring(left, right);
}


console.log("  Hello  World  ".myTrim(" "));
console.log("!!Hello  World!!".myTrim("!"));

Ok, jeszcze weźmy pod uwagę edge-cases. Oto one:

console.log("    ".myTrim(" "));
console.log("!!Hello  World!!".myTrim("!!"));

W pierwszym przypadku left będzie większe niż right i ten substring nic nie da.


//(...)

if(left > right)
        return "";

    return this.substring(left, right);
}


console.log("    ".myTrim(" "));
//<empty string>
console.log("!!Hello  World!!".myTrim("!!"));
//!!Hello  World!

Ok, pierwszy problem rozwiązany. Teraz drugi:

String.prototype.myTrim = function(trimmedChar = " "){
    
    if(trimmedChar.length < 1)
        trimmedChar = " ";

    if(trimmedChar.length > 1)
        trimmedChar = trimmedChar[0];

    let left = 0;
    let right = this.length - 1;

    while(this[left] === trimmedChar){
        left++;
    }

    while(this[right] === trimmedChar){

        if(this[right -1] !== trimmedChar)
            break;

        right--;
    }

    if(left > right)
        return "";

    return this.substring(left, right);
}


console.log("    ".myTrim(" "));
//<empty string>
console.log("    ".myTrim(" "));
//<empty string>
console.log("!!Hello  World!!".myTrim("!!"));
//Hello  World

Ok, działa jak widać.