1. 程式人生 > >as3(ActionScript3)關於物件(Object)的賦值與引用的一些整理

as3(ActionScript3)關於物件(Object)的賦值與引用的一些整理

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);//6trace(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 411 11 4 4 411 11 4 4 1111 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());}

相關推薦

JAVA中物件引用

前言 最近在學習紅黑樹,當我嘗試不使用遞迴來實現時,發現自己的大腦陷入了混亂。 究其原因,是對JAVA中的基本型別和引用型別有所誤解。 特地重新搜尋+實踐一番,漲個姿勢。 一番折騰 先找個物件過年 class Node {

as3(ActionScript3)關於物件(Object)的引用一些整理

as3 的值和引用在此整理一下:as3 的值和引用這兩者比較有關係的是“賦值”和“函式傳參”兩個行為,期間又需要分“基元型別”和“物件”來討論。我們知道Flash as語言中所有的資料型別都繼承自Object,包括基元

深入理解PHP中引用

str ring int 之前 不同 重新 small nts 計數 【原文】 先看下面的問題: 1 2 3 4 5 6 7 8 <?php $a = 10;//將常量值賦給變量,會為a分配內存空間 $b = $a;//變量賦值給變量,是不是

關於 = 的引用

關於 = 的賦值與引用 var a = 10; var b = a; b++; console.log(a); // 10 // 變數a,b均為基本資料型別; 顯然a不會隨著b的改變而改變; var a = [1,2,3]; var b = a; b.push(4); console.log(a

指標的引用

1.指標的賦值 int a = 24; int *p = &a;//指標的初始化 *p = 25;//指標的賦值 2.引用的賦值 int a = 24; int b = 0; int &am

指標變數的引用&&二重指標

研究問題: 函式引數問題(一級指標與二級指標)?區分實參與值參? 指標變數的賦值和做函式的引數?? 指標到底是變數,還是地址??? 指標變數需要另外開闢記憶體儲存? 要點: 指標變數有時也可以簡稱為”指標”(大多數情況下),它是存放它所指向的變

js陣列及物件引用

   簡要歸納:    1、普通的賦值是複製棧區內容。    2、基本型別的資料在棧區存放資料自身,var a=b; //a與b無關。         引用型別資料在棧區存放資料地址。  var a=b; //a,b聯動    3、基本資料型別包括:undefined,bo

WPF 之 XAML語法,物件屬性(簡單、TypeConverter 標籤屬性物件屬性對映、標記擴充套件),引用外部庫

一、XAML樹形結構       框架都是樹形的,以<Window>物件為根節點,一層一層向下包含。這種樹形結構對於WPF整個體系都具有非常重要的意義,它不但影響著UI的佈局設計,還深刻的影響著WPF的屬性(Property)子系統和事件(Event)子

C++物件C#物件----C++C#傳遞引用傳遞淺析

在C#中,看下面一段程式: class A     {         public int value;         public A(int x)         {             value = x;         }         public

JS學習之引用

內容 當前 都沒有 分享 img 定義 con png 技術分享 1、基本類型 基本的數據類型有:undefined,boolean,number,string,null。 基本類型存放在棧區,訪問是按值訪問的,就是說你可以操作保存在變量中的實際的值。 當基本類型的數據賦

JAVA中String直接new出來的物件的區別

舉個例子,比如 String  she = "fdasfdg" 與 String she = new String("fdasfdg"); 他們到底有什麼區別?   String  she = "f

JS 的引用

這個問題說大不大說小不小,如果你有幸踩了這個坑,一定會找這篇文章,哈哈~ 現說一下JS數字的型別:基本型別和引用型別 先看下下面兩個栗子: 1 2 3 4 5 6 7 8 9 var a = 30; var b = a; a

vue 爬坑 之js 物件/陣列 /拷貝 解決VUE中引用後資料雙向改變的問題

淺拷貝這裡就不講了,我們直接講深拷貝 正常的陣列/物件拷貝可以直接用 const cloneObj = JSON.parse(JSON.stringify(Obj)); 這種方式可以解決相當多一部分的賦值問題,但是一些特殊屬性除外(undefined/function)

java中,只宣告一個物件宣告一個物件為null,有啥區別?

轉自:http://www.oschina.net/question/557858_127408 http://zhidao.baidu.com/link?url=rp_hAuPys2vMPnir0t7IFccKVnwEm8zHI7-wEoBSJXw05SAmKHGOObT

C++第三章(類和物件)下篇 (動態建立釋放,物件和複製,靜態資料成員,友元)

一,物件的動態建立與釋放 new (程式設計師怎麼會沒有朋友??? 來讓我給你new 一個) 在我學過的c中 我們一般都用 malloc 來動態申請空間。現在我們可以用new 來申請空間 Box *pt; pt = new Box; c++允許在new時進行賦值 Box *

物件、陣列傳遞引用傳遞

開發過程中經常會遇到如下情況,將一個物件賦值給另一個物件,修改後者,前者也隨之改變,場景程式碼如下: 控制檯輸出入下圖: 造成以上現象的原因,個人總結如下: 物件,陣列都是引用型別資料,在上述賦值操作過程中,僅僅是將儲存在棧中的路徑進行的賦值,而未對堆中的資料進行賦

JavaScript 的引用

<script> var arr1=[1,2]; var arr2=arr1; arr2.push(3); console.log('arr1為:'+arr1); console.log('arr2為:'+arr2);

定義一個String物件直接使用“=” new 建立物件 有何區別?

經常在java程式設計師面試的過程中,面試官經常會問到下面這個問題:String strA = "abc"; String StrB = new String("abc");這兩行程式碼中分別建立了幾個物件?【答案】第一行程式碼建立了1個物件,第二行程式碼建立了2個物件;【解

Javascript引用復制的傳遞

color javascrip pan 函數 font clas div ava nts 1 function foo(x) { 2 x.push(4) 3 console.log(x); // [1, 2, 3, 4] 4

Verilog堵塞非堵塞

解決 ont mark con 原理 inpu 特點 全部 cal verilog設計進階 時間:2014年5月6日星期二 主要收獲: 1.堵塞賦值與非堵塞賦值; 2.代碼測試; 3.組合邏輯電路和時序邏輯電路。