在js中,有两种声明数组的方式, 一个是用[], 另一个是用new关键字。
var array1 = [1,2,3,4,5] // 直接赋值
var array2 = new Array(); // new 一个构造实例
new Array()
在 ES5 中,当您将一个数字传递给Array构造函数时,JavaScript 会创建一个长度等于该数字的数组。例如:
let numbers = new Array(2);
console.log(numbers.length); // 2
console.log(numbers[0]); // undefined
这种声明方式将会创建一个长度为2的数组,数组的每一元素都还未初始化,被置为undefined,显然它满足我们的需求,只想要[2]这个数组(new Array()
在一些场景下确实比较实用)。
当您向Array构造函数传递一个不是数字的值时,JavaScript 会创建一个数组,其中包含一个具有该值的元素。例如:
numbers = new Array("2");
console.log(numbers.length); // 1
console.log(numbers[0]); // "2"
这种行为有时令人困惑且容易出错,因为您可能不知道传递给Array
构造函数的数据类型。
所有对于上面出现的问题,ES6 引入了Array.of()
解决这个问题的方法。
该Array.of()
方法类似于Array
构造函数,只是该Array.of()
方法不特殊处理单个数值。
换句话说,Array.of()
无论参数的类型或数量如何,该方法始终创建一个包含你传递的值的数组。
Array.of
语法:
Array.of(element0[, element1[, ...[, elementN]]])
参阅示例1:
let numbers = Array.of(3);
console.log(numbers.length); // 1
console.log(numbers[0]); // 3
在这个例子中,我们将数字 3 传递给Array.of()
方法。该Array.of()
方法创建一个包含一个数字3的数组。
示例2:
let chars = Array.of('A', 'B', 'C');
console.log(chars.length); // 3
console.log(chars); // ['A','B','C']
在这个例子中,我们通过将创建了三个字符:数组'A'
,'B'
和'C'
给Array.of()
方法。数组的大小为 3。
Array.from
语法:
Array.from(arrayLike[, mapFn[, thisArg]])
from()方法可以接收类数组(arrayLike:伪数组),从而创建出一个数组实例,然后再去遍历。
参阅示例1:
我们可以看到它会创建并返回出一个新的数组实例,而不改变原有对象。那与map遍历方式有什么区别呢?
示例2:
// 定义一个函数获取传递的参数
function getArgs() {
console.log(arguments);
// output: [Arguments] { '0': 2, '1': 5, '2': 7, '3': 8 }
console.log("arguments.length: ", arguments.length);
// output: arguments.length: 4
}
getArgs(2,5,7,8);
拿到arguments的值是个类数组,而不是数组,因此它不能直接使用数组的一些方法。在这个时候其实是可以拿到arguments的length值的,但假如我们试图在arguments上面做一些类似push等数组方法时,它就会报错:
使用Array.from方法
把类数组转化为数组:
这样新实例化的对象就可以使用数组方法了。
补充:伪数组,即 arrayLike ,也称为类数组。是一种按照索引存储数据且具有 length 属性的对象。不具有数组身上的方法。
参考:https://www.javascripttutorial.net/es6/javascript-array-of/