ECMAScript提供了3个从字符串中提取子字符串的方法:slice(),substr()和substring()。这3个方法都返回调用他们的字符串的一个子字符串,而且都接收一或两个参数。第一个参数标识子字符串开始的位置,第二个参数标识字符串结束位置。对slice()和substring()而言,第二个参数是提取结束的位置(即该位置之前的字符串会被提取出来)。对substr()而言,第二个参数标识返回的子字符串数量。任何情况下,省略第二个参数都意味着提取到字符串末尾。
这三个方法都不会修改调用它们的字符串,而只会返回提取到的原始新字符串。来看下面的例子:
let stringValue = "hello world";
console.log(stringValue.slice(3)); //"lo world"
console.log(stringValue.substring(3)); //"lo world"
console.log(stringValue.substr(3)); //"lo world"
console.log(stringValue.slice(3,7)); //"lo w"
console.log(stringValue.substring(3,7)); //"lo w"
console.log(stringValue.substr(3,7)); //"lo worl"
在这个例子中,slice(),substr()和substring()是以相同方式被调用的,而且多数情况下返回的值也相同。如果之传一个参数3,则所有方法都返回“lo world”。因为“hello”中“l”位置为3.如果传入两个参数3和7,则slice()和substring()返回“lo w”(因为“world”中的“o”在位置7,不包含)而substr()返回“lo world”,因为第二个参数对它而言标识返回的字符串。
当某个参数是负数时,这3个方法的行为又有所不同。比如slice()方法将所有负值参数都当成字符串长度加上负数参数。而substr()方法将第一个负参数值当成字符串长度加上该值,将第二个负参数值转换成0。 substring()方法会将所有负参数值都转换成0。看下面的例子
let stringValue = "hello world";
console.log(stringValue.slice(-3)); // "rld"
console.log(stringValue.substring(-3)); // "hello world"
console.log(stringValue.substr(-3)); // "rld"
console.log(stringValue.slice(3,-4)); // "lo w"
console.log(stringValue.substring(3,-4)); // "hel"
console.log(stringValue.substr(3,-4)); // ""(empty string)
要注意的是substring(3,0)等价于substring(0,3),这是因为这个方法会将娇小的参数作为起点,将较大的参数作为终点