看一些源码的时候常常发现例如这些的代码

  Array.prototype.slice.call(arg)

  Object.prototype.toString.call(str)

等等 ,着一些系列的句子,当时的我内心是这样的

问题总是要解决的,各种百度  有木有

最后在网上看到一个大牛的博客,他这样写到

     var fun=function () {
console.log(this); //String {0: "m", 1: "e", 2: "n", 3: "g", length: 4, [[PrimitiveValue]]: "meng"}
console.log(this instanceof String); //true
};
fun.call("meng");

这段代码执行方式不难看出,就是this指向了字符串"meng"。

注意这里,我并没有说把"meng"传入到到了方法fun中

在看如下代码

    var fun=function (value) {
console.log(value); //undefined
};
fun.call("meng");

返回的结果是undefined,也就是说,只是指向了,并没有“处理”参数,其实想想call的用法,它也该如此。。

好了,基础演戏看完了,各位看官想必也明白了,最后再看下代码的执行效果吧

     var obj = {length: 2, 0: "first", 1: "two"};
var result = Array.prototype.slice.call(obj);
console.log(result); //["first", "two"]
result = Object.prototype.toString.call(obj);
console.log(result); //[object Object]

当然也可这样写Array.prototype.slice.call(arg,n)表示从第n项开始截取

这里在补充网上的一种说法:

  slice()方法没有参数的话,会从0开始剪切到最后。

  所以上面的代码可以这样理解,代码从0剪切到1,结果生成数组,对应的结果就如上了。。

  其实这样说的前提是,你得理解slice内部的方法实现。

最最最终奥义:Object.protype.Fun.call(n,m)这种结构,

  对n执行Fun(m)。

  m不存在,执行Fun默认方法。


思维扩展下,Array.prototype.slice.call(arg)其实可以这样用(临时想到的,感觉可以)

如网上一些数据的解析方式是这样的

用的0,1,2....等数字做的属性名(前两天从php后天获取的数据也是如此),今天学到这个方法后是不是可以这样处理一下

     var con1=document.querySelector(".con1");
var result=window.getComputedStyle(con1);
console.log(Array.prototype.slice.call(result[3]).join(""));

当然你也可以这样处理

     var con1=document.querySelector(".con1");
var result=window.getComputedStyle(con1);
console.log(result[3]);

返回的结果是一样的

上面的哪一种看着显然麻烦,这里提到主要有两点原因

  1,深刻理解下.call()方法

  2,为解决问题多一种思路

刚刚又从网上看到了个它的用处

js arguments类型像数组但不是数组,所以也就有了,把arguments转换成数组的方法(插件用它的意义也在于此)

随机推荐

  1. JLINK仿真器与ST-LINK仿真器的安装与配置.pdf

    JLINK仿真器与ST-LINK仿真器的安装与配置.pdf 工欲善其事,......stm32的开发环境搭建 观看地址  说到仿真器,首先要了解一下JTAG. JTAG协议 JTAG(Joint Te ...

  2. Struts2的输入校验(2)——客户端校验

    Struts2的输入校验(2) --客户端校验 Struts2客户端校验的使用: (1)使用Struts2的标签生成输入页面的表单: (2)为该<s:form>元素添加validate=& ...

  3. 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)

    在做结构体向字节数组转换的时候,常遇到"传递给系统调用的数据区域太小"的错误,究其原因是因为英文与汉字的编码方式不同,一个汉字等于两个字节,而一个英文字母等于1个字节.所以,对于如 ...

  4. 关于打开MTK_SDCARD_SWAP 宏后MTK目前升级方案和 关于打开MTK_SHARED_SDCARD宏后MTK目前升级方案

    如果设置宏MTK_SDCARD_SWAP=yes:默认是优先从外卡获取升级包,外卡没有包,才会去内卡获取!   1.插入外卡,升级包update.zip放入外卡,升级可以成功!   2.插入外卡,升级 ...

  5. 2012 #5 Gold miner

    Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 用ubuntu下载电影:磁力链接,torrent,迅雷链接

    用ubuntu下载电影:磁力链接,torrent,迅雷链接 操作系统:Ubuntu 14.04 64位 需要软件:Ktorent, Amule 安装软件: sudo apt-get install k ...

  7. sql语句查询出表里符合条件的第二条记录的方法

    创建用到的表的SQL CREATE TABLE [dbo].[emp_pay]( [employeeID] [int] NOT NULL, [base_pay] [money] NOT NULL, [ ...

  8. poj 1265 Area (Pick定理+求面积)

    链接:http://poj.org/problem?id=1265 Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  9. Webbrowser控件判断网页加载完毕的简单方法 (转)

    摘自:http://blog.csdn.net/cometnet/article/details/5261192 一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,W ...

  10. lazyload懒加载的使用

    1.引用<script src="http://a.tbcdn.cn/apps/baron/js/??lib/tmm/tmm.js,lib/lazyload/lazyload.js?2 ...