pfan123/Articles

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)

JavaScript 的怪癖 8:“类数组对象”
如何理解和熟练运用js中的call及apply?