Javascript对象赋值的问题

本来之前的了解是:比如vararray1=newArray(1,2,3,4);vararray2=array1;array2[1]=0;那再alert(array1[1]... 本来之前的了解是:
比如
var array1=new Array(1,2,3,4);
var array2=array1;
array2[1]=0;
那再alert(array1[1])也应该输出0,
这个没有问题 因为这样给对象赋值给的是引用不是新建对象

但是同样的,
var string1=new String("Hello,World!");
var string2=string1;
string2="See You,World!";
再alert(string1),输出的还是Hello,World!,换言之,尽管是对对象赋值,但是还是给string2新开辟了内存空间并写入了新值

为什么会这样呢?是因为JS只有基本类型和引用类型两种类型吗?
即使把字符串的声明写成new String()也不能真的声明成一个类吗?
难道弱类型语言就只能这么混乱?

求高人解答,非常感谢~! ^_^

PS.之前因为听人说过 字符串是基本类型 String对象是引用类型,所以更加困惑了...
展开
 我来答
karon_luo
2012-03-23 · TA获得超过345个赞
知道小有建树答主
回答量:165
采纳率:0%
帮助的人:156万
展开全部
这个。。。是值传递不是地址传递,所以你使用 var str2=str1,仅仅是把 str1的值传递给了 str2.
str2 和 str1 根本就是两个不同的内存地址。
因此,你改变str2的值,仅仅是改变了str2的存储, str1的值并没有改变。
Javascript 不混乱啊。
Javascript 有个规定是:
数字、字符串等是按值传递的(包括字符串和数字对象)。
数组、对象等是按地址传递的(不包括字符串和数字对象)。
就算你 String() 实际上它还是 字符串。。并不是真正的对象。
更多追问追答
追问
如果是基本的字符串的类型的话,比如 var string="123"; 确实是你说的那样没错,但是现在的情况是, string的声明并不是普通字符串,而是String对象了,这个时候应该按面向对象的机制来解释,但是出现和new Array()不一致的矛盾了
我现在就怀疑是你说的那样,JS没有真正实现String对象,只是在使用.length这些属性或者方法时临时转换,但是书上和网络上很多地方都明确区分了 “基本类型字符串”和“字符串对象”
追答
Javascript 的理论就是这个样子的,只能去适应他们。
每种语言都有他们不同的地方。

当然非要做出来也行,利用对象。呵呵。
比如这样做:

var k = new Object();
var k1 = new Object();
k.str = "abcdefg";
k1 = k;
k1.str = "bcd";
alert(k.str);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式