当函数以 apply 方式调用时, 传参方式是一个由各个参数组成的数组或类数组(一个有length属性的对象),传入参数个数取决于 length 的值,例如,某个对象 args.length=3; apply 会将 args[0],args[1],args[2] 三个参数传入,如果对应的值不存在则传入了undefined.

例如:

function f(a,b,c){ console.log(a,b,c);}
f.apply(null,{0:123,1:456,2:789,length:2});//123 456 undefined ,因为 length 属性值为2,值只传入了 2 个参数
f.apply(null,{10:123,11:456,12:789,length:3});// undefined undefined undefined , 因为参数对象不存在以 0、1、2 为 key 的值

但是,在IE8 及低于IE8以下的浏览器需要注意几个问题.

1、 apply 传参不接受类似 {0:'a',1:'b',length:2} 的对象,可以是 数组、arguments、  HTMLCollection 对象 和 Nodelist 对象等节点集合.

在这种情况下你也许想要把传参对象转换成数组.

2、节点集合无法调用数组的原型方法,但是 类似 {0:'a',1:'b',length:2} 的对象可以。

var nodes = document.getElementsByTagName("div");
var obj = {0:1,1:2,2:3,length:3}; var args = Array.prototype.slice.apply(nodes,[0]); //error,"Array.prototype.slice: 'this' 不是 JavaScript 对象",节点集合无法调用数组原型的方法
var args = Array.prototype.slice.apply(obj,[0]); //ok var args = Array.prototype.concat.apply([],nodes); //ok
var args = Array.prototype.concat.apply([],obj); //error,"Function.prototype.apply: 缺少 Array 或 arguments 对象",普通对象无法用于 apply 传参

综合以上,可以使用 try-catch

var nodes = document.getElementsByTagName("div");
var obj = {0:1,1:2,2:3,length:3};
var params = nodes;//try nodes and obj
try{
var args = Array.prototype.slice.apply(params ,[0]);
}catch(err){
var args = Array.prototype.concat.apply([],params);
} console.log(args);

另外,也许有这样的:

var args = Array.apply([],params);//应使用,Array.prototype.concat.apply([],params)
var obj = {0:3,length:1};
var args = Array.apply([],obj); //在 obj[0] 符合数组 length 取值范围时,将得到长度为3 的空数组而不是 [3],这种情况比较容易疏忽 args.length ;//3 ( obj[0]<Math.pow(2,32)-1)

关于 concat :

数组的 concat 方法 可以被任何对象调用,得到一个数组,但是, 如果调用者不是 数组, 那么 调用者本身 仅仅作为 结果数组的第一个元素

function f(a,b){
  var args = [].concat.apply(arguments,[111,222,333]);
  console.log(args);
  console.log(args.length);
  console.log(args[0]);
}
 
f("x","y")
 
//执行结果
[Arguments[2], 111, 222, 333]
4
["x", "y"]

数组原型方法调用及函数apply调用时 类数组参数在IE8下的问题的更多相关文章

  1. javascript数组原型方法

    1.javascript数组原型方法. <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  2. Javascript数组原型方法大全以及实例!!

    数组的方法有数组原型方法,也有从object对象继承来的方法,这里我们只介绍数组的原型方法,数组原型方法主要有以下这些: join() push()和pop() shift() 和 unshift() ...

  3. array_reduce方法用回调函数迭代地将对数组的值进行操作

    在处理php数组的时候,有一种需求特别的频繁,如下二维数组: $arr = array( 1=>array( 'id' => 5, 'name' => '张三' ), 2=>a ...

  4. c++与js脚本交互,C++调用JS函数/JS调用C++函数

    <!DOCTYPE html> <html> <body> <h1>我的第一段 JavaScript</h1> <p> Java ...

  5. c++与js脚本交互,C++调用JS函数JS调用C++函数

    一.javascript调用c++,方法有两种 方案1: 1.html编写 <html><head></head><body><h1>TES ...

  6. 求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组

    求数组的最小值和最大值 //求数组当中最大值和最小值 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; //第一种方法 根据排序方法来求最大值和最小值 ...

  7. 数组的方法 Array.map();Array.every()和Array.some();数组的indexof();检测是否是数组isArray(obj);

    数组的方法 Array.map(); 栗子: var a=[1,2,,3]; var b=a.map( function(value){return value*value} ); alert(b); ...

  8. call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

    <?php function foobar($arg, $arg2) { echo __FUNCTION__, " got $arg and $arg2\n"; } clas ...

  9. JavaScript中函数引用调用和函数直接调用的区别

    首先看下面的代码: var x = 1 var f1 = function( f ) { var x = 2 ; f( ' console.log( x ) ' ) } var f2 =  funct ...

随机推荐

  1. 从getwebshell到绕过安全狗云锁提权再到利用matasploit进服务器

    本文作者:i春秋签约作家——酷帥王子 一. 利用getwebshell篇 首先对目标站进行扫描,发现是asp的,直接扫出网站后台和默认数据库,下载解密登陆如图: 下面进后台发现有fckeditor,而 ...

  2. 爬虫常用库之pyquery 库

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,我个人写过的一些抓取网页数据的脚本就是用它来解析html获取数据的.他的官方文档地址是:http://packages. ...

  3. 数据结构---平衡查找树之B树和B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...

  4. rabbitmq系列一 之简单队列

    1. rabbitmq简介 rabbitmq是一个消息代理,或者讲是一个消息中间件.主要是用来接收和转发信息的,它是对消息不做任何处理的.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写 ...

  5. Centos7下安装zabbix 3.0.19

    参考网站: https://www.cnblogs.com/xiewenming/p/7732144.html https://www.cnblogs.com/clsn/p/7885990.html  ...

  6. HashMap、HashSet、LinkedHashSet、TreeSet的关系

    类图及说明如下:

  7. Java之集合(六)PriorityQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7299233.html 1.前言 本章介绍队列中的PriorityQueue--优先队列,顾名思义,这是一个可以指 ...

  8. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  9. 关于C++中操作符重载的疑问 :四个运算符=, -&gt;, [], ()不可以重载为全局函数(友员函数)

    转载自:http://blog.csdn.net/u014610226/article/details/47679323     以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需 ...

  10. glide 解决 golang.org/x/net 等依赖包无法获取

    知道glide有设置镜像功能,可以把某个依赖包的源地址切换为另一个地址,相当于切换到镜像地址,用于某些依赖包被墙的原因 之前碰到 golang.org/x/net,设置镜像: glide mirror ...