zoukankan      html  css  js  c++  java
  • js字符串的操作方法slice()、substring()、substr() 详解,特别是参数为负数的情况

    摘抄自:《JavaScript高级程序设计》(第3版) 第123页。


    写在前面:

    很多时候,我们可能都记不清楚这几个api的区别,或者说当时看懂了,过后不经常用的话,就会很快忘记。

    参数为负数的情况,在实际的开发中,几乎用不到,但是面试的时候,有些公司的笔试题就喜欢考负数的情况,所以记录下来,方便以后查阅。


    正文:

    slice()、substring()、substr()这三个方法都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数。

    第一个参数指定子字符串的开始位置,第二个参数(在指定的情况下)表示子字符串到哪里结束。

    具体来说,slice()和substring()的第二个参数指定的是子字符串最后一个字符后面的位置(含头不含尾)。而substr()的第二个参数指定的是返回的字符个数。

    如果没有给这些方法传递第二个参数,则将字符串的长度作为结束位置。

    slice()、substring()和substr()不会修改字符串本身的值,它们只是返回一个基本类型的字符串值,对原始字符串没有任何影响

    示例:

    var stringValue = "hello world";
    stringValue.slice(3);       // "lo world"
    stringValue.substring(3);   // "lo world"
    stringValue.substr(3);      // "lo world"
    stringValue.slice(3,7);     // "lo w"
    stringValue.substring(3,7); // "lo w"
    stringValue.substr(3,7);    // "lo worl"

    在传递给这些方法的参数是负值的情况下,它们的行为就不尽相同了。其中:

    • slice()方法会将传入的负值与字符串的长度相加;
    • substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转换为0;
    • substring()方法会把所有的负值参数都转换为0;

    示例:

    var stringValue = "hello world";
    stringValue.slice(-3);       // "rld"
    stringValue.substring(-3);   // "hello world"
    stringValue.substr(-3);      // "rld"
    stringValue.slice(3,-4);     // "lo w"
    stringValue.substring(3,-4); // "hel"
    stringValue.substr(3,-4);    // "" (空字符串)

    这个例子清晰地展示了上述三个方法之间的不同行为。在给slice()和substr()传递一个负值参数时,它们的行为相同。这是因为 -3 会被转换为 8 (字符串长度加参数 11+(-3)=8),实际上相当于调用了 slice(8) 和 substr(8)。但substring()方法则返回了全部字符串,因为它将 -3 转换成了0 。

    当第二个参数是负值时,这三个方法的行为各不相同。

    • slice()方法会把第二个参数转换为 7,这就相当于调用了 slice(3,7) ,因此返回 "lo w" 。
    • substring()方法会把第二个参数转换为0,使调用变成了substring(3,0),而由于这个方法会将较小的数作为开始位置,将较大的数作为结束位置,因此最终相当于调用了 substring(0,3) 。
    • substr() 也会将第二个参数转换为0,这也就意味着返回包含零个字符的字符串,也就是一个空字符串。
  • 相关阅读:
    HDU 1495 非常可乐
    ja
    Codeforces Good Bye 2016 E. New Year and Old Subsequence
    The 2019 Asia Nanchang First Round Online Programming Contest
    Educational Codeforces Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
    AtCoder Regular Contest 102
    AtCoder Regular Contest 103
    POJ1741 Tree(点分治)
    洛谷P2634 [国家集训队]聪聪可可(点分治)
  • 原文地址:https://www.cnblogs.com/smile-fanyin/p/14628311.html
Copyright © 2011-2022 走看看