javascript中对象使用push

1 var obj = {
2     ‘1‘:‘a‘,
3     ‘2‘:‘b‘,
4     ‘length‘:2,
5     push:Array.prototype.push
6 }
7 obj.push(‘c‘);

浏览器执行以上脚本后,说法正确的是:
【A】obj 的 length 属性会变为 3;
【B】obj 的 length 属性不会变;
【C】obj3 的值是 c;
【D】obj1 和 2 的值不会发生变化;
【E】obj2 的值是 c;
【F】obj3 的值是 undefined;

选 A、E、F

js Array 的源码
V8
Array.prototype.push的部分:

 1 function ObservedArrayPush() {
 2   var n = TO_UINT32(this.length);
 3   var m = %_ArgumentsLength();
 4
 5   try {
 6     BeginPerformSplice(this);
 7     for (var i = 0; i < m; i++) {
 8       this[i+n] = %_Arguments(i);
 9     }
10     var new_length = n + m;
11     this.length = new_length;
12   } finally {
13     EndPerformSplice(this);
14     EnqueueSpliceRecord(this, n, [], m);
15   }
16
17   return new_length;
18 }
19
20 // Appends the arguments to the end of the array and returns the new
21 // length of the array. See ECMA-262, section 15.4.4.7.
22 function ArrayPush() {
23   CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push");
24
25   if (%IsObserved(this))
26     return ObservedArrayPush.apply(this, arguments);
27
28   var array = TO_OBJECT_INLINE(this);
29   var n = TO_UINT32(array.length);
30   var m = %_ArgumentsLength();
31
32   for (var i = 0; i < m; i++) {
33     array[i+n] = %_Arguments(i);
34   }
35
36   var new_length = n + m;
37   array.length = new_length;
38   return new_length;
39 }

push 方法把值添加到数组中。
push 方法有意具有通用性。该方法和 call() 或 apply() 一起使用时,可应用在类似数组的对象上。push 方法根据 length 属性来决定从哪里开始插入给定的值。如果 length 不能被转成一个数值,则插入的元素索引为 0,包括 length 不存在时。当 length 不存在时,将会创建它。
唯一的原生类数组(array-like)对象是 Strings,尽管如此,它们并不适用该方法,因为字符串是不可改变的。
当调用该方法时,新的 length 属性值将被返回。

所以说,push会根据对象length属性的值去确定插入的位置,即this[i+n] = %_Arguments(i)
所以在原题中obj.length值为2,调用obj.push("c")时,会发生obj[2]="c"的情况,所以最后 obj[2]就变成了‘c‘,而不是原来的‘b‘
当然了,push方法最后会根据传入的参数个数多少,即arguments.length来返回new_length,并赋值给obj.length

时间: 2024-11-06 04:58:19

javascript中对象使用push的相关文章

JavaScript中对象类型的转换小结

对象到字符串和对象到数字类型的转换涉及到两个重要的方法,最终的转换结果会受到这两个方法返回结果的影响,这两个方法就是toString和valueOf.所有的对象都会从Object对象中继承到这两个方法.toString方法 用于返回对象的字符串表示(但是其实也可以不返回字符串).对于默认从Object继承而来的toString方法并不会返回太多有意义的内容.而valueOf方法目的是返回一个可以表示对象的原始类型值,但是由于对象的复杂性,大多数情况下根本不可能用一个原始类型值来表示,所以默认的v

JavaScript中对象属性的添加和删除

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 用.为对象添加属性 用关键字delete删除属性 用[]添加属性 和.的不同 r.name==r["name"]; r.

私人定制javascript中对象小知识点(Only For Me)

废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说到 别这样为难老板,人家赚点钱不容易...首先如果你是高手那么请出门右转,如果你是菜鸟那么恭喜你,go on吧 全局对象在javascript程序中任何位置,都可以拈来就用的这种东西,是全局对象的属性.那么属性所在的对象也就是全局对象了.当javascript解释器启动时(或者任何Web浏览器加载新

JavaScript中对象的浅复制和深复制

在JavaScript中,如果要复制一个变量我们应该怎么做呢?下面这种做法是最简单的一种形式: //把a复制给b let a = 12; let b = a; 这种复制方法只能适用于基本类型,如果a是对象怎么办呢?我们先来看看上面的代码在内存中做了什么事: 声明了变量a = 12,栈内存会分配一块区域来存储,如上图所示.把a赋给b,会在栈中重新开辟一块区域来存储b,并且b的值就是a的值. 假如a是对象,内存做了什么事呢?来看下面的例子: let a = {}; let b = a; 如图所示,对

javascript中对象访问自身属性的方式

在javascript中,通过对象的方法访问对象自身属性时,必须采用this.fieldName的方式. 原因是javascript中Function是无状态的,访问对象的属性时,必须指定当前的上下文状态,即添加this关键字.如果没有指定,则上下文默认为window. 举例如下: 1 var obj = 2 { 3 name:"James", 4 showName:function(){ 5 alert(name); 6 } 7 } 通过控制台执行obj.showName() 输出为

JavaScript中对象的属性

原文:http://www.2ality.com/2012/10/javascript-properties.html JavaScript中有三种不同类型的属性:命名数据属性(named data properties),命名访问器属性(named accessor properties)以及内部属性(internal properties). 命名数据属性 这种属性就是我们通常所用的"普通"属性,它用来将一个字符串名称映射到某个值上.比如,下面的对象obj有一个名为字符串"

五、Javascript中对象

为什么面向对象的思想能迅速风靡编程世界呢? 因为面向对象的思想首次把数据和代码结合成统一体,并以一个简单的对象概念呈现给编程者.这一下子就将原来那些杂乱的算法与子程序,以及纠缠不清的复杂数据结构,划分成清晰而有序的结构对象,从而理清了数据与代码在我们心中那团乱麻般的结. 在JavaScript中,一切皆可看做是对象来进行处理. 一.定义得到一个对象 除了上面直接定义的方式得到对象外,还可以使用构造方法来得到对象. 二.对象属性和方法的访问 1.方式一:通过 对象名.属性名 .对象名.方法名( )

JavaScript中对象的比较

问题描述: 在JavaScript中,数值的比较是比较简单的,使用相等(==)和全等(===)符号基本上可以解决大多数非对象的比较:但是相等(==)和全等(===)符号在对象 object 的比较上,就不能满足所有的要求了,如下面的代码: 1 let obj_a = { 2 name: "jack", 3 old: 12 4 } 5 6 let obj_b = { 7 name: "lucy", 8 old: 13 9 } 10 11 let obj_c = { 1

javascript中对象的深度克隆

零.寒暄 又是一个月多月没有更新博客了,这段时间回学校处理下论文的事情,实习的生活也暂时告一段落(在公司上班,才发现学校里面的生活简直如天堂一般,相信很多已经毕业的小伙伴肯定被我说中了,说中了请给本文点个赞,哈哈!).希望接下来自己的更新进度能加快,马上又是一年校招时,被虐也好.大牛虐别人也罢,总之祝福各位今年要找工作的小伙伴们好运.那么,今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目