Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vue2.0 render函数介绍中 Array.apply(null, { length: 20 }) 引起思考 #2

Open
pfan123 opened this issue Apr 27, 2017 · 0 comments
Labels

Comments

@pfan123
Copy link
Owner

pfan123 commented Apr 27, 2017

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?

@pfan123 pfan123 added the web label Apr 27, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant