原文: http://www.cnblogs.com/idche/archive/2012/03/17/2403894.html

Array.prototype.push

push向数组尾部添加一项并更新length ,返回数组长度。

如果Object使用push会怎样?

看下面代码, obj好像数组一样工作了。length会自动更新。

var push = Array.prototype.push;
var obj = {};
push.call(obj, "hello"); // 返回值 1
// obj {"0":"hello", length:0}
push.call(obj, "world"); // 返回值 2
// obj {"0":"hello", "1":"world",length:2}

Array.prototype.length  Array.prototype.splice

把length和splice 给Object

看下面代码:obj这货居然变成数组了?其实不然这可能是调试工具的一些输出检查问题。
我们用 instanceof 测试  obj instanceof Array //false

var obj = {
length:0,
splice:Array.prototype.splice
};
console.log( obj ); // 打印:[]

继续看下面的代码:

obj.push(0)//返回obj.length  1
obj.push(1)//返回obj.length 2
obj.splice(0, 1);//删除第一项 返回删除项[0]
obj.length // 1 splice删除一项的时候同样更新 length属性

这样obj的表现几乎和array一样了。不出意外slice,pop,shift,unshift什么的都可以正常工作在object中。

不过如果直接设置length,在数组中会删除大于length的下表的项, 但里的obj并不不会更新。

应用在哪?
jQuery对象表现像一个array,其实他是一个对象。这种对象如何new出来呢?
实际jQuery把Array的方法借给Object,从而达到这个jQuery对象的效果,jQuery对象内部也直接使用push等Array的方法。

看看jQuery的部分源码 (注意加粗)

// Start with an empty selector
selector: "", // The current version of jQuery being used
jquery: "1.7.1", // The default length of a jQuery object is 0
length: 0,
...... // For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: push,
sort: [].sort,
splice: [].splice

如果你要把Object玩成Array,那么可能潜在的问题length属性不会和“数组”项总和对应起来。

所以直接使用length设置长度不会得到支持。

看下面jquery代码,虽然length更新了,jquery的对象并没更新。(当然这并不是jquery的问题)

var jq = $('div') //假设我们在页面获取了40个div
jq.length // 40
jq.length = 0;
jq// ? jq中仍然存放了40个dom对象 length属性不会和“数组”项总和对应起来。

Object使用array的方法还能正常工作,实在有些意想不到,可能实际应用远不止这些。

最新文章

  1. 中继器、集线器(HUB)、网桥、交换机、路由器比较
  2. NSCalenda日历类
  3. vim常用命令汇总
  4. 在matlab中将处理结果输出为shp文件
  5. 【转】NGUI创建UIRoot后报NullReferenceException的解决办法
  6. springMVC整合spring和hibernate4(适合于框架的搭建)
  7. hibernate设置mysql的timestamp默认值技巧
  8. struts2 Action 接收参数的三种方法
  9. Linux IP代理筛选系统(shell+proxy)
  10. flex弹性布局学习
  11. Centos7下安装和配置vim
  12. asp:GridView控件使用FindControl方法获取控件的问题
  13. PS换脸操作
  14. CSS3效果:5种预载动画效果
  15. word图文混排复制到UEditor图片不显示
  16. 如何快速学会android的四大基础----Service篇
  17. React 设计思想
  18. [转]JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
  19. Python安装selenium,配置火狐浏览器环境
  20. Splay普及版

热门文章

  1. css--多重样式
  2. delphi怎么实现全选的功能
  3. 手机下的ev.pageX无效
  4. Java Timer及TimerTarsk(摘自网络)
  5. swift中JSon数据的处理
  6. 【开发笔记】java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
  7. sql语句的group by与having子句
  8. HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
  9. c语言_代码段_快说你是猪
  10. ReactiveCocoa总结