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());
}
相关推荐
综上所述,《一种新的纹理基元发现及表达方法》提出的创新技术,通过结合数据挖掘技术和纹理分析,为纹理基元的识别和表达开辟了新路径。这种方法不仅简化了纹理分析的复杂性,提高了算法的实用性,还为解决模糊和...
遗传算法是一种模拟自然界生物进化过程的优化方法,它在解决复杂问题,如基元识别与提取,中展现出强大的潜力...通过深入研究和实践,我们可以掌握如何在复杂问题中运用遗传算法,并且提升在噪声环境下的数据处理能力。
动态运动基元(Dynamic Movement Primitives, DMPs)是一种在机器人学和自动化领域广泛应用的运动控制模型。它主要用于描述和生成复杂的运动轨迹,尤其适用于那些需要快速学习和灵活适应新任务的情况。DMPs的核心...
4. 使用Vue的计算属性和侦听器:对于需要进行复杂逻辑处理的数据,我们可以使用计算属性或侦听器来管理这些值。计算属性会在其依赖的响应式数据变化时更新,而侦听器可以在数据变化时执行异步或开销较大的操作。这样...
分层形式和多枝形式的结合使得图、层、串、基元之间的关系变得更加复杂,但这也是实现动态分层组织的关键所在。通过动态通用串结构,可以对这些关系进行更有效的管理,从而实现矢量数据的高效组织和操作。 文章最后...
综上所述,OpenCV基元检测涵盖了图像处理中的关键步骤,从基础的边缘和角点检测,到更复杂的blob检测和多尺度特征提取。这些算法在现实世界的应用中,如机器人导航、自动驾驶、无人机视觉和安防监控等领域都有广泛的...
多传感器融合技术能够整合来自不同传感器的数据,为机器人提供一个更全面和准确的环境感知能力。 综上所述,本文提出的基于动态运动基元的机器人行为轨迹控制方法,通过一系列高效且精确的控制策略,有效解决了...
而MCMC_Z算法通过结合最小化距离准则和鲁棒Z分数方法,在建立初始几何基元模型和进行迭代拟合的过程中有效地排除这些干扰,从而实现对复杂和噪声较大点云数据的精确处理。 在具体实施算法的过程中,研究者首先会从...
点云处理是计算机视觉和3D几何处理领域中的重要...这些技术在计算机视觉、机器人学和光学领域有着广泛的应用,是理解和处理复杂3D数据的基础工具。通过深入理解和掌握这些方法,可以提升对点云数据的分析和处理能力。
【大数据-算法】在本文中,虽然主要讨论的是焚烧炉条件下典型城市生活...总结来说,大数据和算法在垃圾焚烧领域的应用展示了如何通过数据分析和模型构建来优化复杂过程,提高资源利用效率,并为环境保护提供科学支持。
"geo:Crystal的地理空间基元和算法"是关于使用Crystal编程语言实现地理空间处理的库,它包含了一系列用于处理地理坐标、计算地理位置关系以及执行相关算法的工具。这个库对于需要在Crystal应用中处理地图数据、定位...
这些统计特性可以提供关于纹理结构和复杂性的信息。 5. **特征向量的构造**:将所有方向和方格的统计特征组合成一个特征向量,这个向量可以作为图像的纹理描述符。 6. **应用**:特征向量可用于后续的图像分类、...
在导弹武器系统的性能评估中,数据挖掘技术的应用能够帮助科学家和工程师们深入挖掘出系统性能与各项参数指标之间的复杂关系,这对于提高系统效能、优化设计具有极大的理论和实践价值。 首先,文章中提到的“可拓...
基于AD9224及FPGA的高速数据采集系统设计涉及到一系列复杂的电子工程设计概念和实践。AD9224是一款高精度模数转换器,而FPGA(现场可编程门阵列)是一种可以通过硬件描述语言编程的逻辑芯片,非常适合执行高速数据...
运行后,你可以得到拟合的基元形状参数,如平面的法线向量和距离,直线的方向向量和原点,或球体的中心坐标和半径。 总的来说,"pyRANSAC-3D-master"是一个强大的3D点云处理工具,它利用RANSAC算法帮助用户从复杂...
动态贝叶斯网络尤其受到关注,因为它能够以联合概率关系的形式表示变量之间的因果关系,非常适合处理视频中人体运动这种既具有特征相关性又具有时序相关性的复杂数据。 动态贝叶斯动作网(DBAN)是动态贝叶斯网络的一...
动态运动基元(Dynamic Movement Primitives, DMPs)是机器人控制领域的一种重要技术,它在机器人示教和学习过程中扮演着核心角色。DMPs允许机器人通过模仿人类的动作来学习复杂的运动模式,具有良好的灵活性和通用...
ActionScript 3.0的数据类型分为两类:基元值(Primitive Types)和复杂值(Complex Types)。基元值包括Boolean、int、Null、Number、String、uint和void,它们是构建程序的基础单元。复杂值则包括Object、Array、...
Python作为一个强大且流行的编程语言,提供了许多用于加密和解密数据的库。"密码术"(cryptography)正是这样一个面向Python开发者的重要软件包,它使得密码学的原理和实践变得易于理解和使用。 密码术库提供了一...