String.prototype.startsWith()和String.prototype.endsWith()

String.prototype.startsWith()

startsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“开头”的,根据判断结果返回 true 或 false。
这是一个ES6方法。
searchString
要搜索的子字符串。
position
在 str 中搜索 searchString 的开始位置,默认值为 0,也就是真正的字符串开头处。
var str = "To be, or not to be, that is the question.";

alert(str.startsWith("To be"));         // true
alert(str.startsWith("not to be"));     // false
alert(str.startsWith("not to be", 10)); // true

polyfill

/*! http://mths.be/startswith v0.2.0 by @mathias */
if (!String.prototype.startsWith) {
  (function() {
    'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
    var defineProperty = (function() {
      // IE 8 only supports `Object.defineProperty` on DOM elements
      try {
        var object = {};
        var $defineProperty = Object.defineProperty;
        var result = $defineProperty(object, object, object) && $defineProperty;
      } catch(error) {}
      return result;
    }());
    var toString = {}.toString;
    var startsWith = function(search) {
      if (this == null) {//如果是当前字符串是null抛出错误
        throw TypeError();
      }
      var string = String(this);
      if (search && toString.call(search) == '[object RegExp]') {//如果search参数是正则对象抛出错误
        throw TypeError();
      }
      var stringLength = string.length;//字符串长度
      var searchString = String(search);//需要寻找的目标字符串
      var searchLength = searchString.length;//目标字符串长度
      var position = arguments.length > 1 ? arguments[1] : undefined;//start参数,起始位置
      // `ToInteger`
      var pos = position ? Number(position) : 0;//start参数转成整数
      if (pos != pos) { // better `isNaN`判断是否是NaN
        pos = 0;
      }
      var start = Math.min(Math.max(pos, 0), stringLength);//处理start是负数的情况
      // Avoid the `indexOf` call if no match is possible
      if (searchLength + start > stringLength) {//如果目标字符串 从 start起始位置开始已经超出原始字符串长度,那说明没匹配到,返回false
        return false;
      }
      var index = -1;
      while (++index < searchLength) {//循环目标字符串长度
        if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {//从start处开始比对每一个字符的编码是否相等
          return false;
        }
      }
      return true;
    };
    if (defineProperty) {
      defineProperty(String.prototype, 'startsWith', {
        'value': startsWith,
        'configurable': true,
        'writable': true
      });
    } else {
      String.prototype.startsWith = startsWith;
    }
  }());
}

String.prototype.endsWith()

endsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“结尾”的,根据判断结果返回 true 或 false。
这是一个ES6方法。
searchString
要搜索的子字符串。
position
在 str 中搜索 searchString 的结束位置,默认值为 str.length,也就是真正的字符串结尾处。
var str = "To be, or not to be, that is the question.";

alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

polyfill

if (!String.prototype.endsWith) {
    String.prototype.endsWith = function(search, this_len) {
        if (this_len === undefined || this_len > this.length) {
            this_len = this.length;
        }
        return this.substring(this_len - search.length, this_len) === search;//截取字符串判断是否与目标相等
    };
}

 

posted @ 2018-06-28 16:47  hahazexia  阅读(908)  评论(0)    收藏  举报