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 相关文章推荐
拖拉表格的JS函数
Nov 20 Javascript
Javascript 去除数组的重复元素
May 04 Javascript
jQuery对象[0]是什么含义?
Jul 31 Javascript
JavaScript高级程序设计 事件学习笔记
Sep 10 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
Sep 02 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
jquery实现不包含当前项的选择器实例
Jun 25 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
Feb 22 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
May 29 Javascript
使用flow来规范javascript的变量类型
Sep 12 Javascript
对layui中table组件工具栏的使用详解
Sep 19 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
Aug 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 删除数组元素
2009/01/16 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
新鲜出炉的js tips提示效果
2011/04/03 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Python出现segfault错误解决方法
2016/04/16 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python爬取内容存入Excel实例
2019/02/20 Python
Python常见数字运算操作实例小结
2019/03/22 Python
django中related_name的用法说明
2020/05/20 Python
市场营销专业毕业生自荐信
2013/11/02 职场文书
小学英语教学反思
2014/01/30 职场文书
办公室副主任职责范本
2014/03/08 职场文书
违纪学生保证书
2015/02/27 职场文书
现役军人家属慰问信
2015/03/24 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
婚庆答谢词大全
2015/09/29 职场文书