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

  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. Zabbix监控交换机设置

    说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对交换机进行监控. 具体操作: 以下操作在被监控的交换机上进行,这里以Cisco交换机为例. 一.登录到Cisco交换机,开启snmp ...

  2. 【leetcode❤python】 88. Merge Sorted Array

    #-*- coding: UTF-8 -*-class Solution(object):    def merge(self, nums1, m, nums2, n):        "& ...

  3. Eclipse中没有andriod问题解决方法

    按照网上教程<andriod+环境搭建_图文版>进行安装android,结果,在eclipse中window->preference下找不到"Android"选项 ...

  4. struts2--表单标签

    struts2的表单标签可分为两类:form标签本身和包装HTML表单元素的其他标签.form标签本身的行为不同于它内部的元素. struts2表单标签包括: form.textfield.passw ...

  5. CSRF的防御实例(PHP)

    CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行. 1.服务端进行CSRF防御 服务端的CSRF方式方法很多样,但总的思想都是一致 ...

  6. 深度信任网络的快速学习算法(Hinton的论文)

    也没啥原创,就是在学习深度学习的过程中丰富一下我的博客,嘿嘿. 不喜勿喷! Hinton是深度学习方面的大牛,跟着大牛走一般不会错吧-- 来源:A fast learning algorithm fo ...

  7. SQL语句最基本的性能优化方法

    有些人还不知道sql语句的基本性能优化方法,在此我简单提醒一下,最基本的优化方法:   1.检查是否缺少索引.调试的时候开启“包括实际的执行计划”   执行后会显示缺少的索引,   然后让dba帮助添 ...

  8. HDU 5831 Rikka with Parenthesis II(六花与括号II)

    31 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  9. 常见的PC端和移动端表单组件

    http://files.cnblogs.com/samwu/PC%E7%AB%AF%E5%89%8D%E7%AB%AF%E4%BA%A4%E4%BA%92%E7%BB%84%E4%BB%B6.rar

  10. POJ 1321棋盘问题

    题意: 给定一个n*n(n<=8)的棋盘, 有些地方能放棋子, 有些不能. 放m个棋子, 求能使这m个棋子不同行且不同列的方案数. 分析: 用一个一维数组标记行和列, 深搜一下. #includ ...