JavaScript 中字符串截取 (+实现)

String.prototype.slice(beginIndex, endIndex)

slice 方法是用来从父字符串中截取子字符串并返回一个新的字符串,接受两个参数。

beginIndexendIndex
接收一个整数作为第一个参数,会进行Number强制转换,如果得到 NaN,或者默认不传递第一个参数,都会以 0 作为默认值。如果超出字符串的长度,截取出来是一个空字符串。接收一个整数作为第一个参数,会进行Number强制转换,如果得到 NaN,会以 0 作为默认值。如果不传入就会以 str.length 为截取最终位置。
可以接收一个负数,如果是负数,开始截取的位置就是 str.length + beginIndex。就是会保留下 beginIndex 个字符串,从 str.length - beginIndex 开始截取。可以接收一个负数,如果是负数,结束截取的位置就是 str.length + endIndex。

实现:

String.prototype.slice1 = function(beginIndex, endIndex) {
    let len = this.length, str = '';
    endIndex = (typeof endIndex != 'undefined') ? endIndex : len;
    let start = beginIndex || 0;
    start = (start >= 0) ? start : Math.max(0, len + start);

    let end = (typeof endIndex == 'number') ? Math.min(endIndex, len) : len;
    if (endIndex < 0) {
        end = len + end;
    }
    while(start < end) {
        str += this[start];
        start++;
    }
    return str;
}

String.prototype.substr(beginIndex, endIndex)

substr 返回一个字符串中从指定位置开始到指定字符串位置,截取初一个新的字符串。接受两个参数。

beginIndex

length

接收一个整数作为第一个参数,会进行Number强制转换,如果得到 NaN,或者默认不传递第一个参数,都会以 0 作为默认值。如果超出字符串的长度,截取出来是一个空字符串。需要截取的长度。接收一个整数作为第一个参数,会进行Number强制转换,如果得到 NaN,都会以 最一个字符 0 作为默认值。
可以接收一个负数,如果是负数,开始截取的位置就是 str.length + beginIndex。就是会保留下 beginIndex 个字符串,从 str.length - beginIndex 开始截取。

实现:

String.prototype.substr1 = function(start, length) {
    let len = this.length, str = '';
    length = (typeof length != 'undefined') ? length : len;  
    let begin = start || 0;
    begin = (begin >= 0) ? begin : Math.max(0, start + len);
    while (length > 0) {
        if (!this[begin]) break;
        str += this[begin++];
        length--;
    }
    return str;
}

String.prototype.substring(start, end)

substring 方法返回一个字符串在开始索引到结束索引之间的一个子集,或从开始索引直到字符串的末尾的一个子集。

startend
接收一个整数作为第一个参数,会进行Number强制转换,如果得到 NaN,或者默认不传递第一个参数,还有负数,都会以 0 作为默认值。如果超出字符串的长度,截取出来是一个空字符串。接收一个整数作为第一个参数,会进行Number强制转换,如果得到 NaN,会以 0 作为默认值。如果不传入就会以 str.length 为截取最终位置。
String.prototype.substring1 = function(start, end) {
    let len = this.length, str = '';
    end = (typeof end == 'undefined') ? len - 1 : end;
    end = (typeof end == 'number') ? Math.min(end, len) : len;
    let beign = start || 0;
    begin = +beign;
    if (isNaN(beign) || beign < 0) beign = 0;
    let result = 0;
    if (end < begin) {
        result = end;
        end = begin;
        beign = result;
    }
    
    let size = end - begin;  // 实际要截取的长度。
    if (size > 0) {
        if (this.charAt) {
            for (let i = 0; i < size; i++) {
                result += this.charAt(begin + i);
            }
        } else {
            for (let i = 0; i < size; i++) {
                result += this[begin + i];
            }
        }
    }
    return str;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值