1.从人类的角度看,数组是按次序排列的一组值。
2.从JS的角度看,是用Array定义的一个对象。
Array.prototype{.push(),.pop(),.shift(),.join(),...}
面试
用法1:var a = Array[3]
,获得的是长度为3的数组,且值为undefined。
用法2:var a = Array[3,3]
,获得的是长度为2,值为{3,3}的数组。编程
```
Array(2)
0:3
1:3
length:2
__proto__:Array(0)
```
复制代码
小总结: 数组
对比:a=[1,2,3] 和 object={0:1 1:2 2:3 length=3 }
本质区别:他们的__proto__指向不一样即原型链不一样,如图所示: bash
var obj = {
0:1, 1:2, 2:3 ,3:4, length:4
}
当成数组:
for(let i=0; i<obj.length;i++){
console.log(obj[i])
}
当成对象:
for(let i in obj){
console.log(obj[i])
}
复制代码
定义:原型链(_proto_)没有Array.prototype,那这个对象就是伪数组。
用途:目前JS只有一个伪数组arguments
(arguments就是接收到的参数)闭包
function (){
console.dir(arguments)
}
f(1,2,3)
>> Argument(3)
0:1
1:2
2:3
callee:f f()
length:3
Symbol(symbol.iterator):f value()
__proto__:Object
复制代码
function forEach(array,fn){ // 遍历这个数组,并将值传递给fn,故fn必须接收两个参数(具体看文档)
for(let i=0; i<array.length;i++){
fn(array[i],i) //fn(value,key)
}
}
var a=['a','b','c']
a.forEach(function(value,key){ //此处value、key就是从a传递过来的参数
console.log(value,key)
})
结果:
a 0
b 1
c 2
undefined
注意:在JS中,a.forEach(fn)自动把数组a的每一个元素传递给fn。(利用this)
复制代码
一句话结论:a.forEach接收一个函数,这个函数必须接收三个参数,依次是a的value、key和a自己,且返回值是undefined。app
a=['fff','jjj','kkk']
a.forEach(function(b,c,d){
console.log(b,c,d)
})
结果:
fff 0 (3) ['fff','jjj','kkk']
jjj 1 (3) ['fff','jjj','kkk']
kkk 2 (3) ['fff','jjj','kkk']
复制代码
原理:a.sort接收一个函数,这个函数必须接收两个参数x、y,返回值有三种:
①a.sort(function(x,y){return x-y}) 此为从小到大排列
返回值>0, 表示前面数字大,要放后面。
返回值=0,表示两个数字位置相等。
返回值<0. 表示前面数字小,要放前面
②a.sort(function(x,y){return y-x}) 此为从大到小排列
同理,此处x-y变成y-x
实际应用中,可二者都试一试,哪一个结果是咱们想要的就用哪一个。
例子:
a = ['马云','马化腾','李彦宏'],按照财富值从大到小排列
hash = {
'马云':167,
'马化腾':376,
'李彦宏':228
}
a.sort(function(x,y){return hash[x] - hash[y]})
结果:['马云','李彦宏','马化腾'] // 这个结果是错的,因此x-y不行,改为y-x
a.sort(function(x,y){return hash[y] - hash[x]})
结果:'马化腾','李彦宏',['马云']
复制代码
实际使用sort排序时,要给一个谁大谁小的凭证,如例子中的hash,虽然a中是人名没法直接比较,可是咱们凭借hash排出了顺序,x-y不行就用y-x就行了。
3. a.join:在a的每一个元素之间插入参数函数
a=[1,2,3]
a.join(插入)
结果:"1插入2插入3"
经常使用于数组变字符串:a.join(,) 等价于 a + ''
复制代码
普通用法:
var a = [1,2,3]
var b = [4,5,6]
a.concat(b)
结果:[1,2,3,4,5,6]
特殊用法:复制一个数组,且复制的数组与原数组不相等
var a = [1,2,3]
var b = a.concat([])
a === b // false
var c = a
c == a // true
复制代码
a = [1,2,3]
a.forEach(function(){}) // >undefined
a.map(function(value,key){
return value * 2
}) // > [2,4,6]
转换为箭头函数:a.map(value => value*2)
复制代码
return的格式无限制,可根据实际需求写返回值的格式。
6. a.filter:filter是过滤的意思,根据return的条件筛选出元素并组成一个新的数组。网站
a = [1,2,3,4,5,6,7,8,9,10]
a.filter(function(value,key){
return value % 2 === 0 //除以2的余数为0,即偶数
})
结果:
[2,4,6,8,10]
filter与map连用:
a = [1,2,3,4,5,6,7,8,9,10]
a.filter(function(value,key){
return value % 2 === 0
}).map(function(value,key){ //[2,4,6,8,10].map...
return value * value
})
结果:
[4,16,36,64,100]
复制代码
a = [1,2,3]
a.reduce(function (sum,n){ // 求数组a的元素总和
return sum + n
},0)
此处function也必须接收两个值,一个是sum,一个是n;除function外还要接收一个初始值sum=0
转换为箭头函数:a.reduce((sum,n) => sum + n,0)
复制代码
a = [1,2,3] //每项元素乘2
a.reduce(function(arr,n){ //arr是上一次的数组,n是数组a的每一个元素
arr.push(n*2)
return arr
},[])
结果:
[2,4,6]
复制代码
a = [1,2,3,4,5,6,7,8,9,10] //找出偶数
a.reduce(function(arr,n){ //arr是上一次的数组,n是数组a的每一个元素
if(n % 2 === 0){
arr.push(n)
}
return arr
},[])
结果:
[2,4,6,8,10]
复制代码
Function.prototype{.call(),.bind(),.apply()}
用法:new Function ([[参数1,参数2,...,参数n],]函数体)
注:[..]内的内容为可选内容,无关紧要。
例如:var f = new Function('a','b','return a+b')
f(1,2)
=>3
ui
function f(){}
var f = new Function('x','y','x+y')
function f(x,y){
return x+y
}
f.name // 'f'
复制代码
var f
f = function (){
teturn
}
f.name // 'f'
复制代码
var f
f = function f2(x,y){ return x+y }
f.name // 'f2'
console.log(f2) // undefined 面试题
复制代码
var f = new Function('x','y','return x+y')
//括号内都是字符串,字符串之间能够拼接插入变量,好比n=1,'return x+'+n+'+y' === return x+1+y
f.name // "anonymous" (翻译:匿名的)
复制代码
var f = (x,y) => {
return x+y
}
① var sum = (x,y) => {return x+y}
② 若大括号内只有一句话,则可去掉大括号和return,即
var sum = (x,y) => x+y
③ 若小括号里只有一个参数,则可去掉小括号,即
var n2 = n => n*n
注:1. => 中间不能有空格
2. 复杂时,只须要加分号便可,JS里换行不换行没有意义。
复制代码
声明:为了学会后面的this,必定要学会硬核的函数调用方法,如图: this
function f(x,y){return x+y}
f.call(undefined, 1,2)
结果:3
复制代码
var a= 1 //若去除此句,则下方a=2则是声明并赋值
function f1(){
a = 2 // 此处是给全局的a赋值为3
f2.call()
console.log(a)
function f2(){
var a = 3
console.log(a)
}
}
f1.call()
console.log(a)
复制代码
看到代码,必定要先变量提高!变量提高!变量提高! 变形二:
var a= 1
function f1(){
f2.call()
console.log(a)
var a = 2
function f2(){
var a = 3
console.log(a)
}
}
f1.call()
console.log(a)
复制代码
拿到题,首先作变量提高!提高后结果为:
var a= 1
function f1(){
var a
function f2(){
var a = 3
console.log(a) // a === 3
}
f2.call()
console.log(a) // a === undefined 此处a已声明但未赋值,因此是undefined
a = 2
}
f1.call()
console.log(a) // a === 1
复制代码
var a= 1
function f1(){
console.log(a)
var a = 2
f2.call()
}
function f2(){
console.log(a) // a === 1 f2中没有a,找它的父做用域即全局做用域,找到a=1
}
f1.call()
console.log(a)
复制代码
var a = 1
function f1(){
console.log(a) //a === 1 ?
}
?????? // 这是一行被遮住的代码
f4.call()
复制代码
如题,若被遮住的代码是 a=2 ,那么f1中的a就是2了。