之間有什麼區別:的ActionScript - 變量聲明差異
var arr3 = new Vector.<int>(6);
到
var arr3:Vector.<int> = new Vector.<int>(6);
謝謝!
之間有什麼區別:的ActionScript - 變量聲明差異
var arr3 = new Vector.<int>(6);
到
var arr3:Vector.<int> = new Vector.<int>(6);
謝謝!
使用第二個選項。在第一種情況下,您將收到警告消息:
Warning: Error code: 1008: variable 'arr3' has no type declaration.
第一個變量是無類型的。如果聲明一個變量,但不聲明其數據類型,則將應用默認數據類型*****,這實際上意味着該變量是無類型的。如果你還沒有使用一個值初始化一個無類型的變量,那麼它的默認值是未定義的。
第二個輸入爲Vector ..用Vector聲明的變量。數據類型只能存儲使用相同基本類型int構造的Vector實例。例如,通過調用新的Vector.()構造的Vector不能分配給用Vector聲明的變量。數據類型。
這是聲明變量類型和不是的區別。雖然在AS3中聲明一個類型是可選的,但最好的做法是始終聲明一個類型。
對你的代碼的影響是,如果你聲明一個類型,它只會在該類型的值被賦值給該變量時纔會被正確編譯和運行,並且它將被嚴格視爲該類型的對象,沒有其他的。這被稱爲「類型安全」。如果你沒有聲明一個類型,你可以給這個變量賦值任何東西,並將代碼編寫爲任何類型的對象 - 這聽起來很方便,但最終會讓代碼變得更加混亂,脆弱和容易出錯。
另外請注意,不是聲明一個類型是等於宣告它作爲一個「通配符」類型,像這樣:var arr3:*
下面是類型化VS代碼類型變量的例子:
var untyped:*;
var string:String;
var number:Number;
var integers:Vector.<int>;
untyped = 1; // ok
untyped = "hello"; // ok
untyped = new Vector.<int>(); // ok
string = 1; // compile error
string = "hello"; // ok
string = new Vector.<int>(); // compile error
number = 1; // ok
number = "hello"; // compile error
number = new Vector.<int>(); // compile error
integers = 1; // compile error
integers = "hello"; // compile error
integers = new Vector.<int>(); // ok
if (untyped == 1) // ok
if (untyped == "hello") // ok
if (untyped.fixed) // compiles ok, but throws runtime error if "fixed" not defined on non-dynamic object
if (string == 1) // compile error, invalid comparison
if (string == "hello") // ok
if (string.fixed) // compile error, "fixed" not a property of String
if (number == 1) // ok
if (number == "hello") // compile error, invalid comparison
if (number.fixed) // compile error, "fixed" not a property of Number
if (integers == 1) // compile error, invalid comparison
if (integers == "hello") // compile error, invalid comparison
if (integers.fixed) // ok
這些編譯錯誤有助於向您(或其他開發人員)在變得難以追查SWF中的問題之前向您顯示錯誤。例如,考慮這種無類型代碼:
var value = "hello";
if (value.x < 10) { }
該代碼沒有太大意義,但它會編譯。然後,當您嘗試執行if
語句並在String
「hello」上找不到x
時,您將遇到運行時錯誤。在現實生活中,你可能需要做大量的狩獵才能弄清楚什麼是錯誤的,特別是如果這兩條線彼此靠得不近。不過,如果程序員已經指定的變量類型,它將使代碼更安全類型:
var value:Point;
if (value.x < 10) { }
在這種情況下,如果你想分配value = "hello"
代碼將無法編譯。編譯器也會驗證x
是Point
類型的屬性。如果不是,那麼你也會在那裏發現一個編譯錯誤。它甚至知道x
可以使用<
進行比較,因爲它是Number
。這對於儘早發現錯誤非常有幫助。
除了使程序員對代碼更清楚之外,它還使創作工具更加清晰 - 大多數創作工具會爲類型化對象提供更好的代碼完成建議,因爲它確切知道哪些屬性和方法該類型的對象具有。
由於這些原因和其他原因,您很少會發現不使用嚴格類型聲明的AS3代碼示例,並且大多數程序員(包括我)會建議您始終使用它們。
大家的好答案。但真正的答案會更進一步。在情況1中變量沒有類型,而在情況2中變量具有類型。不同的是,在第二種情況下,編譯器能夠爲您提供信息,以防萬一代碼中出現錯誤。在第一種情況下,如果代碼中出現錯誤,編譯器可能會提供一些信息甚至根本沒有信息。如果使用非類型化變量(情況1),則如果代碼中存在任何錯誤,則開發人員將自行開發。你將成爲尋找他們並嘗試修復他們的人。在第二種情況下,編譯器會告訴你哪裏存在錯誤,並且很可能是爲什麼存在錯誤。
我想你錯過了我的答案。 ;) – Aaron 2015-02-10 17:37:20
這不是他的問題,他問兩個選項之間的區別。 – DodgerThud 2015-02-10 14:29:50