Javascript数组中push方法用法分析


Posted in Javascript onOctober 31, 2016

本文实例讲述了Javascript数组中push方法用法。分享给大家供大家参考,具体如下:

看下面代码:

var o = {
  1:'a'
  ,2:'b'
  ,length:2
  ,push:Array.prototype.push
};
o.push('c');

Q:o现在内部的值是什么样子?

我的第一反应是排斥,为什么要研究不合理情况下【解释引擎】的行为?但是这种推论有时候又很吸引人,于是我回来的时候仔细思考了下,发现其实很简单。

对于push这个方法,我条件反射地想到的就是栈,【数据结构的经典栈】中压栈和弹栈操作依据的都是栈顶指针,栈顶指针始终指向栈顶,意味着它会因为压弹栈而自动增减。在javascript中的数组中这个指针就是length。所以在上面的代码中,o.push('c')就是o.2 = 'c'(当然o.2不能直接访问,这只是伪代码),所以代码执行完o中数据如下:

{
  1:'a'
  ,2:'c'
  ,length:3 //push操作=>length+1
  ,push:Array.prototype.push
}

补充说明:

JavaScript中,万物皆对象,而javascript的对象与强类型的对象有一些不同的地方,可以理解成就是一组键值对的集合。其array类型也不例外,它的下标访问就是键访问(不过它的键都是自然数),在上面的例子中赋值给a的对象字面量实际模拟了一个数组(一个下标从1开始的数组)——当然只有部分数组的特性,比如真实的数组在进行键访问的时候,会根据length进行越界检查。

只要知道push的位置依据的是length就可以了,下面种种看似奇怪的现象都好理解:

//1.length不存在,引擎置为0
var o = {
  '1':'a'
  ,'2':'b'
  ,push:Array.prototype.push
};
o.push('c');//c {0:'c',1:'a',2:'b',...}
//2.length为负值,这是个有趣的问题,涉及到原码反码和补码【1】
var o = {
  '1':'a'
  ,'2':'b'
  ,length:-1
  ,push:Array.prototype.push
};
o.push('c');//c {1:'a',2:'b',4294967295:'c',length:4294967296,...}
//3.length为字符或对象
var o = {
  1:'a'
  ,2:'b'
  ,length:'A'
  ,push:Array.prototype.push
};
o.push('c');//c {0:'c',1:'a',2:'b',length:1,...}我还以为js解释器会把A转换成ASCII码来给length赋值呢,终于看到了javascript的自由还是有节操的

计算机中数值都是以补码方式存储的,为了方便运算,-1的补码与4294967295补码一样,根据length的语义,此处是无符号数

[-1]补 = 1111 1111 1111 1111 1111 1111 1111 1111 =  [4294967295]补  = 1111 1111 1111 1111 1111 1111 1111 1111

所以这样我们接差对2中的o压入一个对象,key取的是4294967296,但是数组的最大长度限制为4294967296,也就是说下标只能取到4294967295,只会取到32位——对于4294967296 = 1 0000 0000 0000 0000 0000 0000 0000 0000 取后32位,就变成了0,所以此次push的位置是0。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
IE6图片加载的一个BUG解决方法
Jul 13 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
jquery通过name属性取值的简单实现方法
Jun 20 Javascript
模拟javascript中的sort排序(简单实例)
Aug 17 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
Oct 15 Javascript
jQuery控制元素隐藏和显示
Mar 03 Javascript
利用JavaScript的%做隔行换色的实例
Nov 25 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
Jun 21 Javascript
javascript跳转与返回和刷新页面的实例代码
Nov 20 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
JavaScript中的await/async的作用和用法
Oct 31 #Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
Oct 31 #Javascript
微信小程序 开发工具快捷键整理
Oct 31 #Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 #Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 #Javascript
jQuery绑定事件的四种方式介绍
Oct 31 #Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 #Javascript
You might like
收集的PHP中与数组相关的函数
2007/03/22 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
php blowfish加密解密算法
2016/07/02 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
thinkphp分页实现效果
2016/10/13 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
服装厂厂长职责
2013/12/16 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS