Go to comments

JavaScript 数组

一、数组的定义


对象 和 数组是数据里面的两个大块,对象稍微复杂一点,数组比较简单,数组也是一种存储方式也是引用值。


研究一个东西先研究它的定义方式,对象有四种定义方式

第一种 字面量

第二种 构造函数是系统自带

第三种 是我们自定义的构造函数

第四种 Obect.create()


数组就两种

第一种定义数组的方式叫数组字面量

var arr = [];


第二种是一个构造方法定义数组  new Array() ,这个 Array() 构造方法是系统提供的,所以说数组能用的一切的方法都来源于 Array.prototype

var arr = new Array(); // 构造方法定义数组

因为数组是 new Array() 构造出来的,即使写了一个字面量的形式也相当于 new Array() 了一个数组,所以说数组一切方法都来源于Araay.prototype


针对于这个两种方法,分别举几个例子


1、字面量

第一种方法直接写数组就好了,里面想写啥写啥

var arr = [1,2,3,4,5];


光写几个逗号行不行啊?

也行,不算报错,比如写一个逗号,代表把这个数组拆分成了两位,也就是说数组里面有两位,只不过这两位都没值而已

var arr = [,];

console.log(arr); 

// chrome返回[empty]
// Firefox返回[undefined]


纯写逗号没有意义

var arr = [1,,1];

console.log(arr);

// chrome返回[1, empty, 1]
// Firefox返回[1, undefined, 1]


写2个逗号返回  [empty × 2]  也没什么用,反正单独写逗号,只会添加数组里的一些位,数组字面量就这么来定义的

var arr = [,,];

console.log(arr); //(2) [empty × 2]


如果里面多加几个逗号,真的无所谓这种叫稀松数组,也就是说数组并不是每一位都有值的叫稀松数组

var arr = [1,2,,,,3,4];

console.log(arr); // [1, 2, empty × 3, 3, 4]

console.log(arr.length); // 7

写了四个逗号中间隔了三位,

这三位也算数组的长度,现在数组的长度7,有六个逗号是七位,

写逗号也算隔开了,然后可以给每一位赋值取值。


2、new Array(length/content)

接下来另一种方法  new Array() ,这种方式看着比较陌生,其实也没那么难,可以给  new Array(1, 2, 3, 4, 5)  里面传参数

var arr = new Array(1,2,3,4,5);

console.log(arr); // [1, 2, 3, 4, 5]

打印出来和字面量创建的数组是一样的


 new Array()  本质上和写字面量的形式没什么太大区别,但是有没有真实的区别呢?

基本上没有,只有那么一钉点


这一钉点就是如果给数组构造方法第一个参数,只给它传一个参数  new Array( 10 传一个10进去,就和数组字面量不一样了

var arr = new Array(10);

console.log(arr); // [empty × 10]

现在arr是长度为10的稀松数组,虽然arr每一位都没值,但它的长度确实为10,

也就是说给  new Array( 10 )  里面传参了,并且只传了一个参数,就会把这一个参数当做数组的长度,而不是数组第一位的值,

这是与数组字面量唯一的区别,假如想创建一个长度为10的空数组只能这么创建。


由于这一个小的区别引发了一个矛盾!

如果在数组字面量里面写了一个数字 10.2 是什么意思?意思是数组里有一位,数组长度是1,第一位的数值就是10.2

var arr = [10.2];

console.log(arr); // 10.2


给数组构造函数写 10.2 的话,这个就会报错了

var arr = new Array(10.2); // Uncaught RangeError: Invalid array length

报错信息说,这个lenght属性是非法的(是超边界的),不能给  new Array( 10.2 )  第一位传一个小数进来,

我们的理想是,让数组只有一位,第一位是10.2,但系统识别不了,所以  new Array( 10.2 )  第一位千万不能写小数,系统认为这是 10.2 的长度不合法的,只能填写整数


这是数组字面量和  new Array()  它俩的一个区别,数组就这两种构造方法,没有第三种了,要强说到话,也有!


单独空执行  Array()  它会返回一个数组 [] 来,这就无聊了,能返回数组的方法多了

console.log(Array()); // []


官方构造数组就两个方法,但是无论数组还是对象,推荐使字面量的形式,

除非有特殊情况,比如对象要加个类型,要批量生产才写构造函数。


上面这个  new Array( "10.2" )  矛盾可以加引号解决

var arr = new Array('10.2');

console.log(arr); // ["10.2"]


二、数组的读和写


javascript数组的读和写是极其的松散,基本上是没什么可以报错的地方,

换成其它语言的数组,比如数组定义十位,这个数组长度就是10,你访问它第十一位肯定出错,告诉你数组越界,在javascript里没有那毛病

var arr = [];

console.log(arr[10]); // 没有第十位返回undefined,不可能报错


在javascript里面数组你想让它报错,

除非是引用了属性没有的方法  xxx is not defined ,否则的话是几乎报不了错的


为什么数组几乎报不了错?

因为javascript里的数组是基于对象


比如一个对象obj里面,有一个属性名为数字10的属性吗?

var obj = {
  // 10 ps:对象里面可以给它属性名命名为10,这是无所谓的
};

console.log(obj[10]); // obj没有属性名为10的属性,没有返回undefined


数组其实就是一个特殊的对象,他和对象本质上没什么太大的分别,

所以在数组里面访问对象obj,你有一个  arr[10]  的属性吗?没有就undefined(而且取值 arr[10] 是合法的,只不过没值而已)


赋值可以吗?赋值也是没问题的

arr = [];

arr[10] = "abc"; // 给数组第十位直接赋值

console.log(arr); // [empty × 10, "abc"]

console.log(arr.length); // 前面十个empty后面一个abc,数组的长度为11

原来是空数组,给他第十位直接赋值,就会把数组抻长到十位,换句话说抻长到第十一位,因为数组第十位是第11个,抻长到第11个。


javascript数组几乎没有什么课报错的地方,接下来是重点,数组的几个方法。



Leave a comment 0 Comments.

Leave a Reply

换一张