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

  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. C语言第2天基本运算

    getchar 一.首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main( ) {      ...

  2. HTML DOM事件

    HTML DOM事件 1.HTML事件包括: (1)当用户点击鼠标时: (2)当页面已加载时: (3)当图像已加载时: (4)当鼠标移动到元素上时: (5)当输入字段被改变时: (6)当提交HTML表 ...

  3. C#实例

    输出 Console.WriteLine("Hello, World!"); //输出Hello, World! 输出输入的内容 string strName; //声明一个str ...

  4. jquery 之height(),innerHeight(),outerHeight()方法区别详解

    在jQuery中,获取元素高度的函数有3个,它们分别是height(). innerHeight().outerHeight(). 与此相对应的是,获取元素宽度的函数也有3个,它们分别是width() ...

  5. Beaglebone Black 和树莓派

    我不是创客.我买了个 Beaglebone Black 来玩,主要是拿来学习. 入手前,看过好几个树莓派 (Raspi - 2 Model B)和 Beaglebone Black (BBB) 比较, ...

  6. hdu 1800 (map)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1800 Flying to the Mars Time Limit: 5000/1000 MS (Java/ ...

  7. 测试框架Mockito使用笔记

    Mockito,测试框架,语法简单,功能强大! 静态.私有.构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito. ...

  8. CSS笔记(五)字体

    CSS 字体属性定义文本的字体系列.大小.加粗.风格(如斜体)和变形(如小型大写字母). 参考:http://www.w3school.com.cn/css/css_font.asp CSS字体系列 ...

  9. lotusscript基本语法

    LotusScript是一种使用于Lotus Notes客户端程序或者是用于Domino服务器程序代理列表中的脚本语言.相当于用于网页中的脚本语言JavaScript.(JavaScript以可以用于 ...

  10. elcipse 中利用maven创建web工程

    如何创建: http://huxiaoheihei.iteye.com/blog/1766986 遇到的问题: 1: 如果spring MVC配置了 <servlet> <servl ...