参考链接 https://blog.csdn.net/qq_38047742/article/details/82144266
- 一个参数的时候
没有区别 但只有slice支持数组
var str = "helloworld!";
console.log(str.slice(1)); //elloworld!
console.log(str.substring(1)); //elloworld!
console.log(str.substr(1)); //elloworld!
- 二个参数的时候(前面小,后面大)
console.log(str.slice(1,4)); //ell
console.log(str.substring(1,4)); //ell
console.log(str.substr(1,4)); //ello
slice、substring两个参数的时候是从第几位到第几位的前面;而substr两个参数的时候是从第几位截取几个
- 二个参数的时候(前面大,后面小)
console.log(str.slice(5,1)); //""
console.log(str.substring(5,1)); //ello
console.log(str.substr(5,1)); //"w"
slice返回空,也就是对顺序有一定的要求,第一位必须比第二位小;substring会自动的把他们的顺序换过来;substr还是从第几位截取几个
- 二个参数的时候(前面正数,后面负数)
console.log(str.slice(1,-2)); //elloworl
console.log(str.substring(1,-2)); //h
console.log(str.substr(1,-2)); //""
slice第二参数为负数时,是从尾部倒数来计算【从-1开始数】或者说是与字符串或数组的长度相加得出的结果来计算;substring, 无论第二参数是负多少,都只截取了第一个字符;substr因为个数不可能是负数,所以是空;总结substring和substr第二参数为负数时其实是无效果的。
- 二个参数的时候(前面负数,后面正数)
console.log(str.slice(-3,1)) //""
console.log(str.substring(-3,1)) //h
console.log(str.substr(-3,1)) //l
slice结果是空,这个结合第3和第4种情况,可知,这个实际是slice(8,1),第一参数大于第二参数了,所以是无效的,空值;substring,结合第3和第4种情况,是调换了顺序,但是还是负数,依然也是无效的,只返回第一个字符;substr,第一参数负数同样代表从尾部倒数或者字符串的长度相加得出的结果来计算【与slice参数为负数时情况一致处理】,等同于substr(8,1),截取栗子中的一位,得到了“l”。
- 二个参数的时候(全部负数)
console.log(str.slice(-1,-5)); // slice(10,6) 前面大后面小 不符合顺序
console.log(str.substring(-1,-5)); // 参数为负数时,只有substring会永远无效
console.log(str.substr(-1,-5)); // substr(10,-5) 个数没有-5 所以返回空
//上面的结果全是空
console.log(str.slice(-5,-1)); //orld // slice(6,11) 从第六个到第十个(包含第十个)
console.log(str.substring(-5,-1)); //"" // 参数为负数时,只有substring会永远无效
console.log(str.substr(-5,-1)); //"" // substr(6,-1) 个数没有-1 所以返回空
总结:
-
slice,substring,substr 都是用来截取字符串,但是只有slice支持数组;三者如果不传参数,则都返回全部内容;
-
参数为正数时,只有substring会自动调换顺序,slice在第一参数大于第二参数时会无效返回空,而substr无所谓,除非给定的第一参数超出了源数据长度才会返回空;
-
参数为负数时,只有substring会永远无效,即不要给substring使用负值!slice可认为从尾部倒数,或者直接用源数据长度加上这个负值换算为正数,然后结论依然遵循第2条所述;而substr,则只适用第一参数为负数,换算方法同slice,其第二参数代表截取的个数,是不能为负数的;
-
据w3cshool所提示 (链接: http://www.w3school.com.cn/jsref/jsref_substr.asp) ,“ECMAscript 没有substr方法进行标准化,因此反对使用它”。
自己的理解:
slice 唯独它顺序有严格要求,两个参数都支持从尾部倒数,或者数据长度加上这个负值
substring 唯独它可以自动换顺序;
substr 唯独它第二个参数是个数的意思; 第一个参数为负数的时候支持从尾部倒数,或者数据长度加上这个负值