• 论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];
    }

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

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

  • 相关阅读:
    [POJ 2777]Count Color 线段树+二进制状态压缩
    [git] git push问题 解决 Updates were rejected because the tip of your current branch is behind 和每次输入用户名和密码
    [hdu-5795]A Simple Nim 博弈 尼姆博弈 SG函数打表找规律
    [codeforces1284E]New Year and Castle Construction 几何
    Spring事务相关接口以及实现类
    MyBatis与Spring整合
    实现一个简易RPC
    使用CAS实现一个超时锁
    阻塞队列
    Java中的Lock接口
  • 原文地址:https://www.cnblogs.com/painsOnline/p/5105277.html
Copyright © 2020-2023  润新知