澳门新萄京:Es6学习笔记,Array数组的基本操作
分类:澳门新萄京最大平台

JavaScript 数组的那些事

2017/06/28 · 基础技术 · 1 评论 · 数组

本文作者: 伯乐在线 - 追梦子 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

Array构造器

数组是值的有序集合。

Array对象

参考书《ECMAScript 6入门》

Array构造器

如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表。

new Array(12) // (12) [undefined × 12] new Array('') // [""] new Array({}) // [Object] new Array([]) // [Array(0)] new Array(null) // [null] new Array(NaN) // Uncaught RangeError: Invalid array length (无效的数组长度,因为NaN是Number类型,但又不是一个具体的数字因此报错)

1
2
3
4
5
6
7
8
9
10
11
12
new Array(12)
// (12) [undefined × 12]
new Array('')
// [""]
new Array({})
// [Object]
new Array([])
// [Array(0)]
new Array(null)
// [null]
new Array(NaN)
// Uncaught RangeError: Invalid array length (无效的数组长度,因为NaN是Number类型,但又不是一个具体的数字因此报错)

注意当只传递一个参数时,它只是指定该数组的长度,并不会去填充内容

澳门新萄京 1

由于传递一个参数时不会填充数组内容,因此forEach不会循环这些空内容,或者说forEach不是根据数组长度来循环的,以下代码就不会被输出任何内容

new Array(6).forEach(function(item,index){ console.log(index) });

1
2
3
new Array(6).forEach(function(item,index){
  console.log(index)
});

像我们自己模拟的forEach基本上都是有问题的,因为我看大部分人都是通过for循环数组的长度来模拟的forEach

function forEach(arr,fun){ for(var i = 0; i arr.length; i ){ fun(arr[i]); } }

1
2
3
4
5
function forEach(arr,fun){
    for(var i = 0; i  arr.length; i ){
        fun(arr[i]);
    }
}

这就说明在某些情况下数组的长度是不可靠的,并且我们没有办法去真实的模拟forEach,通过判断是不是undefined也是不准确的。

由于传递一个参数时只会增加数组长度而不会填充内容,因此我们可以利用这个特点来实现自定义索引起始位置。

new Array(10).concat([1,2,3,4,5]).forEach(function(item,index){ console.log(`item: ${item} index: ${index}`); }); // item: 1 index: 10 // item: 2 index: 11 // item: 3 index: 12 // item: 4 index: 13 // item: 5 index: 14

1
2
3
4
5
6
7
8
new Array(10).concat([1,2,3,4,5]).forEach(function(item,index){
    console.log(`item: ${item} index: ${index}`);
});
// item: 1 index: 10
// item: 2 index: 11
// item: 3 index: 12
// item: 4 index: 13
// item: 5 index: 14

当然我们也可以这样玩

new Array(10).concat([1,2,3,4,5]).concat(new Array(5)).concat([6,7,8,9,10])

1
new Array(10).concat([1,2,3,4,5]).concat(new Array(5)).concat([6,7,8,9,10])

澳门新萄京 2

这种方式有个好处就是,空内容不会被循环到。

它还可以用来实现相同的连续字符

new Array(5 1).join("哈") //由于数组索引是从0开始的所以需要加 1才是5 // "哈哈哈哈哈"

1
2
new Array(5 1).join("哈") //由于数组索引是从0开始的所以需要加 1才是5
// "哈哈哈哈哈"

我们用它来输出一个好玩的

new Array(3).concat(['l','o','v','e']).concat(new Array(3)).join('--') // "------l--o--v--e------"

1
2
new Array(3).concat(['l','o','v','e']).concat(new Array(3)).join('--')
// "------l--o--v--e------"

如果你希望设置默认填充内容可以使用数组的fill方法

new Array(5).fill(999) [999, 999, 999, 999, 999]

1
2
new Array(5).fill(999)
[999, 999, 999, 999, 999]

我们也可以使用下面这种方式来实现默认填充内容

var arr = new Array(5).join('5,').split(','); arr.splice(-1,1); // ["5", "5", "5", "5"]

1
2
3
var arr = new Array(5).join('5,').split(',');
arr.splice(-1,1);
// ["5", "5", "5", "5"]

