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 相关文章推荐
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
Dom 结点创建 基础知识
Oct 01 Javascript
使用js获取图片原始尺寸
Dec 03 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
从零学习node.js之mysql数据库的操作(五)
Feb 24 Javascript
js实现导航吸顶效果
Feb 24 Javascript
详解JavaScript调用栈、尾递归和手动优化
Jun 03 Javascript
关于redux-saga中take使用方法详解
Feb 27 Javascript
基于rollup的组件库打包体积优化小结
Jun 18 Javascript
js对象简介与基本用法示例
Mar 13 Javascript
vue2.x 对象劫持的原理实现
Apr 19 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(1) php开发环境配置
2010/02/15 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
浅谈php提交form表单
2015/07/01 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
JavaScript Eval 函数使用
2010/03/23 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
深入了解js原型模式
2019/05/30 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
解决VUE双向绑定失效的问题
2019/10/29 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
[00:14]护身甲盾
2019/03/06 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
error和exception有什么区别
2012/10/02 面试题
财务部出纳岗位职责
2013/12/22 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
纪律委员竞选稿
2015/11/19 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书