js数组与字符串类型相同方法的比较

数组和字符串有很多相似的对方,比如数组和字符串都有以下方法:

  1. concat
  2. indexOf
  3. lastIndexOf
  4. slice
  5. includes

鉴于toString及valueOf方法基本类型都有,这里就不做过多介绍了

1、数组中indexOf和较数组中includes的比较

  • 看函数的返回值:indexOf返回的是数值型的而includes返回的是布尔型的
  • 都可以支持第二参数,而且的第二个参数都支持负数形式
  • 数组中的indexOf不能判断数组中是否有NaN而includes可以

1.1 indexOf不能判断NaN

var arr = [NaN];
console.log(arr.indexOf(NaN))   //-1
console.log(arr.includes(NaN))  //true

1.2 判断稀疏数组结果不同

var arr = [,,];
console.log(arr.indexOf(undefined))//-1
console.log(arr.includes(undefined))//true

这是因为 indexOf 认为稀疏数组,省略掉的值是不存在的,但 includes 认为是undefined

2、字符串的indexOf和数组中的indexOf的比较

功能:搜索字符串or数组中的元素,并返回它所在的位置。
语法:array.indexOf(item,start)

  • 这两个方法都可以接收两个参数
  • 这两个方法在没有查找的指定的字符都返回-1
  • 字符串中的indexOf中的第二个参数不支持负数而数组的indexOf支持
  • 字符串的indexOf在传入参数不是字符串的情况下默认会转换为字符串而数组的indexOf不会进行数据类的转换

2.1 字符串的参数不支持负数

let str = "abcd";
let arr = ["a","b","c","d"];
console.log(str.indexOf("a", -1)); //0
console.log(arr.indexOf("a", -1)); //-1

2.2 字符串的参数会自动转换

let str = "1";
let arr = ["1"];
console.log(str.indexOf(1)); //0
console.log(arr.indexOf(1)); //-1

3、字符串的includes和数组中的includes的比较

功能:用来判断一个字符串or数组是否包含一个指定的值,如果是返回 true,否则false
语法:arr.includes(searchElement, fromIndex)

  • 这两个方法都可以接收两个参数
  • 这两个方法在没有查找的指定的字符都返回false
  • 字符串中的includes中的第二个参数不支持负数而数组的includes支持
  • 字符串的includes在传入参数不是字符串的情况下默认会转换为字符串而数组的includes不会进行数据类的转换

3.1 字符串的参数不支持负数

let str = "abcd";
let arr = ["a","b","c","d"];
console.log(str.includes("a", -1)); //true
console.log(arr.includes("a", -1)); //false

3.2 字符串的参数会自动转换

let str = "1";
let arr = ["1"];
console.log(str.includes(1)); //true
console.log(arr.includes(1)); //false

4、字符串的slice和数组中的slice的比较

功能:提取字符串or数组的某个部分,不会改变现有的值,而仅仅会返回被连接字符串or数组的一个副本。
语法:arr.slice(start,end)

  • 在不传入任何参数的情况下都是把原来的值拷贝一份
  • 字符串的slice的第二个参数是不支持负数的而数组的可以
  • 都可以接收两个参数
let arr1 = [1, 2, 3, 4, 5, 6];
console.log(arr1.slice(1, 4)) //[2, 3, 4];

let str1 = "hello root";
console.log(str1.slice(1,4)); //ell

5、字符串的concat和数组中的concat的比较

功能:方法用于连接两个或多个字符串or数组;不会改变现有的值,而仅仅会返回被连接字符串or数组的一个副本。
语法:arr.concat(arrayX,arrayX,......,arrayX)

  • 这两个方法都没有限定参数,而且参数可以是任何数据类型的值
let str1 = "hello";
let str2 = " world!";
console.log(str1.concat(str2));  //"hello world!"

let arr1 = ["hello"];
let arr2 = ["root"];
console.log(arr1.concat(arr2)); //["hello", "root"]