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

  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. UVA 1292 十二 Strategic game

    Strategic game Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Sta ...

  2. PHP clone

    PHP  clone     定义一个电视类 class Tv{public $width=100;public function setWidth($v){$this->width = $v; ...

  3. XSS防御篇

    上周要求写自己用任何语言写一个留言版,存到数据库中,用自己的办法来解决XSS 我用了JSP+MYSQL,自己写了一个过滤器来防御WEB XSS漏洞 package com.mess.filter; p ...

  4. [SAP ABAP开发技术总结]SD销售订单定价过程

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理

    上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...

  6. data-*属性——使用自定义属性的方式存储数据

    HTML5提供了data-*属性能存储页面或应用程序的私有自定义数据.只需在属性前加上data-前缀即可,值可以是任意字符串. 存储的(自定义)数据能够被页面的 JavaScript 中利用,以创建更 ...

  7. XP_版本

    1. Windows XP sp3 cd 和Windows XP sp3 cd vl的区别?VL的意思是大客户版,就是使用VL的KEY安装的系统是不需要激活的,不带VL的是安装完后需要激活的零售版 2 ...

  8. [转载] 理解 epoll 的事件触发机制

    原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Trigger ...

  9. [转载] 构建微服务:使用API Gateway

    原文: http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=206889381&idx=1&sn=478ccb35294c ...

  10. Web App时代的缓存机制新思路

    Web App常见架构 以WebQQ例,WebQQ这个站点的所有内容都是一个页面里面呈现的,我们看到的类似windows操作系统的框架,是它的顶级容器和框架,由AlloyOS的内核负责统筹和管理,然后 ...