你的位置:首页 > Java教程

[Java教程]论javascript中的原始值和对象


javascript将数据类型分为两类:原始值(undefined、null、布尔值、数字和字符串),对象(对象、函数和数组)

论点:原始值不可以改变,对象可以改变;对象为引用类型;

 

'原始值不可以改变'不可以改变,如果动脑筋的同学肯定会怀疑了,你们字符串可以改变啊,不信你瞅下面的

var a = 'aa';alert(a.toUpperCase());//弹出 AA

其实,这些只是表面现象,原始值字符串'a'其实并未发生改变,只是拷贝了一份然后对新的拷贝使用'toUpperCase'函数而已,有下面代码为证

var a = 'aa';a.toUpperCase();alert(a);//弹出'aa'

瞅着了吧,其实字符串'a'并没有发生变化

原始值的比较是值得比较,他们值相等时才相等。

 

对象和原始值不同,他们的值可以修改,如下

var obj = {'a' : 1, 'b' : 2};obj.a = 3;obj.b = 4;var arr = [1, 2, 3];arr[0] = 4;

对象的比较并发值得比较,即使两个对象包含同样的属性和值,它们也是不相同的


奉上以下代码为证:

var a = {'x' : 1}, b = {'x' : 1};alert(a === b);//falsevar c = [1], d = [1];alert(c === d);//false

对象的值都是引用,对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等

'对象的值都是引用' 奉上如下代码以为证

var a = {'x' : 1};var b = a;a.x = 2;alert(b.x);// 弹出2var c = function(){  this.x = 1; }var d = new c;var e = d;d.x = 3;alert(e.x);//弹出3var aa = [1, 2, 3];var bb = aa;aa[0] = 11;alert(bb[0]);//弹出 11

 

'对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等' 奉上如下代码为证

var a = [1, 2, 3];var b = a;a[1] = 5;alert(a === b);//弹出truevar aa = [1, 2, 3];var bb = [1, 2, 3];alert(aa === bb);//弹出false

 

如我们上面的论述,对象的赋值只是赋值的引用,并没有进行任何拷贝,如果你想要得到一个拷贝的副本,则必须显式的为对象的每个属性或数组的每个元素进行拷贝,如下

var a = [1, 2, 3, 4, 5];var b = [];for(var i =0, _len = a.length; i < _len; i++){ b[i] = a[i];}

同样的如果我们想要对比两个数组或者对象,必须将数组或对象的每个元素或属性进行比较

 

鄙人才疏学浅,有不足之处,欢迎补足!