javascript的赋值

2008-09-12 13:43:08
var a = "hello,world!";
var b = a;
a = "hello,omiga~";
alert(a); // "hello,omiga~";
alert(b); // "hello,world!";
//--------------------------
var c = 5;
var d = c;
c++;
alert(c); // 6
alert(d); // 5
//--------------------------
var e = true;
var f = e;
e = !e;
alert(e) // false;
alert(f) // true;
//--------------------------
var i = null;
var j = i;
i = !null;
alert(i); // true
alert(j); // null
//--------------------------
var m = [1,2,3,4,5];
var n = m;
m.push(10);
alert(m); // [1,2,3,4,5,10]
alert(n); // [1,2,3,4,5,10]
n.pop();
alert(m); // [1,2,3,4,5]
alert(m); // [1,2,3,4,5]
//--------------------------
var s = {"name":"omiga","url":"http://omiga.org"};
var t = s;
s.name = "wondger";
alert(s.name); // "wondger"
alert(t.name); // "wondger"
t.name = "omiga";
alert(t.name); // "omiga"
alert(s.name); // "omiga"

运行代码

结论:javascript中变量的赋值根据数据类型而采用不同的赋值方式。对于数组类型,对象类型采用引用赋值;而对于其他数据类型采用按值赋值(重新分配内存)。这是一个错误的结论,请看下文。

PS:将一个变量的值赋给另外一个变量,当然是将其引用进行赋值,不会重新申请内存空间。比如:首先声明的变量a=”hellow,world!”,假设分配内存空间“12345”,那么b=a后,b也指向“12345”的内存空间。但是a=”hello,omiga~”语句会重新为值”hello,omiga~”分配内存“23456”,a也重新指向“23456”,b却依然指向“12345”。但是以上代码中的数组和JSON为什么并没有随其值得改变而改变?因为数组和JSON都只是改变的其内的元素/属性,只是对内存进行了重写,而未重新分配内存,仍然指向同一内存,故会有以上测试结果。我们可以测试为其重新分配内存的情况。

var m = [1,2,3,4,5];
var n = m;
m = [1,2,3,4,5,10];
alert(m); // [1,2,3,4,5,10]
alert(n); // [1,2,3,4,5] 重新分配内存后m和n指向不同的内存空间,彼此不再影响
n.pop();
alert(m); // [1,2,3,4,5,10]
alert(n); // [1,2,3,4]
//--------------------------
var s = {"name":"omiga","url":"http://omiga.org"};
var t = s;
s = {"name":"wondger","url":"http://omiga.org"};
alert(s.name); // "wondger"
alert(t.name); // "omiga" 重新分配内存后t和s指向不同的内存空间,彼此不再影响
t.name = "omiga_w";
alert(s.name); // "wondger"
alert(t.name); // "omiga_w"

运行代码

相关日志

2 Comments to “javascript的赋值”

  1. colinivy Says:

    soga

  2. Fdream Says:

    字符串不能简单的作为对象或者值或者数组来看待,在JavaScript、C#和Java中都对其做了特殊处理,忘记是在哪本书里面有详细介绍了~

Leave a Reply

[Ctrl+Enter]