论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);//false

var c = [1], d = [1];
alert(c === d);//false

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

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

var a = {'x' : 1};
var b = a;
a.x = 2;
alert(b.x);// 弹出2

var c = function(){
   this.x = 1;  
}
var d = new c;
var e = d;
d.x = 3;
alert(e.x);//弹出3

var 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);//弹出true

var  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];
}

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

 

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

posted @ 2016-01-06 14:16  八面碰壁居士  阅读(944)  评论(0编辑  收藏