JavaScript 让你意外的瞬间(变量和对象)

我们知道定义变量的时候,可以给变量赋值。包括基本数据类型和引用类型。
这一篇主要简单的说一下二者的区别(引用类型以对象为例)在哪里。
也是,挺有意思的。

首先第一点呢,就是对象可以自定义属性,什么意思呢。

    <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,关于这方面就说这些了,也欢迎补充。。。。

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页