字符串与数组
substring、slice和substr
也是一道经典面试题(虽然人家没问过我)
var str = "I am 一个好人";
str.substring(2,7);//am 一个
str.substr(2,7);//am 一个好人
str.substr(2,10);//am 一个好人
str.slice(2,7);//am 一个
str.substring(2,-2);//am 一个好人(这是错误答案) “I "(这是正确答案)
str.substr(2,-2);//空
str.slice(2,-2);//am 一个
str.substring(-2,3);//I a
str.substr(-2,3);//好人
str.slice(-2,3);//"好个一 "(这是错误答案) 空(才是正确答案,因为-2相当于7)
str.slice(-2,8);//好
上面的错误答案就是我踩过的坑
一般问题都会把substring和substr放在一起(毕竟都是字符串的方法),但为了记好他们仨的参数,substring与slice一样参数都为(start,end),我决定把substring与slice放到一起。但他俩也有不同,当substring接收到两个参数时,它会先把两个参数比大小,小的作为第一个参数,大的作为第二个参数;如果其中一个参数是负数,它会将其直接赋成0,多么简单粗暴啊。
substring是以两个参数中较小一个作为起始位置,较大的参数作为结束位置,所以str.substring(2,-2)变成了str.substring(-2,2);又因为substring干脆将负参数都直接转换为0,所以实际上这句话是str.substring(0,2)。
slice的话就比较正常啦~没什么比大小也没什么赋值为0的乱七八糟,但是如果是end比start靠前,他就都会报“空”,所以str.slice(-2,3)就好理解了,抽取字符串的顺序永远是从左往右(╯‵□′)╯︵┻━┻
最后一个说说与众不同的substr,当接收的参数有负数时,substr则仅仅是将第一个参数与字符串长度相加后的结果作为第一个参数。所以str.substr(2,-2)相当于str.substr(11,-2)。so只要第二个参数为负它就永远返回“空”。
slice和splice
slice(start,end)不改变原数组,返回改变后的数组。
var a = [2,3,4];
var b = a;
a = a.slice(1,2);
console.log(a);//[3]
console.log(b);//[2,3,4]
splice(start,howmany,item1,item2……)改变原数组,返回被删除的项目。
var a = [2,3,4];
var b = a;
a.splice(1,2,666);
console.log(a);//[2, 666]
console.log(b);//[2, 666]
reverse
array.reverse()改变原数组,返回新数组。
var array1 = ['one', 'two', 'three'];
var reversed = array1.reverse();
console.log('reversed: ', reversed);//Array ['three', 'two', 'one']
console.log('array1: ', array1);//['three', 'two', 'one']
concat
array.concat(item1,item2……)不改变原数组,返回新数组。
var array1 = ['a', 'b', 'c'];
var array2 = ['d', 'e', 'f'];
console.log(array1.concat(array2));//["a", "b", "c", "d", "e", "f"]
console.log(array1);//Array ["a", "b", "c"]
上一篇: 1102:与指定数字相同的数的个数
下一篇: c#求两个数中最大值的方法