typeof null; 为什么结果是Object ?
JS解释器编译原则,如果二进制前三位是0,typeof查询的数据类型返回的就是Object,而null转换为二进制存储时,全部位数均为0,所以typeof查询结果为Object,这是早期开发的bug,所以后续又有一个undefined表示空,关于历史原因可以查看阮一峰老师的博客
1、概念介绍
对象:各种属性的名称和属性的值组成的无序的列表的合集;
数组:有序的列表合集;
数组2个特性:每一项可以保存任意数据类型数据;长度可以随时调整;
2、数组创建
//使用new关键字
var arr=new Array(); //创建空数组
// var arr=new Array(size); //size表示数组长度,如果是2则创建长度为2的空数组
// var arr=new Array(1,2,3);//数组长度为3,参数为1,2,3
//使用中括号
var narr=[];//空数组
var narr=[1,2,3]//带有参数值的数组
使用new关键字创建,如果里面只有一个参数,则表示数组的长度;如果有多个参数,多个参数使用都好分割,则参数就表示数组的内容。
使用字面量创建数组: 最后一位不要加逗号,如果加上ie7会报错,后续浏览器已修复,但是最好不要加。
3、数组的读取
读取方式:数组名[该项索引]
注意:索引从0开始
var narr=[1,2,3];
narr[0]; //第一项 1
因为数组是特殊的对象,所以对象的读取除了用点(.)也可以使用中括号([])
4、数组的写入
var list = ['a','b','c','d'];
list[10]='e';//长度变为11,5-10项为空值
delete方法用于删除对象的指定元素,数组为特殊的对象,所以数组删除某一元素,也可使用delete
var list = ['a','b','c','d'];
list.length;//4
delete(list[0]);
list[0]; //删除后数组长度不改变,但是被删除的项的值变为undefined
list.length;//4
改变数组的length
var list = ['a','b','c','d'];
list.length = 6;//设置length比原数组长度大的数
console.log(list);//数组长度变为6,5和6两项的值为undefined
//设置比length小
var list = ['a','b','c','d'];
list.length = 2;
console.log(list);//[ "a", "b" ],从后面依次删除对应的值,3和4项被删除,仅剩1、2两项
//设置length不是个自然数,会报错
var list = ['a','b','c','d'];
list.length = a;//invalid array length
5、数组的检测
typeof检测只能检测出来是对象,无法确定是对象还是数组,需要使用instanceof
//方法一
var list = ['a','b','c','d'];
list instanceof Array; //true
//方法二
list.constructor === Array; //true
缺点:存在多个iframe或者全局环境时会出错
方法三:es5新增方法Array.isArray
var list = ['a','b','c','d'];
Array.isArray(list); //true
缺点:低版本浏览器会报错(无法兼容es5的浏览器)
如何判断是否支持es5:
typeof Array //‘function’,如果是返回function,则支持es5
方法四:Object.prototype.toString.call()
var list = ['a','b','c','d'];
Object.prototype.toString.call(list) === "[object Array]";
比较精准,但是写法较复杂;
6、数组的方法
栈方法:
push()、pop(),对数组末尾进行增加和删除
队列方法:
unshift()、shift(),向数组开头增加和删除
排序方法:
reverse()翻转数组,sort() 对数组元素进行排序
操作方法:
join()把数组中的所有元素放入一个字符串。 元素是通过指定的分隔符进行分隔,默认是逗号;
concat()连接两个或多个数组
slice(start,end)方法可从已有的数组中返回选定的元素,包括开始不包括结尾
splice(index,howmany,item1,…,itemX)可接受多个参数,增删改均可实现;传递1个参数,从该位置删除直到结尾;传递2个参数,从第一个参数位置开始删除,删除第二个参数的个数;传递3个参数,从第一个参数位置开始删除,删除第二个参数的个数,插入第三个或者更多个参数值。
push与concat方法的区别
//区别一:push直接影响原数组,concat会生成一个新数组
var arr = [1,2];
arr.push(4);
arr.concat(5);
arr;//原数组只增加了4,(3) [1, 2, 4]
var narr = arr.concat(6);
narr; //(4) [1, 2, 4, 6]
arr;//(3) [1, 2, 4]
//区别二:传入参数如果是数组,push会当成一个值写入,concat会当成多个值写入
var arr = [1,2];
arr.push([5,4]);//[1,2,[5,4]]
var narr = arr.concat([6,7,8]);
narr; //(6) [1, 2, [5,4], 6, 7, 8]
备注:栈方法、队列方法、排序方法会直接影响原数组
详解:数组方法梳理及各个方法特点
ES5新增数组:
检索方法(位置方法): indexOf和lastIndexOf
array.indexOf(item, start);第一个参数检索值,第二个参数检索开始位置,不传则默认从下标0开始
array.lastIndexOf(item, start);参数同上
查找原则:有检索值返回检索值下标,没有则返回-1
备注:匹配条件是全等(===)
迭代方法: every()、filter()、forEach()、map()、some()
array.filter(function(currentValue, index, arr), thisValue)
这五个方法参数相同,都接受三个参数,第一个参数为当前元素的值,第二个参数当前元素的数组索引,第三个参数当前元素所属的数组对象
归并方法: reduce()和reduceRight()
详解:ES5新增数组方法
w3scholl方法总结:array所有方法参照
备注:本内容学习总结来源于喜马拉雅冰山工作室沙翼老师主讲的(陪你读书(JavaScript WEB前端))