以上这种方式的缺点就是都会变成字符串。

通过Array()方法来创建数组和用new方法来创建效果一样。

如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表。

澳门新萄京 3

本文参考MDN做的详细整理,方便大家参考[MDN]()

数组的扩展

数组的访问

数组通过下标访问

[2,3,4,5][1] // 3

1
2
[2,3,4,5][1]
// 3

当我们通过以下方式进行访问时,会被解析成连续运算返回最后一个值

[2,3,4,5][1,2] // 4

1
2
[2,3,4,5][1,2]
// 4

由于以上[1,2]是去访问数组的下标因而被解析成了1,2结果返回的是2,所以以上输出4

数组也是一种特殊的对象,因此我们也可以通过键值对的形式去访问

var arr = []; arr.say = 'Hello'; arr.say // "Hello"

1
2
3
4
var arr = [];
arr.say = 'Hello';
arr.say
// "Hello"

new Array(12)
// (12) [undefined × 12]
new Array('')
// [""]
new Array({})
// [Object]
new Array([])
// [Array(0)]
new Array(null)
// [null]
new Array(NaN)
// Uncaught RangeError: Invalid array length (无效的数组长度,因为NaN是Number类型,但又不是一个具体的数字因此报错)

数组原型

创建数组:

1.扩展运算符:可以将数组转化成逗号隔离的单个参数
...[1,2,3] //控制台运行报错
console.log(...[1,2,3]);//1,2,3

数组与其他值的运算

数组和任何值相加都会将数组转换成字符串再进行拼接

[1,2,3] 6 // "1,2,36" [1,2,3] {} // "1,2,3[object Object]" [1,2,3] [1,2,3] // "1,2,31,2,3"

1
2
3
4
5
6
[1,2,3] 6
// "1,2,36"
[1,2,3] {}
// "1,2,3[object Object]"
[1,2,3] [1,2,3]
// "1,2,31,2,3"

如果数组只有一个值,那么当这个数组和其他值相减相乘等时会被转换为数字,如果为空会被转换为0

[5] - 2 // 3

1
2
[5] - 2
// 3

如果是多个值,肯定是NaN

注意当只传递一个参数时,它只是指定该数组的长度,并不会去填充内容

Array.prototype.concat() [ES3]

  • 数组字面量:var arr1 = [1,2,3];
  • Array构造函数1:var arr2 = new Array(1,2,3);  //[1,2,3]
  • Array构造函数2:var arr3 = new Array(3);  var arr3 = new Array(‘3’);  var arr3 = new Array('ol');  

  • 错误写法:var arr3 = new Array(3.2);  var arr3 = new Array(-3);  

  • 例:var arr5 = new Array(50) 返回的数组arr5的成员都是空位,虽然读取的时候返回undefined,但实际上该位置没有任何值,虽然可以取到length属性,但是取不到键名( 0 in arr5; //false )

(1)代替apply方法
function test(a,b){return a b;}
test.apply(null,[1,2]) 同 test(...[1,2]) 作用一样
(2)复制数组
var arr1 = [1,2,3],var arr2 = [];
arr2 = arr1.concat();
arr2 = [...arr1] 或 [...arr2] = arr1 //同样可达到复制数组的效果
改变arr2的值也不会影响到arr1
(3)合并数组
将arr2追加到arr1的尾部
var arr1 = [1,2,3],arr2 = [4,5,6],arr3;
Array.prototype.push.apply(arr1,arr2); 同 arr1.push(...[arr2]);作用一样
arr3 = [...arr1,...arr2] //[1,2,3,4,5,6]
(4)与解构赋值结合来赋值
[a,...b] = [1,2,3,4,5] // a---1, b---->[2,3,4,5]
(5)将字符串转为数组
let str = "word";
console.log(...str);//['w','o','r','d']
还可以识别unicode编码超过uFFFF 需要用四个字节表示的字符 var str = "asdc

本文由澳门新萄京发布于澳门新萄京最大平台,转载请注明出处:澳门新萄京:Es6学习笔记,Array数组的基本操作

上一篇:澳门新萄京45分钟高分虏获offer,唯品会的体味 下一篇:没有了
猜你喜欢
热门排行
精彩图文