这篇文章主要介绍了JS中使用Array函数shift和pop创建可忽略参数的例子,这是一种比较高级的应用,需要的朋友可以参考下

在 JS Array 中支持两个方法,shift() 和 pop(),分别是指从一个数据中的最前面和最后面删除一个值,并返删除值。看一个示例就明白了:


var arr = ['s','o','f','i','s','h'];

arr.shift(); // 返回 's'
arr; // 目前是 ['o','f','i','s','h']
arr.pop() // 返回 'h'
arr // 目前是 ['o','f','i','s']


在很多 JS 框架中可以很常见的是,一个方法提供你传几个参数,而这些参数中,部分是可以忽略的,这些可以忽略的点可能是第一个,也可能是最后一个。传统的写法是判断参数有没有存在,或者参数的个数来决定最终取值。

这里,我们可以利用函数的 arguments 对象,以及 Array 中的 shift 和 pop 来实现灵活的应用。

一、使用 shift
如何实现一个 .bind() 方法,让 fn api 如下:


// fn 的作用域限定于 object 下
// 除 object 外,所有 bind 方法的参数都将传给 fn
fn.bind(object, param1, param2, [, paramN]);

看一个实例先。当然,这例子可能更为重要的是 call和 apply 的应用。不过,我们想要说的是 shift 的应用:

// 来自 Prototype.js 的 [`.bind`](http://www.prototypejs.org/api/function/bind) 方法
Function.prototype.bind = function(){
  var fn = this,
  args = Array.prototype.slice.call(arguments),
  object = args.shift();
  return function(){
  return fn.apply(object,
  args.concat(Array.prototype.slice.call(arguments)));
  };
};

我们可以利用对 arguments 对象(array-like object,需要转换成真正的 array)进行 shift 来取出,像这个方法,主要利用它们来分出作为作用域的 object,然后巧妙地把余下的参数数组传给 fn,即调用我们想限定到 object 作用域内的函数。

二、使用 pop
最近在试用 seajs,我们就拿它的一个 api 来说吧:


define(id, dependencies, callback)

这个定义一个模块的 api,id 和 dependencies 都是可以省略的。这里,如何实现这个支持呢?如果使用 if 来判断,真就得 if (arguments === 1) {...} elseif ... 一大堆了。当然,这样有时候也有好处的(?,想想)。这里,我们可能用来 pop 来方便实现这样的支持:

var define = function(){
  // 取出这个 callback
  var args = [].slice.call(arguments)
  fn = args.pop();
  // 做点其他神马事
  fn.apply(null, args)
  // ...
  },
  callback = function(){
  var args = arguments, i = 0, len = args.length;
  if(len === 0) console.log('只有一个 callback');
  for(;i<len;i++) {
  console.log(args[i]);
  }
  }

// 看看他们三个的执行结果
define(callback);
define('有两个参数', callback);
define('有三个参数', 'hello world', callback);


前两天和同事除到一些 JS 中的时引用的一个东西。虽然总叫自己不要太沉浸于代码中,但代码,不仅仅是 JS,总是给我们太多。如何不喜欢。哈哈。

最新资讯
回力棒效应:从黑洞逃逸的光线会再次被拉回黑洞

回力棒效应:从黑洞逃逸

几十年以来,科学家一直怀疑从黑洞周围逃逸的光线会像回
一颗流浪恒星能将地球踢出太阳系吗?

一颗流浪恒星能将地球

宇宙环境是非常危险的,任何行星潜在的生命都将面临无处
首个1000万粉UP主诞生,对B站来说意味着什么?|观潮

首个1000万粉UP主诞生

B站的发展速度有目共睹,老番茄是第一个,未来必然会出现
疫情期Zoom成当红炸子鸡 李嘉诚早期投资已翻数十倍

疫情期Zoom成当红炸子

李嘉诚过去通过在房地产和基础设施建设领域的投资构建
喜茶会成为下一个瑞幸吗?仍有商业逻辑问题待解

喜茶会成为下一个瑞幸

目前看来,喜茶具备了一个连锁餐饮品牌健康发展的基本商
瑞幸咖啡造假后,无论哪个中国公司看起来都像骗子

瑞幸咖啡造假后,无论哪

从瑞幸咖啡到跟谁学再到爱奇艺,不管在海外上市的中国公
最新文章
Vue实现图片与文字混输效果

Vue实现图片与文字混

用多了 JQuery ,习惯了使用JQuery的API操作 DOM ,几乎忘
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)

Vue实现点击当前元素

这篇文章主要介绍了Vue实现点击当前元素以外的地方隐
Vue实现验证码功能

Vue实现验证码功能

这篇文章主要为大家详细介绍了Vue实现验证码功能,文中
JS实现的雪花飘落特效示例

JS实现的雪花飘落特效

这篇文章主要介绍了JS实现的雪花飘落特效,结合实例形
微信小程序实现图片压缩

微信小程序实现图片压

这篇文章主要为大家详细介绍了微信小程序实现图片压缩
JavaScript实现京东放大镜效果

JavaScript实现京东放

这篇文章主要为大家详细介绍了JavaScript实现京东放大