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 相关文章推荐
IE 缓存策略的BUG的解决方法
Jul 21 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
Dec 11 Javascript
javascript删除option选项的多种方法总结
Nov 22 Javascript
一个网页标题title的闪动提示效果实现思路
Mar 22 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
Dec 20 Javascript
BootstrapTable refresh 方法使用实例简单介绍
Feb 20 Javascript
从setTimeout看js函数执行过程
Dec 19 Javascript
详解vue配置后台接口方式
Mar 29 Javascript
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
微信小程序换肤功能实现代码(思路详解)
Aug 25 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获取文件名后缀
2013/06/09 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
js获取本机的外网/广域网ip地址完整源码
2013/08/12 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
jquery实现动态画圆
2014/12/04 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Python执行时间的几种计算方法
2020/07/31 Python
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
业务代表的岗位职责
2013/11/16 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
Python Parser的用法
2021/05/12 Python
Python闭包的定义和使用方法
2022/04/11 Python