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 相关文章推荐
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
JS多物体 任意值 链式 缓冲运动
Aug 10 Javascript
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
Jun 15 Javascript
JavaScript正则获取地址栏中参数的方法
Mar 02 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
Sep 18 Javascript
security.js实现的RSA加密功能示例
Jun 06 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
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
mysq GBKl乱码
2006/11/28 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
javascript arguments使用示例
2014/12/16 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
django2 快速安装指南分享
2018/01/05 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
Python实现随机漫步功能
2018/07/09 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
阿巴庭院:Abba Patio
2019/06/18 全球购物
2015年员工试用期工作总结
2015/05/28 职场文书
关于python爬虫应用urllib库作用分析
2021/09/04 Python
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL