我们知道定义变量的时候,可以给变量赋值。包括基本数据类型和引用类型。
这一篇主要简单的说一下二者的区别(引用类型以对象为例)在哪里。
也是,挺有意思的。
首先第一点呢,就是对象可以自定义属性,什么意思呢。
<script>
var person=new Object();
person.name="wangwu";
console.log(person.name);
</script>
就像这样,打印出来也是wangwu。
但是呢,基本类型不允许这么做,但是你这么做,也不报错。。。
<script>
var person=13;
person.name="wangwu";
console.log(person.name);
</script>
像这样写,并不会报错,但是输出的也不是wangwu,是undefined。。。
来,我们再看第二点。。。
关于复制变量的值。
我们来看一下基本类型的复制啥样:
<script>
var x=10;
var y=x;
console.log(x,y);
x=6;
console.log(x,y);
</script>
10 10
6 10
打印结果显示,二者的值一样,但是一个改变,不会影响另一个的值。
这回我们再来看一下对象的!
<script>
var people1={
name:"lisi",
}
var people2=people1;
console.log(people1.name);
console.log(people2.name);
people1.name="wangwu"
console.log(people1.name);
console.log(people2.name);
</script>
那我们来看一下打印的结果:
lisi
lisi
wangwu
wangwu
可以看到,对象的复制,一个改变了也会改变另一个的值。
原因是其实两个变量people1和people2指向了同一块内存空间,你改变一个变量的值,其实就相当于把内存空间的值给改了,所以两个变量的值都会改变。
但基本数据类型,相当于是两块独立的内存空间,所以一个值改变了,另一个不会被改变。
OK,现在到最后一个了,也是最有意思的了。
开始之前我们要知道JS是不能对内存空间进行操作的,不像C中可以通过指针进行操作变量的地址,虽然少了一些快乐,但是也变得安全了吧。。。。
好我么你来看一段代码:
<script>
function add(num){
num+=10;
}
var num=20;
add(num);
console.log(num);
</script>
这段代码有C基础的人应该很容易明白我想说什么。
num这个变量虽然在函数里面进行了+10,但是出来后,内存空间的那个20并没有改变,所以打印出来的还是20。
在C中我们是通过操作num的地址来进行给它的值加10这个操作,但在JS中不允许你这么做,所以我也没有想到什么简单的方法能实现出这样一个函数。
收!我们来看一下对象的。
<script>
function setName(obj){
obj.name="123";
}
var wangwu={
name:456,
};
setName(wangwu);
console.log(wangwu.name);
</script>
这回打印出来的就是修改后的123了,为什么呢,因为这里obj和wangwu指向的是同一个地址,所以我们修改了obj的地址里面的属性值,那么wangwu的值也会因此改变。
这里会有一个比较好玩的。
<script>
function setName(obj){
obj.name="123";
obj=new Object();
obj.name="789";
}
var wangwu={
name:456,
};
setName(wangwu);
console.log(wangwu.name);
</script>
如果我这么写代码,打印出来的结果会是789吗,答案是否定的,打印出来的结果还是123.
至于原因,我把书上的解释拿过来:
即使在函数内部修改了参数的值,但原始的引用仍保持不变。。
什么意思呢,就是相当于我的这两行代码:
obj=new Object();
obj.name=“789”
就相当于我之前的那个x+=10的感觉是一样的,所以并不会对地址的值有所改动。。。。
至于理解其实我也不是特别理解。。。。
OK,关于这方面就说这些了,也欢迎补充。。。。