JavaScript 数组
一、数组的定义
对象和数组是数据里面的两个大块,对象稍微复杂一点,数组比较简单,数组也是一种存储方式也是引用值。
研究一个东西先研究它的定义方式,对象有四种定义方式
第一种 字面量
第二种 构造函数是系统自带
第三种 是我们自定义的构造函数
第四种 Obect.create()
数组就两种
1. new Array(length/content)
2. 字面量
第一种定义数组的方式叫数组字面量
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"]
二、数组的读和写
1. arr[num] 不可以溢出读的意思是,结果是undefined,什么都可以溢出
2. arr[num] = xxx; 可以溢出写
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数组几乎没有什么课报错的地方,接下来是重点,数组的几个方法。