An array is an ordered collection of data (either primitive or object depending upon the language).--MDN 上的定义
数组的两种创建方法
一:数组直接量(也称为数组字面量),注意点如下:
- 直接量中的值可以是任意表达式[/empty/]
- 省略某个值或者是元素,省略的元素被赋予undefined
- 数组直接量允许有可选的逗号作为结尾
二:调用构造函数Array(),调用的方式分为三种
- new Array();不传参数,等同于[];
- 传入一个参数,此值就表示数组长度length,(数组中没有存储值,甚至数组的索引属性都未定义,in运算符false);
- 直接对参数传入多个元素,这就构成了新数组的元素,不如字面量简单,同时有其它风险
数组的操作:读写、length属性、delete、遍历、方法
数组的元素的读和写
- 使用[/empty/]操作符访问数组中的一个元素,数组的引用位于括号的左边,括号中的表达式分为两种情况
- 表达式使用负数和非整数来索引数组,此时数组转换为字符串,字符串来作为属性名,此时属性名当做常规的对象属性名,不会更新length属性
- 表达式返回非负整数值(有一个范围)时,此时当做数组索引,可以更新length属性
- 数组是对象的特殊形式,js会将制定的数字索引值转换成字符串--索引值1变成'1'--然后将其作为属性名来使用
数组的length属性
- Object.defineProperty(a,"length",{writable:false});可以把数组a的length值设置为只读
- 数组中length属性的规则:最大索引必须小于length属性值,维持此规则数组有两个特殊行为
- 如果为元素赋值,其索引i大于等于现有长度时,length值被设置为i+1
- 设置length属性为一个小于当前长度的非负整数n时,当前数组中索引i>=n的元素将被删除
- 使用delete之后不会修改数组的length属性
- 不会将元素从高索引处填充,删除的值为undefined
- 数组变成稀疏数组
数组的遍历
- 和对象的枚举差不多,仍然是for/if和in,ES5中的forEach()可以按照索引的顺序按个传递元素
数组的方法
- ES3中的数组方法:
- join,split,reverse,sort,concat,slice,splice,
- push,pop,unshift,shift,toString,toLacalString
- ES5中的方法:
- forEach,map,filter,every,some,reduce,reduceRight,indexOf,LastIndexOf
其他:仿造多维数组和类型检查
多维数组
- js并不支持多维数组,可以使用数组的数组进行近似,访问数组的数组中的元素只需要两次[]操作符就可以
数组类型
- 数组类型判定通常非常有用,而instanceof、typeof都不太好用,在ES5中使用Array.isArray()来实现检测,而在ES3中则用了一个自定义的函数
let isArray = Function.isArray || function (o){
return typeof o === "object" &&
Object.prototype.toString.call(o)=== "[object Array]";
}
console.log(isArray([]));
类数组对象和字符串
类数组对象
- 一个数值length属性和对应非负整数属性的对象可以看做类数组对象
- Function.call()的间接调用有一个很经典的描述:任何函数可以作为任何对象的方法来调用,哪怕这个函数不是那个对象的方法,参数是任何对象
- 检测类数组对象的方法主要是检测对象不是null和undefined,同时length的值满足数组值的要求
- 类数组的检测方法针对字符串通常返回false
作为数组的字符串 的特点总结
- 字符串的行为类似只读数组
- 访问单个字符串的方法:charAt()和[]
- Array.isArray()传入字符串返回false
- 字符串也可以通过Function.call()来调用数组方法
- 字符串是不可变值,如果使用数组方法修改字符串会出错,并且么有提示(好坑爹的感觉)