本文实例讲述了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数组操作技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
本文向大家介绍JS数组方法push()、pop()用法实例分析,包括了JS数组方法push()、pop()用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS数组方法push()、pop()用法。分享给大家供大家参考,具体如下: push()方法 1. 定义:向数组的末尾添加一个或更多元素,并返回新的长度。 2. 语法: arr.push(element1, ..., elem
本文向大家介绍JavaScript数组方法总结分析,包括了JavaScript数组方法总结分析的使用技巧和注意事项,需要的朋友参考一下 由于最近都在freecodecamp上刷代码,运用了很多JavaScript数组的方法,因此做了一份关于JavaScript教程的整理,具体内容如下: 一、普通方法 1、join() 将数组元素连接在一起,并以字符串形式返回 参数:可选,指定元素之间的分隔符,没有
本文向大家介绍javascript数组去重方法分析,包括了javascript数组去重方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript数组去重方法。分享给大家供大家参考,具体如下: 方法一. 思路:创建一个新的空数组,循环遍历旧数组,用indexOf()方法,可以取得元素在数组中的位置,如果值为-1表示不存在。那么新数组用indexOf去获取老数组的每一个元素,
本文向大家介绍javascript使用数组的push方法完成快速排序,包括了javascript使用数组的push方法完成快速排序的使用技巧和注意事项,需要的朋友参考一下 排序的方法有很多,本节介绍的是使用数组的push方法完成快速排序
本文向大家介绍简介JavaScript中的push()方法的使用,包括了简介JavaScript中的push()方法的使用的使用技巧和注意事项,需要的朋友参考一下 JavaScript的数组push()方法追加在最后该数组的给定元素(多个),并返回新的数组的长度。 语法 下面是参数的详细信息: element1, ..., elementN: 元素添加到数组的末尾。 返回值: 返回新数组
本文向大家介绍angular json对象push到数组中的方法,包括了angular json对象push到数组中的方法的使用技巧和注意事项,需要的朋友参考一下 在项目中,api要求的数据格式为 而我的返回格式为 需要将两个数组整合,其中$scope.selected要先转化为json对象,再进行push操作。 代码如下: 以上这篇angular json对象push到数组中的方法就是小编分享给