Array 对象
一. 用法
1. var a = Array(3)
// 生成长度为3的数组
Stack Heap
a ADDR12 12
length: 2
__proto__
2.var a = Array(3,3)
new Array // 加不加new 都一样
Stack Heap
a ADDR13 13
0:3
1:3
length: 2
__proto__
3. 基本类型与复杂类型(Object)不同
Number()=>基本类型 Object()=>复杂类型
new Number()=>对象 new Object()=>复杂类型
加不加new不一样 加不加都一样
function 与Function的区别
- function 关键字 与if var 相似
- Function 全局对象 window.Function
- Function('x','y','return x+y')
- new Function('x','y','return x+y')
- 加不加 new 结果一样
二. 函数声明方法总结
1. 具名函数 (推荐)
function f(x,y){
return x + y
}
2. 匿名函数 + var
var f
f = function(x,y){ return x+y }
3. 具名函数 + var
var f1
f1= function f2(x,y){
return x+y
}
console.log(f2) // undefined
4. window.Function + var
var f
f = new Function('x','y','return x+y')
三. JS 中数组的本质
数组:用Array 构造出来的对象
人类理解:数组就是数据的有序集合
JS理解:数组就是原型链中有 Array.prototype 的对象
- 数组的proto指向Array.prototype
- 数组与对象只是原型链不同
伪数组
- 有 0,1,2,3,4,5...n,length 这些 key 的对象
- 原型链中没有Array.prototype这一环
四. 数组的 API
- Array.prototype.forEach
- Array.prototype.sort
- Array.prototype.join
- Array.prototype.concat
- Array.prototype.toString
- Array.prototype.map
- Array.prototype.filter
- Array.prototype.reduce
1. forEach
forEach的用法与map方法一致,参数是一个函数,该函数同样接受三个参数:当前值、当前位置、整个数组。
用法
源代码
function log(element, index, array) {
console.log('[' + index + '] = ' + element);
}
[2, 5, 9].forEach(log);
// [0] = 2
// [1] = 5
// [2] = 9
function forEach(array,x){
for(let i=0;i< array.length;i++){
x( array[i] , i )
}
}
var a = [1,2,3,4]
a.forEach(function( x, y ){
console.log(x,y)
})
下面是老师的过程 forEach
2. sort
sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。
var a=[1,4,5,2,7]
a.sort()
[10111, 1101, 111].sort(function (a, b) {
return a - b;
})
// [111, 1101, 10111]
sort的参数函数本身接受两个参数,表示进行比较的两个数组成员。如果该函数的返回值大于0,表示第一个成员排在第二个成员后面;其他情况下,都是第一个元素排在第二个元素前面。
3. map
map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。
4. filter()
filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组。
filter方法的参数函数可以接受三个参数:当前成员,当前位置和整个数组。
[1, 2, 3, 4, 5].filter(function (elem, index, arr) {
return index % 2 === 0;
});
// [1, 3, 5]
5. join()
join方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。
a= [1,2,3]
a.join('饭')
// ' 1饭2饭3 '
5. concat()
concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。
var a = [1,2,3]
var b =[4,5,6]
a.concat(b) //[1,2,3,4,5,6]
6. reduce reduceRight
reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。
[1, 2, 3, 4, 5].reduce(function (a, b) {
console.log(a, b);
return a + b;
})
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15
上面代码中,reduce方法求出数组所有成员的和。第一次执行,a是数组的第一个成员1,b是数组的第二个成员2。第二次执行,a为上一轮的返回值3,b为第三个成员3。第三次执行,a为上一轮的返回值6,b为第四个成员4。第四次执行,a为上一轮返回值10,b为第五个成员5。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值15。