数组方法、类数组(十六)

2020/6/23 JS

# 一、数组方法

# 1. concat()

concat()方法用于合并两个或多个数组。 此方法不会更改现有数组,而是返回一个新数组。

语法

var newArr = oldArr.concat(value1, value2, ...);
1

参数 valueN(可选) 数组/或值,将被合并到一个新的数组中。如果省略了所有valueN参数,则concat会返回调用此方法的现存数组的一个浅拷贝。 **

返回值 新的Array实例。

var arr1 = ['a', 'b', 'c'];
var arr2 = ['d', 'e', 'f'];
var arr3 = arr1.concat(arr2);
var arr4 = arr2.concat(arr1);
console.log(arr1);
console.log(arr2);
console.log(arr3);
console.log(arr4);
1
2
3
4
5
6
7
8

# 2. toString()

toString()方法返回一个字符串,表示指定的数组及其元素。 语法

arr.toString();
1

返回值 一个表示指定的数组及其元素的字符串。

var arr = ['a', 'b', 'c', 'd'];
console.log(arr.toString());
1
2

# 3. slice()

slice()方法返回一个新的数组对象,这一对象是一个由begin和end决定的原数组的浅拷贝(包括begin,不包括end)。原始数组不会被改变。

语法

arr.slice(begin, end)
1

参数 begin(可选) 提取起始处的索引(从0开始),从该索引开始提取原数组元素。 如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取。 如果省略begin,则slice从索引0开始。 如果begin超出原数组的索引范围,则会返回空数组。 end(可选) 提取终止处的索引(从0开始),在该索引处结束提取原数组元素。 如果该参数为负数,则它表示在原数组中的倒数第几个元素结束提取。 如果end被省略,则slice会一直提取到原数组末尾。 如果end大于数组的长度,slice也会一直提取到元数组末尾。 返回值 一个含有被提取元素的新数组。

var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var arr1 = arr.slice(1);
var arr2 = arr.slice(3, 6);
var arr3 = arr.slice(-4, -1);
console.log(arr);
console.log(arr1);
console.log(arr2);
console.log(arr3);
1
2
3
4
5
6
7
8

# 4. join()

join()方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。 如果数组只有一个项目,那么将返回该项目而不使用分隔符。 语法 参数 separator(可选) 指定一个字符串来分隔数组的每个元素。如果没填该参数,数组元素用逗号(,)分隔。如果separator是空字符串(''),则所有元素之间都没有任何字符。 返回值 一个所有数组元素连接的字符串。如果arr.length为0,则返回空字符串。

var arr1 = ['a', 'b', 'c', 'd'];
var arr2 = ['f'];
var str1 = arr1.join('-');
console.log(str1);
var str2 = arr2.join('-');
var str3 = arr1.join();
var str4 = arr1.join('')
console.log(str2);
console.log(str3);
console.log(str4);
1
2
3
4
5
6
7
8
9
10

# 5. split()(字符串方法)

split()方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字符串来决定每个拆分的位置。 语法

str.split(separator, limit)
1

参数 separator 可以是一个字符串或正则表达式。 如果省略该参数,则返回的数组包含一个由整个字符串组成的元素。 如果分隔符为空字符串,则将str原字符串中每个字符以数组形式返回。 limit 一个整数,限定返回的分隔片段数量。 返回值 返回源字符串以分隔符出现位置而成的一个Array。

var str1 = 'a-b-c-d-e';
var arr1 = str1.split('-');
var arr2 = str1.split('-', 3);
var arr3 = str1.split('');
var arr4 = str1.split();
console.log(arr1);
console.log(arr2);
console.log(arr3);
console.log(arr4);
1
2
3
4
5
6
7
8
9

# 二、类数组

DevTools判断类数组

  1. 存在且是对象。
  2. 对象上的splice 属性是函数类型。
  3. 对象上有 length 属性且为正整数。
function test() {
  // arguments.push(8); // TypeError 类数组没有push方法
  console.log(arguments);
}
test(1, 2, 3, 4, 5, 6);
1
2
3
4
5

# 模拟类数组

var obj = {
  '2': 3,
  '3': 4,
  'length': 2,
  'splice': Array.prototype.splice,
  'push': Array.prototype.push
};

/**
* 数组下标是从0开始的,length = 2 -> Array(2) -> [empty, empty]
* 每次push都是从this.length开始插入
* obj[length] = 1	 -> obj[2] = 1  length++
* obj[length] = 2  -> obj[3] = 2  length++
 */
obj.push(1);
obj.push(2);
console.log(obj);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 在对象原型上添加数组原型的方法实现类数组

var person = {
  '0': '张小一',
  '1': '张小二',
  '2': '张小三',
  'name': '张三',
  'age': 32,
  'weight': 140,
  'height': 180,
  'length': 3
};
// 对象原型上继承数组原型的push、splice方法
// 实例化后的对象将通过原型链继承push、splice方法
// 有length属性且为正整数的对象将被识别为类数组
Object.prototype.push = Array.prototype.push;
Object.prototype.splice = Array.prototype.splice;

// for...in枚举对象上可枚举的属性(包括继承的属性)
for (var key in person) {
  // 过滤掉继承的属性
  if (person.hasOwnProperty(key)) {
    console.log(person[key]);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Last Updated: 2022/7/21 10:52:53
Genshin Impact bgm
Genshin Impact