参数对象类型转换

时间:2017-05-14 10:00:23

标签: javascript function

请说我是JavaScript世界的初学者,我对以下简单示例提出了一个问题,

function myFun(){
    return arguments;
}

var myVar=myFun("a","b","c"); 

//1
console.log(myVar); //=>//["a", "b", "c", callee: function, Symbol(Symbol.iterator): function]

//2
for(m in myVar){
    console.log(m); //will generate only the realistic arguments "a","b","c".
}

根据上面的片段, 为什么第一次调用使用Function主对象中的继承属性生成arguments对象,第二次调用只生成实际参数。

如果我们将arguments对象传递给第二个函数,为什么它只能与实际数据一起传递,例如

function foo(something) {
console.log(something); ///=>this will generate number 3 as parameter only, not the rest of the object
 return this.a + something;
}
var obj = {
 a: 2
};
var bar = function() {
 return foo.apply( obj, arguments );
};
var b = bar( 3 ); // 2 3

如console.log(某事)一行中指出的那样,它只会生成真实的参数

2 个答案:

答案 0 :(得分:1)

as @ibrahim mahrir评论和本文this 我发现,apply会将对象强制转换为数组,这是一个例子,

  function toArray(args) {
    return Array.prototype.slice.call(args);
}

function firstFun(){
   console.log(toArray(arguments));
}
firstFun("A","b");

///这将相等,第二个提供问题本身的例子, 谢谢@ibrahim,正确答案属于他。

答案 1 :(得分:1)

下一个例子中的错误是有趣的:

function foo() { }

foo.apply(null, 5);

错误说(在谷歌浏览器上):

  在非对象上调用

CreateListFromArrayLike

显然apply在将参数传递给函数之前先调用该函数,CreateListFromArrayLike将从提供的对象(或数组)中创建一个新的对象(或数组),忽略任何非类数组的属性。这个过程。

注意:在Mozilla Firefox上,它会引发不同的错误,但我认为两种浏览器的引擎都采用相同的方式实现apply