zoukankan      html  css  js  c++  java
  • 对象的引用

    在写js程序中,我们总会遇到一些很奇怪的问题,比如对象的引用,百思不得其解,比如

    var arr1 = [1,2,3];
    var arr2 = [1,2,3];
    alert(arr1 == arr2);    //false

    弹出一个结结实实的false,这是为什么呢?十万个为什么!!!

    赶紧试试其他的类型

    var a = 3;
    var b = 3;
    alert(a == b);    //true

    一头雾水。。。。

    接着往下看

    var arr1 = [1,2,3];
    var arr2 = arr1;
    arr2.push(4);
    alert(arr2);    //[1,2,3,4]
    alert(arr1);    //[1,2,3,4]

    这都是什么原因,这一切都罪过都要归功于对象的引用

    实际上像数字,字符串,布尔值这些基本类型之间的赋值只是值得赋制,而对象之间的赋值,不仅是值的赋值,而且还存在引用关系

    对象都是存在内存中的(就像每个人在一个城市中都有一个住所一样)

    var arr1 = [1,2,3];
    var arr2 = arr1;    
    arr2.push(4);
    alert(arr2);    //[1,2,3,4]
    alert(arr1);    //[1,2,3,4]

    但当对象之间进行赋值的时候,就像投奔到你的远方亲戚,你们就住在一块了,也就是说对象这时候在内存中的位置是一样的,这时候当你再向arr2中进行push一个4的时候,那么arr1,也就有了4,因为你们已经住在一起了,你的东西就是我的东西,我的东西就是你的东西,(哈哈,自己瞎掰的,只是没有更形象的一个比喻了,虽然有些牵强,却能说明道理),这也就很能说明为什么弹出的arr1里面也是1,2,3,4

    var arr1 = [1,2,3];
    var arr2 = arr1;
    arr2 = [4,5,6];
    alert(arr2);    //[4,5,6]
    alert(arr1);    //[1,2,3]

    注意上面的代码有一个坑,我们看到alert所弹出的结果,并非我们预想的那样,这是因为arr2进行了重新的赋值,这时候arr2就从arr1中的内存中所脱离出来了,重新找了一个内存地址,就像从你家搬出去了,自己租房子了,这时候arr1和arr2就不存在内存引用关系了,大路朝天,各走一边,这时候arr2的内容的修改就不会对arr1有任何的影响了。

  • 相关阅读:
    简单事务使用
    sql in(1,2,3)参数化查询,错误在将 varchar 值 '1,2,3,4' 转换成数据类型 int 时失败
    处理金额小数点后的零
    json时间格式化问题
    读取接口XML和批量导入数据SqlBulkCopy
    list操作 foreach和for的区别
    10.16 一起去修仙 !mv
    10.9 自动生成计算题输入答案判断正误;计算BMI
    9.25九道题
    9.18作业 杨月(1636050091)练习题
  • 原文地址:https://www.cnblogs.com/chenzhiyu/p/7898598.html
Copyright © 2011-2022 走看看