Array --数组
数组a和obj都是一个对象,不同之处是他们的共有属性不同,数组之所以是数组,因为他有数组的特点js中什么是数组?
i. 用array构造出来的对象就是数组。
ii.它与Object的区别是:array是用array构造出来的对象,它的共有属性是是由array构造的,它的共有属性也是一个简单的对象,它也有下划线proto,并且指向Object根;Object是用Object构造出来的对象,他的下划线proto直接指向Object根,他们都是对象,不同的是原型链不一样。
数组之所以是数组我们把它当数组,下图中,同一个数组,不同是遍历方式就出现了不一样的结果,for循环遍历,是i++,所以xxx,yyy遍历不到。对象遍历结果就出来了。所以说数值之所以是数组是我们把它当数组来遍历了。
数组方式遍历
对象方式遍历
- Arrar数组是一种特殊的对象,当我们声明一个数组的时候 a=[1,2,3]; 其实就是声明了一个对象,这个对象的
length:3,keys = ['0':1,'1':2,'2':3]
。 -
如果声明一个数组只有length,keys,为什么我们可以a.fush?这是因为它也有自己的共有属性,下划线proto指向这个共有属性,共有属性有push。这就是js强大之处,因为共有属性的存在,它可以用很小的体积获取更多的功能。
深度截图_选择区域_20180311171923.png
深度截图_选择区域_20180311172918.png
深度截图_选择区域_20180311194939.png
深度截图_选择区域_20180311195017.png
深度截图_选择区域_20180311195131.png
深度截图_选择区域_20180311195326.png
-
伪数组
你的原型链(proto)中,没有Array prootype(数组共有属性)
现在所接触到的伪数组,arguments
,下边proto直接指向Object根protoType。
//用法,dir打印可以打印出层级结构
> function f () {
console.dir(arguments)
}
> f(1,2,3)
// Arguments(3)
_proto_
深度截图_选择区域_20180311203017.png
- 数组常用的API
//诠释下边代码
function forEach(array,x){ //forEach接收了一个数组array和一个函数x
for(let i = ; i < array.length; i++){ //遍历数组array
x(array[i},i) //执行函数x,并接收两个参数,一个是数组的value,一个是数组的key
}
}
forEach(['a','b','c'],function(value,key){ //forEach传入一个数组,一个函数,函数的参数一个是数组的value,一个是数组的key
console.log(value,key) //打印出value和key
}
// a 0
// b 1
// c 2
**********************************************************************************************
var a = ['a','b','c'];
a.forEach(function(x,y){ //a.forEach,遍历数组a,接收调用这个函数,函数的参数x对应遍历数组结果的value,参数y对应遍历数组结果的key
console,log(value,key)
}
深度截图_选择区域_20180321152151.png
-
y()和y.call()表示执行(调用)这个函数
y()和y.call()表示执行(调用)这个函数
接收并执行这个函数,同时传参数给另一个函数
声明一个函数,forEach一个数组和一个函数x,遍历这个数组,执行函数的同时同时传两个参数,一个是数组的value,一个是key。forEach定义这个数字的value,执行函数x,打印出函数的value和key(同时传的两个参数),因为数组有3个value,遍历a的时候调用下x,两个值是 (a,0),遍历到b的时候再调用x…
深度截图_选择区域_20180312004509.png
-
a.forEach(function(){}),a.forEach接收了两个参数,一个是隐藏的a,一个函数,函数必须接收2-3个参数,第一个一定是value,第二个一定是key,下边的是a本身
下边图中高亮代码中a.forEach是在遍历数组a,这个函数并没有传入参数,这个函数怎么拿到的数组a呢?因为其实传了两个参数,其中隐含的就是this这个参数。a.forEach我们可以理解其实是传了两个参数,a.forEach(function(){}
) ===a.forEach.call(a,function(){})
点之前的都会被传入,点前的数组a就是这样被传入的,并且是用this获取的。我们可以自己造一个forEach,this是指Obj。总结来说a.faEach可以通过this把数组a传入。下边图示:
a.forEach
深度截图_选择区域_20180312114815.png
我们调用这个函数,forEach一个函数就是x,x参数必须是value和key,x(this[i],i)已经确定是一个value和一个key了
深度截图_选择区域_20180312115203.png
a=['aaa','bbb','ccc']; //声明一个数组
a.forEach(function(x,y){ //faEach一个函数,必须有两个或三个值,a.forEach(遍历传入了a数组),x一定是value,y一定是key
console.log(x.y) //打印出value key
})
// aaa 0
// bbb 1
// ccc 2
网友评论