as3 的值和引用在此整理一下:
as3 的值和引用这两者比较有关系的是“赋值”和“函数传参”两个行为,期间又需要分“基元类型”和“对象”来讨论。
我们知道Flash as语言中所有的数据类型都继承自Object,包括基元数据类型,但是在值和引用操作时它们的确需要区别对待。
我们将基元数据类型称为“非结构对象”,与之对应的其他Object称为“结构对象”。
下面将进行几种实验,结论大概就是
1、 基元数据类型按照值操作,代表基元数据的非结构对象也是按照值操作的。
2、 结构对象一般按照“引用”操作,但需要注意交换赋值的情况
3、 As3中的“引用”操作其实不是真正意义上的引用,只是类似于“指针”传递的一种伪“引用”。As3中所有操作底层意义都是值操作,只不过针对结构对象时是“指针”值的值操作。
4、 As3中的函数传参,对基元类型相当于新副本的值操作。对结构对象,相当于“指针”值新副本的值操作。
5、 必要的时候使用深层次拷贝操作,特别是在多层次框架结构中。
=================
基元类型(包括 Boolean、Number、int、uint 和 String)
赋值:按照值操作。
var a:int=3;
var b:int=a;
b=6;
trace(a,b);// 3 6 即 b的改变不会带来a的改变
函数传参:按照值操作
var a:int=3;
function f1(b:int):void{
b=6;
}
f1(a);
trace(a);//3 即在函数内部生成了新副本,其变化不会带来a的改变
与前面的赋值操作是等价一致的
=================
对象Object
赋值:按照引用操作
var a:Object={x:1,y:2};
var b:Object=a;
b.x=6;
trace(a.x);//6 即 b的改变会带来a的改变
—-下面模拟复杂对象赋值—
var c:Object={i:10,j:11}
var a:Object={x:1,y:c};
var d:Object=a.y;
var b:Object=a;
d.i=6;
trace(a.y.i);//6
trace(b.y.i);//6 这里需要格外注意,as3的引用行为是无孔不入的,自定义对象的子对象遭遇引用操作,特别是多层架构中,隐蔽的引用操作会带来意想不到的问题。
函数传参:结构对象按引用操作;代表基元类型的非结构对象,按值操作
var a:Object={x:3};
function f1(b:Object):void{
b.x=6;
}
f1(a);
trace(a.x);//6 一如既往的引用操作,但请注意下面
—–代表基元类型的对象—-
var a:Object=Object(3);
function f1(b:Object):void{
b=6;
}
f1(a);
trace(a);//3 如果Object代表基元类型,那则按值来操作
=============================
貌似到这里关于as3的值和引用归类总结已经结束了,其实不是的。
看下面一段代码。
var a:Object={x:1};
var b:Object={x:4};
var c:Object;
c=a;
a=b;
b=c;
trace(a.x,b.x);
结果不出意外的是 4 1 ,我们继续看下面代码
var a:Object={x:1};
var b:Object={x:4};
function swapObj(i:Object,j:Object):void
{
var k:Object;
k=i;
i=j;
j=k;
}
swapObj (a,b);
trace(a.x,b.x);
结果是什么呢?却不是我们想的 4 1,而是 1 4
这里发生了什么故事,我们继续试验
var a:Object={x:1};
var b:Object={x:4};
function swapArr(i:Object,j:Object):void
{
var k:Object;
k=i;
k.x+=10;
trace(k.x,a.x,b.x,i.x,j.x);
i=j;
trace(k.x,a.x,b.x,i.x,j.x);
j=k;
trace(k.x,a.x,b.x,i.x,j.x);
}
swapArr(a,b);
trace(a.x,b.x);
————————
11 11 4 11 4
11 11 4 4 4
11 11 4 4 11
11 4
看起来很让人头疼,我直接画图摆结论吧,as3所谓的引用操作过程中只是指针值的操作,并不是真的引用。
至此,as3值和引用操作真正有价值的东西才算讲了一点点。
要善用函数返回值,不要想当然的把对象传进去就认为函数自己会按照引用操作去完美的工作。
遇到可能出现这种问题的情况,要善用深层次拷贝。
比如比较常用的Array,默认并没有提供clone函数,那就按照如下操作进行深层次拷贝,来保证代码流转过程中的逻辑正确和减少未知引用关联。
import flash.utils.ByteArray;
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
相关推荐
该方法分别基于点基元和对象基元提取特征向量,并结合色彩信息,利用随机森林对点云数据进行分类。实验结果表明,所提的多基元分类方法相较于单基元分类方法能够获得更高的分类精度。为了进一步分析随机森林用于点云...
Cubert是一个快速高效的批处理计算引擎,用于在Hadoop上对海量数据集进行复杂的分析和报告。 托管在github上。 Cubert用户Google组: 。 电子邮件: Cubert非常适合以下应用领域: 统计计算,联接和聚合 Cubert...
所有预定义的结构都基于伪原始类型SArray# , SBytes# , STArray# , STBytes# , MIOArray# , MIOBytes# ,它们封装了具有正确大小和偏移量的真实基元。 sdp使用模板定义更复杂的结构: AnyBorder添加任意类型...
一个基于预期泵优化算法的人工神经网络。存储思想在这里被提了出来。... 本文描述如何选择和组织输入数据和如何训练ANN。 现有的例子和与传统方法的比较做可得出,用ANN可以获得快速和精准的存储表。
矩阵和图像操作 绘图 数据存储 集成性能基元 小结 练习 第4章 细说HighGUI 一个可移植的图形工具包 创建窗口 载入图像 显示图像 视频的处理 ConvertImage函数 练习 第5章 图像处理 综述 平滑处理 图像形态学 漫水...
集成性能基元 小结 练习 第4章 细说HighGUI 一个可移植的图形工具包 创建窗口 载入图像 显示图像 视频的处理 ConvertImage函数 练习 第5章 图像处理 综述 平滑处理 图像形态学 漫水填充算法 尺寸调整 图像金字塔 ...
在可拓学中,为了形式化描述物、事以及它们的关系建立了基元的概念,能够帮助人们以一种简洁明了的客观描述研究复杂矛盾的问题。可拓物元模型在对每一个指标状态评价等级定义的基础上,通过选取指标的区间划分,将各...
SimXpert 的许多特性超出了典型高性能计算 (HPC) 的纯数字应用,这些特性包括复杂的含有几何数据和模拟结果的数据库风格操作、复杂的内存分配运算、对广泛的企业级基础设施 C++ 代码的依赖、适合英特尔® TBB 管道...
人机结合的综合集成研讨厅体系,将专家体系、机器体系和数据体系有机结合起来组成智能系统,该方法的...2)从智能系统角度,综合集成研讨厅体系,以[人,网络计算机]为基元,通过以复杂问题为牵引的交互和组织,形成了
人机结合的综合集成研讨厅体系,将专家体系、机器体系和数据体系有机结合起来组成智能系统,该方法的成效依赖于系统的整体...综合集成研讨厅体系,以[人,网络计算机]为基元,通过以复杂问题为牵引的交互和组织,形成了
----过去,在设计以Java技术为基础的微处理器方面一直存在不同的方法。JVM结构是基于堆栈的;...该方法可以利用在RISC技术上所取得的进展,因为将基于堆栈的序列转换为RISC基元比较复杂,设计上难度较大。基于Java技术的
参数名编译后丢失)数据验证和错误处理DRY原则业务逻辑异常和数据校验异常被混在了一起把数据验证的工作量初始到了调用方,而调用方本来就是应该提供合法数据的,所以更加合适业务逻辑代码的预设面向过程编程胶水...
目前不支持复杂数据类型。 支持的数据类型: 整数基元: Int64 , Int32 , Int16 , Int8 浮点图元: Float64 , Float32 复杂原语: Complex{T} ,其中T是整数或浮点类型 数组: Array{T,N}用于整数,浮点数和...
机器学习和数据科学的管道和基元。 美国职业棒球大联盟 文档: : GitHub: : 执照: 发展状况: Alpha之前 概述 MLBlocks是一个简单的框架,可通过将任何python库中的工具与一个简单,通用且统一的接口无缝组合...
基于MPU 方法的点云模型布尔操作算法,张三元,钟宇亮,点云模型以离散采样点为基元的几何模型,具有数据结构简单、存储空间紧凑,能够表达任意复杂表面细节,是造型所有表达方式中最自��
原始数据和解密后的数据;添加两个Button 控件,分别用来实现利用ROT13算法加密和解密数据的功能。 (3)程序主要代码如下: public string ROT13Encode(string InputText) { char tem_Character; //存储临时字符 ...