zoukankan      html  css  js  c++  java
  • 论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];
    }

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

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

  • 相关阅读:
    View注入框架:Butterknife简单使用
    Android之——自己定义TextView
    算法练习--小球下落
    【MVC架构】——怎样利用Json在View和Controller之间传递数据
    ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
    排序算法之归并排序
    C++_关于const 的全面总结
    silent install oracle 11.2.0.1 x86_64 for linux
    struts2请求过程源代码分析
    Hadoop自学笔记(一)常见Hadoop相关项目一览
  • 原文地址:https://www.cnblogs.com/painsOnline/p/5105277.html
Copyright © 2011-2022 走看看