奇妙JS代码系列(二)call,apply,bind用处整理

延续系列一:链接,此次主要整理JS里面很常见的三个函数call,apply,bind的妙用。(apply和call差不多,只是参数的区别)(下面有些这三个可能只是辅助,但是只要用到,我就在这里整理)

1.类型检测

上一篇最后一个已经讲到,Object.prototype.toString.call()。犹豫上一篇说了,这里就不多说了。

2.解参,等同于ES6中的...扩展运算符

es6中提出了一种很方便解构字符串数组的运算符,这提供了一种简便机制,可以将任何部署了 Iterator 接口的数据结构,转为数组。只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。

但是在es5,我们使用Function.prototype.apply(null,数组名),

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction.apply(null, args);

es6:

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);

3.转换伪数组

伪数组的定义:

  1. 具有length属性
  2. 按索引方式存储数据
  3. 不具有数组的push,pop等方法 如
  • function内的arguments
  • document.forms,Form.elements,Select.options,document.getElementsByName() ,document.getElementsByTagName(),childNodes/children 等方式获取的集合(HTMLCollection,NodeList)等。
  • 特殊写法的对象 :
var obj={};
obj[0] = "1";
obj[1] = "2";
obj[2] = "3";
obj.length = 3; 

但是从本质上来分辨伪数组的话:
如果一个数组的 proto 直接或间接指向 Array.prototye(用到了数组的共用属性),那么就是真数组
如果一个数组的 proto 没有直接或间接指向 Array.prototye,那么就是伪数组。

将伪数组转换成数组的方式:

Array.prototype.slice.call(obj,0); 

使用Array的原型对象中的的方法slice(),用Function.prototype.call传入。

原文地址:https://www.cnblogs.com/zhangmingzhao/p/8451986.html

时间: 2024-08-28 04:23:34

奇妙JS代码系列(二)call,apply,bind用处整理的相关文章

奇妙JS代码系列(三)一道有趣的题(创建一个长度为x数组)

原题描述: 不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标 这个问题的一些变种例如给一个长度length和value,返回长度为length值全为value的数组等. 误区 最容易掉入陷阱的: var arr = new Array(100); arr = arr.map(function(item, index) { return index; }); 如果你的答案是这个,恭喜你成功掉入出题人的坑了. 解释 坑在Array(100),可以看看MDN的规范, new

Discuz common.js代码注释(二)

//获取浏览器版本号 function browserVersion(types) { var other = 1; //默认版本号 for (i in types) { //遍历types var v = types[i] ? types[i] : i; if (USERAGENT.indexOf(v) != -1) { //USERAGENT:浏览器请求头的User-Agent属性 var re = new RegExp(v + '(\\/|\\s|:)([\\d\\.]+)', 'ig')

JS中的call、apply、bind方法

JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj.

理解JS中的call、apply、bind方法

理解JS中的call.apply.bind方法(*****************************************************************) 在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:apply . call .bind 三者都是用来改变函数的this对象的指向的:apply . call .bind 三者

【转】JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己一人独享,没办法,谁让博主这么爱分享呢~~ 本文原创地址:http://www.cnblogs.com/landeanfen/p/5603790.html 七.多值输入组件manifest 关于文本框的多值输入,一直是一个比较常见的需求,今天博主推荐一款好用的多值输入组件给大家,不要谢我,请叫我“红

JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)

前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就觉得应该快点完成下篇,要不然有点标题党的感觉,思及此,博主心有不安,于是加班赶出了下篇.如果你也打算用ko去做项目,且看看吧! 一.效果预览 其实也没啥效果,就是简单的增删改查,重点还是在代码上面,使用ko能够大量节省界面DOM数据绑定的操作.下面是整个整个增删改查逻辑的js代码: 页面效果: 二.

js中的call,apply,bind区别

在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:apply . call .bind 三者都是用来改变函数的this对象的指向的:apply . call .bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文(函数的每次调用都会拥有一个特殊值--本次调用的上下文(context)--这就是this关键字的值.):apply . ca

js 代码密码规范系列

在微博上看到一个段子 "老子哪天出任ceo迎娶白富美走上人生巅峰之后,一定要雇两个长腿大熊的妹子.一个帮我想变量名字,一个帮我想git commit的message!" 可以看出 命名方方面面的问题困扰着我这样的人.哈哈哈 函数命名.变量命名等 是频繁困扰我的问题. 函数命名:统一使用动词或者动词+名词形式 ---- fnInit() 如果有内部函数则"_"开头   _fnInit(). 对象方法命名使用fn+对象类名+动词+名词形式   fnAnimateDoRu

js学习总结----call和apply和bind的区别

apply和call的方法是一模一样的,都是用来改变方法的this关键字,并且把方法执行:而且在严格模式和非严格模式下对于第一个参数是null/undefined这种情况的规律是一样的: bind:这个方法在IE6-8下不兼容 ->和call和apply类似都是用来改变this关键字的 'use strict' //告诉当前浏览器接下来的js代码将按照严格模式进行编写 var obj = {name:'张三'} function fn(num1,num2){ console.log(num1+n