首先我们要知道什么是引用类型,在《javascript高级程序设计》中是这样定义引用类型的:引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型的值(对象)是引用类型的一个实例。
Array类型是ECMAScript中最常用的类型,也可称之为数组。 数组是一组值的有序集合,但是ECMAScript中的数组与其它语言中的数组有这很大的区别。我们都知道javascript是弱类型语言,在ECMAScript中同一个数组可以存放多种不同类型的元素,并且数组长度是不定的,会随着数据元素增减而改变长度。
创建数组的方式
如上所述,对象是某个特定引用类型的实例,新对象可以使用new操作符后跟一个构造函数来创建,因此创建一个数组可以使用如下方式:
var arr = new Array(); //无参构造,只创建一个数组
我们还可以在new操作符创建数组时将一个Number类型作为参数传入,那么我们可以得到一个初始化长度的数组。
var arr = new Array(10);
console.log(arr.length) //控制台会输出10
请记住,要得到一个初始化长度的数组,只能传入一个参数,并且参数类型为Number。如果传入两个Number参数,则会得到一个有两个元素项的数组,数组长度为2。或者传入一个String类型的参数,也不是显示初始化长度
var arr = new Array(10,5)
console.log(arr) //控制台输出[10,5]
var arr1 = new Array("10")
console.log(arr1) //控制台输出[10]
Tips:使用new操作符创建数组,可以将new操作符省略,得到的结果也是一样的
除new操作符创建数组之外,我们还可以使用字面量的方法创建一个数组。 数组字面量是由一对包含数组项的方括号表示,数组项之间用逗号隔开
var arr = [] //创建一个空数组
var arr1 = ["lucy","lilei",25] //创建一个包含3个数组项的数组
数组索引
我们都知道数组是存放一组数据的有序集合,那么我们就可以利用下标索引的方式来获得数组中某一个位置的值或者改变它。索引值从0开始,因此数组最后一项的索引值为 array.length-1。如果索引值大于最后一项的下标值,那么返回undefined。如下代码:
var names = ["lucy","lilei","wannianqing"];
console.log(names[0]) //读取第一项 输出lucy
console.log(names[names.length-1] //读取最后一项 输出wannianqing
console.log(names[names.length] //索引超出 输出undefined
检测数组类型
在Javascript中存在两套类型系统,一套是基本数据类型系统,一套是对象类型系统。基本数据类型通过typeof来检测,对象类型系统是以基本类型为基础,通过instanceof来检测。 所以检测是否是数组需要使用instanceof方式
var names = ["lucy","lilei","wannianqing"];
if(names instanceof Array){
//如果names是数组则执行的代码块
}
除了instanceof检测以外,ECMAScript还提供了一个方法isArray()用于检测传入的值是否是Array类型
var names = ["lucy","lilei","wannianqing"];
var demoFun = function(){}
console.log(Array.isArray(names)) //返回true
console.log(Array.isArray(demoFun)) //返回false
除了上述两种检测数组的方式,我们还可以定义一个自己的方法用于检测数组。在Ojbect原型上有一个toString()方法,该方法返回一个表示该对象的字符串。如果该方法未被重新定义覆盖,则返回"[object type]",其中的type是对象的类型。下面请看代码:
var obj = {}
console.log(Object.prototype.toString(obj)) //返回[object Object]
var demoFun = function(){}
console.log(Object.prototype.toString(demoFun)) //返回[object Object]
var arr = []
console.log(Object.prototype.toString(arr)) //返回[object Object]
var name = "wan";
console.log(Object.prototype.toString(name)) //返回[object Object]
上面给出几个例子,上面返回的值都是“[objcet Object]”。这不能检测对象的类型,但是我们可以使用call()或者applay()方法来进一步帮助我们完成检测对象类型。 此处就不对call()和apply()做解析了
var obj = {}
console.log(Object.prototype.toString(obj)) //返回[object Object]
var demoFun = function(){}
console.log(Object.prototype.toString.call(demoFun)) //返回[object Function]
var arr = []
console.log(Object.prototype.toString.call(arr)) //返回[object Array]
var name = "wan";
console.log(Object.prototype.toString.call(name)) //返回[object String]
如上,我们不知可以检测数组,还可以检测函数 字符类型。 到这我们就可以定义一个我们自己的isArray了,代码如下:
var names = ["lucy","lilei","wannianqing"];
Array._isArray = function(arg){
return Object.prototype.toString.call(arg) === '[object Array]';
}
if(Array._isArray(names)){
//是数组 则执行
}
本篇内容介绍到此,各位看官发现有不当之处请指教。