vue2.0 render函数介绍中 Array.apply(null, { length: 20 }) 引起思考
pfan123 opened this issue · 0 comments
Function.prototype.apply()
apply() 方法在指定 this 值和参数(参数以数组或类数组对象的形式存在)
的情况下调用某个函数。
注意:该函数的语法与 call() 方法的语法几乎完全相同,唯一的区别在于,call()方法接受的是一个参数列表,而 apply()方法接受的是一个包含多个参数的数组(或类数组对象)。
语法
fun.apply(thisArg[, argsArray])
参数
thisArg
在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
function fun() {
alert(this);
}
//非严格模式下
fun.call(null); // window or global
fun.call(undefined); // window or global
ES5严格模式(ie6/7/8/9除外)则不再揣测,给call/apply传入的任何参数不再转换:
'use strict'
function fun() {
alert(this);
}
fun.call(null) // null
fun.call(undefined) // undefined
argsArray
一个数组或者类数组对象
,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。
ps: 类似 Array.call()、Array.slice.call()却别,Array.call()是执行Array构造函数, Array.slice.call()执行Array对象的slice方法
类数组
一个类数组对象:
具有:指向对象元素的数字索引下标以及 length 属性告诉我们对象的元素个数
不具有:诸如 push 、 forEach 以及 indexOf 等数组对象具有的方法
ps:这是我参考的定义,实际上,只要有length属性,且它的属性值为number类型就行了。请围观评论。
类数组示例:
DOM方法 document.getElementsByClassName()
var a = {'1':'gg','2':'love','4':'meimei',length:5};
Array.prototype.join.call(a,'+');//'+gg+love++meimei'
非类数组示例:
var c = {'1':2};
没有length属性,所以就不是类数组。
javascript中常见的类数组有arguments对象和DOM方法的返回结果。
比如 document.getElementsByTagName()。
类数组判断
function isArrayLike(o) {
if (o &&
typeof o === 'object' &&
isFinite(o.length) &&
o.length >= 0 &&
o.length===Math.floor(o.length) &&
o.length < 4294967296)
return true;
else
return false;
}
类数组对象转化为数组
Array.prototype.slice.call(arguments)