太奇怪了,JS的数组

fancystyle 2008-08-19 03:16:25

var arr=[];
function F(ar){ar.push("k");var arr1=["3","4"];ar=ar.concat(arr1);alert(ar);ar.push('bbs');}
F(arr);
alert(arr)//为啥输出的是k


实在不明白,请大侠指点下
...全文
138 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fancystyle 2008-08-20
  • 打赏
  • 举报
回复
得有信用,加分结帖.-)
fancystyle 2008-08-19
  • 打赏
  • 举报
回复
MSDN上对C#通过值传递引用类型

当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不
能使用相同的引用为新类分配内存并使之在块外保持。

是这样解释的,现在终于明白了,呵呵.C# 加ref就可以解决了

只是不知道JS.怎么解决..
shoushii 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 flyin2006 的回复:]
引用 11 楼 fancystyle 的回复:
再谢.我质疑的是下面的这种操作.ar=arr1这样也会产生新对象么?MGD,非要用那种遍历么?
引用 8 楼 fancystyle 的回复:
JScript code
var arr=[];
function F(ar){ar.push("k");var arr1=["3","4"]; ar=arr1;ar.push('bbs');}
F(arr);


同样不行.



你这个 ar=arr1 不但产生了新对象
而且还把ar前面push进去的"k"都搞没了
[/Quote]
正确。
fancystyle 2008-08-19
  • 打赏
  • 举报
回复
终于明白.今天加不上分,明天加分结帖,呵呵.
arr=arr1 变成新的地址.引用链已经断掉.
flyin2006 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fancystyle 的回复:]
再谢.我质疑的是下面的这种操作.ar=arr1这样也会产生新对象么?MGD,非要用那种遍历么?
引用 8 楼 fancystyle 的回复:
JScript code
var arr=[];
function F(ar){ar.push("k");var arr1=["3","4"]; ar=arr1;ar.push('bbs');}
F(arr);



同样不行.

[/Quote]

你这个 ar=arr1 不但产生了新对象
而且还把ar前面push进去的"k"都搞没了
lovehongyun 2008-08-19
  • 打赏
  • 举报
回复
再谢.我质疑的是下面的这种操作.ar=arr1这样也会产生新对象么?MGD,非要用那种遍历么?
----------------
问题不在于ar=arr1
而是在于concat()方法
你可以试下面代码
你可以分别注释掉和放开1,2两标记处的代码.运行一下就清楚了

var arr=[];
function F(ar)
{
ar.push("k");
var tmpArr = ar;
ar = tmpArr;//1
//ar = tmpArr.concat("3","4");//2
ar.push('bbs');
}
F(arr);
alert(arr);
fancystyle 2008-08-19
  • 打赏
  • 举报
回复
再谢.我质疑的是下面的这种操作.ar=arr1这样也会产生新对象么?MGD,非要用那种遍历么?
[Quote=引用 8 楼 fancystyle 的回复:]
JScript code
var arr=[];
function F(ar){ar.push("k");var arr1=["3","4"]; ar=arr1;ar.push('bbs');}
F(arr);



同样不行.
[/Quote]
flyin2006 2008-08-19
  • 打赏
  • 举报
回复

var arr = [];
function F(ar) {debugger;
ar.push("k");
var arr1 = ["3", "4"];
for (var i = 0; i < arr1.length; i++) {
ar.push(arr1[i]);
}
ar.push('bbs');
}
F(arr);
alert(arr);
flyin2006 2008-08-19
  • 打赏
  • 举报
回复
应该是 ar=tmpArr.concat(arr1);
这个concat结果返回就是一个新对象
fancystyle 2008-08-19
  • 打赏
  • 举报
回复

var arr=[];
function F(ar){ar.push("k");var arr1=["3","4"]; ar=arr1;ar.push('bbs');}
F(arr);


同样不行.
fancystyle 2008-08-19
  • 打赏
  • 举报
回复
3Q3Q,LSD的和三楼的我都理解了.

但具体业务里有个concat操作.按LSD的意思我这样写

var arr=[];
function F(ar){ar.push("k");var tmpArr = ar;var arr1=["3","4"]; ar=tmpArr.concat(arr1); ar.push('bbs');}
F(arr);

在栈内存中新建一个tmpArr指向ar的堆内存,如上.再传回ar,这样ar的地址应该一直没有变,为什么还是不可以.

等下给帖子加分.
lovehongyun 2008-08-19
  • 打赏
  • 举报
回复
可以简单理解为
ar=ar.concat(arr1);
就相当于新建立了一个对象.和你传进来的对象不同了.所以你传进来的对象只被push进去了一个"k"
lovehongyun 2008-08-19
  • 打赏
  • 举报
回复
var arr=[];
function F(ar){ar.push("k");var arr1=["3","4"];ar=ar.concat(arr1);alert(ar);ar.push('bbs');}
F(arr);
alert(arr)//为啥输出的是k
----------
你的这段程序中如果去掉var arr1=["3","4"];ar=ar.concat(arr1);
光是做push()操作.你最终的结果会显示k,bbs

push和pop方法类似于压栈,出栈操作.而concat则不同.
3楼回答的很对.
fancystyle 2008-08-19
  • 打赏
  • 举报
回复
谢谢楼上的几位,LSD的所言,有所解惑
return ar;的方法我明白.具体的函数比较长,夹杂业务复杂.所以具体情况中,我希望不用return ar的方法,但操作后ar数组得到改变.怎么做.一定不能那个concat么?
jack20080808 2008-08-19
  • 打赏
  • 举报
回复
var arr=[];
function F(ar)
{
ar.push("k");
var arr1=["3","4"];
ar=ar.concat(arr1);
ar.push('bbs');
return ar;
}
arr=F(arr);
alert(arr);
这样就对了,按你说的那个,
执行完ar.push("k");就不执行了,
引用类型的关系,
ar=ar.concat(arr1);
是建立了新对象(指针指向另一个位置),下面那个ar.push('bbs');
操作的是ar建立的新对象,只有ar.push("k");这句才是执行原始对象arr
lovehongyun 2008-08-19
  • 打赏
  • 举报
回复

var arr=[];
function F(ar)
{
ar.push("k");
var arr1=["3","4"];
ar=ar.concat(arr1);
alert(ar);
ar.push('bbs');

return ar;
}
arr = F(arr);
alert(arr);
MisterDotNet 2008-08-19
  • 打赏
  • 举报
回复

默认输出在第一个位置的内容吧

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