String.prototype.slice()、String.prototype.substr()、String.prototype.substring()

妖精的绣舞 提交于 2020-04-07 05:53:17
String.prototype.slice()
slice() 方法提取一个字符串的一部分,并返回一新的字符串。
str.slice(beginSlice[, endSlice])
beginSlice
从该索引(以 0 为基数)处开始提取原字符串中的字符。如果值为负数,会被当做 sourceLength + beginSlice 看待,这里的sourceLength 是字符串的长度 (例如, 如果beginSlice 是 -3 则看作是: sourceLength - 3)
endSlice
可选。在该索引(以 0 为基数)处结束提取字符串。如果省略该参数,slice会一直提取到字符串末尾。如果该参数为负数,则被看作是 sourceLength + endSlice,这里的 sourceLength 就是字符串的长度(例如,如果 endSlice 是 -3,则是, sourceLength - 3)。
 
返回一个从原字符串中提取出来的新字符串
 
slice 不修改原字符串,只会返回一个包含了原字符串中部分字符的新字符串。
注意:slice() 提取的新字符串包括beginSlice但不包括 endSlice。
var str1 = 'The morning is upon us.';
var str2 = str1.slice(4, -2);

console.log(str2); // OUTPUT: morning is upon u
给 slice() 传入负值索引
var str = 'The morning is upon us.';
str.slice(-3);     // returns 'us.'
str.slice(-3, -1); // returns 'us'
str.slice(0, -1);  // returns 'The morning is upon us'

自己实现简单的slice:

String.prototype.slice = function (start) {
    var length = this == null ? 0 : this.length;
    var end;
    
    if (!length) {
        return '';
    }

    start = start == null ? 0 : start;
    if (start < 0) {
        start = -start > length ? 0 : (start + length);
    }

    end = arguments[1] == null ? length : arguments[1];

    if (end < 0) {
        end = -end > length ? 0 : (end + length);
    }
    end = end > length ? length : end;

    length = start > end ? 0 : ((end - start) >>> 0);
    start >>>= 0;

    var result = '';
    var index = -1;
    while (++index < length) {
        result += this[start + index];
    }
    return result;
}
String.prototype.substr()
substr() 方法返回一个字符串中从指定位置开始到指定字符数的字符。
str.substr(start[, length])
start
开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。
length
可选。提取的字符数。
 
返回从字符串中提取出的字符串。
 
如果 start 为正值,且大于或等于字符串的长度,则 substr 返回一个空字符串。

如果 start 为负值,则 substr 把它作为从字符串末尾开始的一个字符索引。如果 start 为负值且 abs(start) 大于字符串的长度,则 substr 使用 0 作为开始提取的索引。注意负的 start 参数不被 Microsoft JScript 所支持。

如果 length 为 0 或负值,则 substr 返回一个空字符串。如果忽略 length,则 substr 提取字符,直到字符串末尾。
 
var str = "abcdefghij";

console.log("(1,2): "    + str.substr(1,2));   // (1,2): bc
console.log("(-3,2): "   + str.substr(-3,2));  // (-3,2): hi
console.log("(-3): "     + str.substr(-3));    // (-3): hij
console.log("(1): "      + str.substr(1));     // (1): bcdefghij
console.log("(-20, 2): " + str.substr(-20,2)); // (-20, 2): ab
console.log("(20, 2): "  + str.substr(20,2));  // (20, 2):

polyfill

Microsoft's JScript 不支持负的 start 索引。如果你想充分利用该方法的功能,则需要使用下面的兼容性代码修复此 bug:

// only run when the substr function is broken
if ('ab'.substr(-1) != 'b')
{
  /**
   *  Get the substring of a string
   *  @param  {integer}  start   where to start the substring
   *  @param  {integer}  length  how many characters to return
   *  @return {string}
   */
  String.prototype.substr = function(substr) {
    return function(start, length) {
      // did we get a negative start, calculate how much it is
      // from the beginning of the string
      if (start < 0) start = this.length + start;
      
      // call the original function
      return substr.call(this, start, length);
    }
  }(String.prototype.substr);
}

 自己实现简单的substr:

String.prototype.substr = function (start) {
  var length = this.length;
  
  if (length == 0) {
    return '';
  }

  start = start == null ? 0 : start;

  if (start < 0) {
    start = -start > length ? 0 : (start + length);
  }
  start >>>= 0;

  length = arguments[1] === undefined ? this.length : arguments[1];

  if (length < 1) {
    return '';
  }

  var index = -1;
  var result = '';
  while (++index < length) {
    if ((start + index) == this.length) {
      return result;
    }
    result += this[start + index];
  }
  return result;
}
String.prototype.substring()
substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集。
str.substring(indexStart[, indexEnd])
indexStart
一个 0 到字符串长度之间的整数。
indexEnd
可选。一个 0 到字符串长度之间的整数。
 
返回包含给定字符串的指定部分的新字符串。
 
substring 提取从 indexStart 到 indexEnd(不包括)之间的字符。特别地:

如果 indexStart 等于 indexEnd,substring 返回一个空字符串。
如果省略 indexEnd,substring 提取字符一直到字符串末尾。
如果任一参数小于 0 或为 NaN,则被当作 0
如果任一参数大于 stringName.length,则被当作 stringName.length。
如果 indexStart 大于 indexEnd,则 substring 的执行效果就像两个参数调换了一样。见下面的例子。
红字是String.prototype.substring 与 String.prototype.slice 的区别
var anyString = "Mozilla";

// 输出 "Moz"
console.log(anyString.substring(0,3));
console.log(anyString.substring(3,0));
console.log(anyString.substring(3,-3));
console.log(anyString.substring(3,NaN));
console.log(anyString.substring(-2,3));
console.log(anyString.substring(NaN,3));

// 输出 "lla"
console.log(anyString.substring(4,7));
console.log(anyString.substring(7,4));

// 输出 ""
console.log(anyString.substring(4,4));

// 输出 "Mozill"
console.log(anyString.substring(0,6));

// 输出 "Mozilla"
console.log(anyString.substring(0,7));
console.log(anyString.substring(0,10));
例子:替换一个字符串的子字符串
function replaceString(oldS, newS, fullS) {
// Replaces oldS with newS in the string fullS
  for (var i = 0; i < fullS.length; i++) {
    if (fullS.substring(i, i + oldS.length) == oldS) {
     fullS = fullS.substring(0, i) + newS + fullS.substring(i + oldS.length, fullS.length);
    }
  }
  return fullS;
}

replaceString("World", "Web", "Brave New World");
//"Brave New World" 变成了 "Brave New Web"
需要注意的是,如果 oldS 是 newS 的子字符串将会导致死循环。例如,尝试把 "World" 替换成 "OtherWorld"。一个更好的方法如下:
function replaceString(oldS, newS,fullS){
  return fullS.split(oldS).join(newS);
}

自己实现简单的substring:

String.prototype.substring = function (start) {
    var end;
    start = Number(start);
    start = start == start ? start : 0;
    if (start < 0) {
        start = 0;
    }
    if (start > this.length) {
        start = this.length;
    }
    start >>>= 0;

    if (arguments.length > 1) {
        end = Number(arguments[1]);
    } else {
        end = this.length;
    }
    end = end == end ? end : 0;
    if (end < 0) {
        end = 0;
    }
    if (end > this.length) {
        end = this.length;
    }
    end >>>= 0;

    if (start > end) {
        var temp = start;
        start = end;
        end = temp;
    }
    var length = end - start;
    var result = '';
    var index = -1;
    while (++index < length) {
        result += this[start + index];
    }
    return result;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!