js数组
前言
js中window拥有非标准库和标准库,标准库中有Object及相关api,Sting,Boolean等,我们可以先试试这些函数/对象
Object()
Object()会根据传入的参数返回不同的值
- 基本类型,所有可以被包装的的基本类型都会被包装成包装类型
传入空对象,undefined,或者不传,返回null,传入非空对象返回原对象
使用new Array()
方式和构造函数没有区别
这里我们可以总结一下
如果是基本类型的函数/对象,不加new
和加new
是不相同的
如果是对象,比如Function
我们这里的Array
,这两者是等同的
Function构造函数
let a = new Function('a','b','a+b')
参数可以无到任意,但至少有函数体
function
是个关键字,Function
是个全局对象
函数有几种声明方式,声明出来的结果也不同
具名函数
1 | function f(){ |
匿名函数
1 | var f = function (){ |
函数方法体
1 | new Function('a','b','a+b') |
Function.prototype
.call()
.bind()
.apply()
Number() Boolean()
转换为对应的基本类型
Array是什么?
Array
对象是用于构造数组的全局对象,属于Object
我们一般声明Array采用的是[gg, aga, aga]
,实际上这种方式等价于new Array
,前者可以当作语法糖。
具体怎么用?
构造函数
Array()构造函数会根据传入的不同参数返回不同的数组
let a = Array(1)
当参数只有一个数字的情况,参数代表数组的长度,返回等于参数长度的数组,这个数组其它元素都没有被声明,包括0 in a
,它返回undefined。请注意,传入NaN会报错
let a = Array('我就要看你要做什么')
当参数为一个非数字,返回一个长度为1且a[0]=
所给字符串数组let a = Array(3,3)
当传入参数大于等于2,按顺序填充新数组并返回
方法
string.prototype
.trim()
返回一个去掉两端空格的新字符串.spli()
返回一个分割后的新字符串
Array.prototype
.push()
推入一个(末尾).pop()
弹出一个(末尾).shift()
删除数组头部元素.unshift
添加到头部.join()
把数组连接起来,并加上分隔符形成字符串返回,默认为,
号.concat(b)
把数组连接起来返回新数组,也可以和空数组合并,等同于数组复制.forEach()
遍历数组,详见后文.map()
遍历数组,详见后文
Array的关键是继承了Array.prototype
数组遍历
如果是数组,可以使用for(let i=0;i<obj.length;i++>)
如果不关心是否是数组,可以使用for (let i in obj)
遍历所有键值
还可以使用forEach()
,.map()
遍历
forEach()
forEcah
接受一个函数,这个函数有是三个值
1 | function (currentValue,index,array){ |
.map()
和forEach差不多,不过对value的改变会以新数组的形式返回
a.filter()
和map差不过,就是筛选,ture要,false不要
.reduce()
每次会把函数的返回值作为下一次的返回值,还可以指定初始索引,最后返回最后执行后的函数返回值
1 | a.reduce( function (sum,n){return sum+=n},0) //返回6,0为初始索引 |
a.sort()
一般排序算法使用的都是快排
注意:js中默认排序是按照Unicode的码点进行排序,非常傻逼。
幸运的是,sort接受一个可选参数,支持自定义的比较算法。
函数必须是这种形式的
1 | function (a,b){ |
因此比较数字大小的话,可以这样
1 | a.sort(function (a,b){return a-b}) // 最小的在最前 |
1 | a.sort(function (a,b){return b-a}) // 最大的在最前 |
其中forEach使用this
表示调用者,可以使用this
来获取调用者的属性
伪数组
如果像一个数组,且_proto_
不等于Araay.prototype
,那这就是一个伪数组
在js目前遇到的伪数组就是arguments
这个表示传给函数的参数