美文网首页
不可变的原始值和可变的对象引用

不可变的原始值和可变的对象引用

作者: 薛定谔的程序 | 来源:发表于2019-12-04 13:22 被阅读0次
    // JS 中原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着
    //根本区别。原始值是不可改的。 字符串不是那么明显,但却实不可改的,无法通过指定索引
    //来修饰字符串中的字符。字符串中所有的方法开上去是返回了一个修改后的字符串,实际上返回的是一个新字符串值。
    // let s = "hello";
    // s.toUpperCase();//"HELLO"
    // console.log(s.toUpperCase());
    // console.log(s);//"hello"
    //原始值的比较是值的比较:只有他们的值相等时它们才相等。
    //比较两个符串要它们的长度相等且每个索引的字符都相等时,JS才认为它们相等。
    //对象的比较并非是值的比较:相同属性相同的值,它们也是不相等的。各个索引元素完全相等的数组也不相等。
    //两个单独的对象永远不相等,两个空数组也是永远不相等的。
    //我们通常将对象称为引用类型(reference type),以此来和javaScript的基本类型区分开来。
    //依照术语的叫法,对象值都是引用(reference),对象的比较均是引用的比较:
    // 当且仅当它们引用同一个基本对象时,它们才相等。
    // let a = [];        //定义一个空数组的变量a
    // let b = a;         //变量b引用同一个数组
    // b[0] = 1;          //通过变量b来修该引用的数组
    // console.log(a[0]);// 1
    // console.log(a === b);//true
    // console.log(typeof b);//一切皆对象
    //如上述代码,将对象(或数组)赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次
    //想要得到一个数组或对象的副本,就必须显式赋值对象的每个属性或数组的每个元素:
    let a = ['k','o','i'];
    let b = [];
    for (let i = 0; i <a.length;i++) {
        b[i] = a[i];
    }
    console.log(a === b);//false
    //同样的,如果我们想比较两个单独的对象或者数组,就必须比较它们的属性或元素:
    function equalArrays(a,b) {
        if (a.length != b.length) return false;
        for (let i = 0;i<a.length;i++)
            if (a[i] !== b[i]) return false;
            return true;
    }
    let c=[],d = [];
    console.log(equalArrays(c,d));//两个空数组也相等
    
    

    相关文章

      网友评论

          本文标题:不可变的原始值和可变的对象引用

          本文链接:https://www.haomeiwen.com/subject/zzzkgctx.html