关于对象类型的引用问题

今天我想说一个我第二次犯过的错误,为什么是第二次呢?因为我之前公司的那位老大帮我解释过这个问题,但是最近又犯了这个错误,以此博文作为检讨。

到底是什么错误呢?我们慢慢来说。

由于是在AngularJs的环境下,给作用域$scope对象上绑定属性和方法时出的问题,所以我尽量还原当时的场景,这样更逼真些,也更能说明问题。

当时是希望将所有提示信息放在$scope.msg.showMsg这个数组中,然后在页面上显示出来

最初的代码是这样的

$scope.msg={
    showMsg:[],
    msgCollection:{
        "required":"用户名不能为空",
        "pattern":"用户名必须是字母",
        "maxlength":"用户名最长10位",
        "minlength":"用户名至少3位"
    }
};
$scope.change=function(err){
    //先将显示信息的数组清空
    $scope.msg.showMsg=[];
    for(var attr in $scope.txtCollection){
        if(err[attr]){
            //将返回值为true的信息加到结果数组中
            $scope.msg.showMsg.push($scope.txtCollection[attr])
        }
    }
    if($scope.msg.showMsg.length==0){
        //如果通过验证,就显示对勾
        $scope.msg.showMsg=["√"];
    }
};

这个时候没什么问题

但是$scope.change函数里面多次用到了$scope.msg.showMsg这个数组,因此很自然想用一个变量把它存起来,于是代码变成了这样

$scope.msg={
    showMsg:[],
    msgCollection:{
        "required":"用户名不能为空",
        "pattern":"用户名必须是字母",
        "maxlength":"用户名最长10位",
        "minlength":"用户名至少3位"
    }
};
$scope.change=function(err){
    //先将显示信息的数组清空
    var showMsg=$scope.msg.showMsg;
    showMsg=[];
    for(var attr in $scope.txtCollection){
        if(err[attr]){
            //将返回值为true的信息加到结果数组中
            showMsg.push($scope.txtCollection[attr])
        }
    }
    if(showMsg.length==0){
        //如果通过验证,就显示对勾
        showMsg=["√"];
    }
};

但是这样一来,我预览之后发现,页面上什么都显示不出来了,后来我就找老大问为什么

老大说:“你的showMsg清空用的方法是直接赋值一个新的数组对象,这样的话showMsg数组对象和$scope.msg.showMsg数组对象之间的指针关系就会断掉,你对showMsg做的修改就不会影响到$scope.msg.showMsg了,所以效果就出不来了”

解决方案也很简单,清空数组有两种方法,除了赋值一个新数组之外,还有另外一种方法就是showMsg.length=0,这样一来,修改的是showMsg和$scope.msg.showMsg共同指向的那个对象的length属性,而并没有做对象覆盖操作,所以这种方法是可以的

当然在此多说一句,在Java或C#里面属性一般都是私有属性,是不能被轻易修改的,所以其实修改数组的length这本身就是js的一个bug,但是我们利用了这个bug清空了数组

其实,之前我还遇到过这样一个问题

当时是希望利用对象是地址传递这样一个特性,希望将一个空对象传入初始化函数中进行初始化,具体的代码如下:

//这里是一个插件的定义
function Table(config){
    this.aaa=config.aaa;
    this.bbb=config.bbb;
}

//初始化插件的方法,在此希望传入哪个对象就初始化哪个对象
function initTable(inst){
    var config={
        aaa:"aaa1",
        bbb:"bbb1"
    };
    inst=new Table(config);
}

var list1=null;
initTable(list1);
console.log(list1);//但是这里得到的结果仍然是nul

具体的原因就不做详细解释了,和上面的问题一样,这次以一张图来说明

时间: 2024-08-02 18:54:32

关于对象类型的引用问题的相关文章

<Python内置对象类型>

核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set),frozenset,类型,None 其他文件类工具:pipes,fifos,sockets. 类型转换: str(),repr()或format():将非字符型数据转换成字符: int():转换为整数 float():转换为浮点数 list(x):可以把字符串x转换为列表, tuple(x):将字符

JAVA 【引用类型】和【对象类型】在【继承】中的异同

介绍 JAVA [引用类型]和[对象类型]在[继承]中的异同.这个问题自己整理过N次.也被人当菜鸟问过N次.所以,在此简单整理一下.以供大家分享. 在继承关系中.一般成员变量是依据引用类型 在继承关系中.静态成员变量是依据引用类型 在继承关系中,一般方法是依据对象类型 在继承关系中,静态方法是依据引用类型 注意 静态成员变量,静态方法是基于类的,本文为了測试观察.所以.会用对象去引用静态成员变量和静态方法. Super Class: package shuai.study.inherit; pu

Python 二、Python对象类型及其运算

一.Python对象的相关术语 Python中一切皆对象,python程序中保存的所有数据都是围绕对象这个概念展开的:所有的对象都是由类实例化而来的,只不过这些类有些是python内置的类:例如,整数和浮点数,字符串都是由python内置的类实例化而来的.除此之外用户还可以自定义类型,就是类. python程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 例如,school="MaGe Linux"会以"MaGe Linux"创建一个字符串对象,

C# in Depth Third Edition 学习笔记-- 值类型和引用

I. C#中值类型和引用类型 1. 类class 引用类型,结构struct值类型 2. 数组是引用类型,即使元素是值类型,int[]是引用类型 3. 枚举是值类型enum 4. 委托类型delegate是引用类型 5. 接口类型interface是引用类型,但可以由值类型实现. II. 值的表达式:表达式“2+3”的值就是5:而对于引用类型的表达式,它的值是一个引用,而不是该引用所指代的对象,如String.Empty的值不是一个空字符串,而是对空字符串的一个引用. III. 变量的值在它声明

javascript 判断对象类型

typeof typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不同的结果. 此表总结了typeof所有可能的返回值: 操作数类型 返回值 undefined "undefined" Null "object" Boolean "boolean" Number "number" String "string" 函数对象 "function" E4X XM

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

对象类型在内存中的分配

今天,我们来讲讲对象类型在内存中的分配! 对象类型和整型.字符串等类型一样,也是PHP中的一种数据类型,在程序中存储不同类型的数据,在程序运行时它的每一部分内容都要加载到内存中再被使用.那么对象类型的数据在内存中是如何分配的呢?咱们先来了解下内存结构,逻辑上内存大体被分为四段,分别为:栈.堆.数据段和代码段,程序中不同类型数据的声明将会被存放在不同的内存段里面,每段内存的特点是这样的: 1.栈 栈的特点就是空间小但被CPU访问的速度快,适合存放程序中临时创建的变量.由于栈的先进后出的特点,所以栈

git对象类型及存储结构讲解

本文git版本1.9.6 一.git的基本对象类型 二.查看git对象信息 三.理解git存储结构 1.Git中有四种基本对象类型,组成了Git更高级的数据结构: blobs每个blob代表一个(版本的)文件,blob只包含文件的数据,而忽略文件的其他元数据,如名字.路径.格式等. trees每个tree代表了一个目录的信息,包含了此目录下的blobs,子目录(对应于子trees),文件名.路径等元数据.因此,对于有子目录的目录,git相当于存储了嵌套的trees. commits每个commi

thinkeing in java--java中的基本对象类型及其如何存储

一.java中对象的分类 1.基本类型 基本类型 大小 最小值 最大值 包装器类型 boolean --- --- --- Boolean char 16-bit Unicode o Unicode 216-1 Character byte 8 bits -128 +127 Byte short 16 bits -215 +215-1 Short int 32 bits -231 +231-1 Integer long 64 bits -263 +263-1 Long float 32 bits