07-基本数据类型与引用数据类型
在JS中
基本数据类型:Number String Boolean Undefined Null
引用数据类型:Object
问题一
1 <script type="text/javascript"> 2 var a = 1; 3 var b = a; 4 a++; 5 console.log("a = " + a); 6 console.log("b = " + b); 7 </script>View Code
执行上面的代码,我们可以发现a的值发生了改变(由原来的1变为2),但是b的值并没有发生改变
问题二
1 <script type="text/javascript"> 2 var a = 1; 3 var b = a; 4 a++; 5 console.log("a = " + a); 6 console.log("b = " + b); 7 8 var obj = new Object(); 9 obj["name"] = "孙悟空"; 10 var obj2 = obj; 11 obj["name"] = "唐僧"; 12 console.log("obj.name = " + obj.name); 13 console.log("obj2.name = " + obj2.name); 14 </script>View Code
执行这段 代码,我们发现obj的name的值与obj2的1name的值都发生了相应的改变,都由“孙悟空”变成了“唐僧”
探讨原因
那么产生上面这两个问题的原因是什么呢?
之所以产生上面这两种情况是因为在JS中基本数据类型和引用数据类型储存方式不同,基本数据类型保存的是值,引用数据类型保存的是内存地址。
下面我用两幅图解释一下产生这种状况的原因:
问题再探
我们再来看一个有趣的例子:
1 var obj = new Object(); 2 var obj2 = new Object(); 3 obj.name = "孙悟空"; 4 obj2.name = "孙悟空"; 5 console.log(obj); 6 console.log(obj2);View Code
执行上面代码,我们得到如下图所示的结果,我们明显能够观察到这两个对象是相同的
但是当我们在这里添加这样一行代码:
console.log(obj == obj2);
这句代码执行结果如下图所示,为False,此时我们就能看到有趣之处,明明我们第一次看到的打印出来的两个对象是相同的,但是使用代码判断结果确实False。
下面我来解释一下原因:
还是因为引用数据类型里面保存的是内存地址,我们创建了两个相同的对象,等于是开辟了两块内存,每一块内存对应一个内存地址,我们执行obj == obj2的时候实际上是判断内存这两个内存的地址是否相同。
总结
在JS中引用数据类型中保存的都是内存地址,基本数据类型中保存的是值