基本类型和引用类型的值

一.基本数据类型

基本数据类型:undefined null number string boolean
这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

二.引用数据类型object

引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。


    栈内存                           堆内存
    undefined                       object
    null                               
    number                             
    string                          object
    boolean 
    object地址

1.动态的属性

 引用数据类型object可以添加属性和方法
定义基本类型值和引用类型值的方式是相似的:创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。
    var box = new Object();                     //创建引用类型
    box.name = 'hcd';                           //新增一个属性
    alert(box.name);                            //hcd
如果是基本类型的值添加属性的话,就会出现问题了。
    var box = 'hcd';                            //创建一个基本类型
    box.age = 24;                               //给基本类型添加属性
    alert(box.age);                             //undefined 

1.2复制变量值

基本数据类型的复制:
    var a = 1;
    var b = a;
    这样一样a = 1;b = 1;并且两者是没有任何关系的;
引用数据类型:
        var person = new Object();
        var person1 = person;
        person.name = "hcd";
        console.log(person1.name);//"hcd"
    这是因为person其实是一个指针,指向的是存储在堆中的一个对象。person与person1共用一个对象。
    所以person增加新的属性和方法时,person1其实也就增加了相同的属性和方法。

1.3传递参数

    按值传递,而不是引用传递
    1.
        function add(n){
            n++;
            return c = n;
        }
        var a = 10;
        b = add(a);
        console.log(a+"~~~~~~"+b)
        //10~~~~~~11;
2.
        function nwe(obj){
            obj.name = "hcd";
        }
        var person = new Object();
        nwe(person)
        console.log(person.name);  //hcd
    这是因为nwe(person)其实参数obj是一个复制了person的指针,和person指向的是存储在堆中的一个对象。
    所以在函数内修改对象的name属性,perosn同样受用

3.

        function nwe(obj){
            obj.name = "hcd";
            var obj = new Object();
            obj.name = "new HCD";
        }
        var person = new Object();
        nwe(person)
        console.log(person.name);//"hcd"
    在obj.name = "hcd";时参数obj和person还指向堆内存的同一个对象,var obj = new Object();后就是不同的对象了,而是生成了一个局部对象,函数执行完后就会销毁,所以新的name属性就对person不起作用了。

    在函数的内部又创建一个obj并没有替换掉原来的obj,可见参数都是局部变量,是按值传递的,不是按照引用

1.4检测类型

    要检测一个变量的类型,我们可以通过typeof运算符来判别。诸如:
    var box = 'Lee';
    alert(typeof box);                          //string

    虽然typeof运算符在检查基本数据类型的时候非常好用,但检测引用类型的时候,它就不是那么好用了。通常,我们并不想知道它是不是对象,而是想知道它到底是什么类型的对象。因为数组也是object,null也是Object等等。
    这时我们应该采用instanceof运算符来查看。
    var box = [1,2,3];
    alert(box instanceof Array);                    //是否是数组
    var box2 = {};
    alert(box2 instanceof Object);                  //是否是对象
    var box3 = /g/;
    alert(box3 instanceof RegExp);              //是否是正则表达式
    var box4 = new String('Lee');
    alert(box4 instanceof String);                  //是否是字符串对象

    PS:当使用instanceof检查基本类型的值时,它会返回false。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值