2011-11-01

[筆記] 挑戰TJS 1.9

TJS裡面有些語法,還有點不太適應,只好在這邊做個筆記提醒自己:)

像是1.9章提到,比較用的運算元
==左側と右側が等しければ真、等しくなければ偽。両側の値の型が違う場合は自動的に変換されてから比較されます。
!=左側と右側が等しければ偽、等しくなければ真。両側の値の型が違う場合は自動的に変換されてから比較されます。
===左側と右側が等しく、かつデータ型が一致していれば真、そうでなければ偽。
!==左側と右側が等しく、かつデータ型が一致していれば偽、そうでなければ真。

其實就在於使用==時,程式會自動將兩邊的型態先做轉換再進行比較,
而===不會。進行轉換是什麼意思?其實可以看看下面的例子就很清楚。
var a;
if(a === void)
  System.inform("a === void");
else
  System.inform("a !== void");
var intA = (int) a;
System.inform("intA = " + intA);
var stringA = a;
System.inform("stringA = " + stringA);
一個未初始化的變數a,其實就是void的型態。
(這邊要注意一下,TJS中,void也是一種型態喔)
當你把他轉成int時,他就是0。
當你把他轉成String時,他就是空字串(顯示不出任何字元)。

因此底下這段程式碼
var a;
if( a == 0 )
  System.inform("a == 0"); //這行會印出
由於使用了==的關係,程式等同於會把a轉換成int在進行比較,於是0 == 0,條件成立。

再稍微延伸一下到字串的範圍,如同底下這段程式碼var a = "";
if(a == void)
  System.inform("a == void"); //這行會印出
由於void轉換成String就是空字串,因此當比較a == void時,空字串 == 空字串,條件成立,印出a == void。

這就是會進行轉換的意思了,相對的,就造成了些麻煩,像是:
var a;
if(a == void)
  System.inform("a == void"); //這一行會印出
if(a === void)
  System.inform("a === void"); //這一行也會印出
這兩個條件式就都會成立,因此真的要判斷是不是=== void時,最好是把判斷式 === void放到最上面,否則容易受到== void的影響。

反過來說,減少== void這樣的用法,而改用更精確的== ""或是== 0,或許是更保險的作法。

再讓我們看一段程式。
var a="";
if(a == void)
  System.inform("a == void");
if(a === void)
  System.inform("a === void");跟上面很類似,但是多給a加上初始值為空白字串,你覺得會印出什麼呢?
答案是只有a == void,在這邊第二個條件式就不成立了,畢竟空字串跟void是不同的資料型態。

最後講一下null這個東西,在TJS中,void跟null其實是不同的東西,null是專門給Object使用的關鍵字。
var a = null;
if(a == void)
  System.inform("a == void");  //這行不會印出
if(a === void)
  System.inform("a === void");  //這行也不會印出
System.inform("a = " + a);
System.inform("typeof(a) = " + typeof(a) );
在這段程式中,由於指定了null給變數a,可以把他想像成類似Java語法中的a = new Object()。

既是這樣,a的內容就不再是空字串或是0了,而是一個Object,這便造成兩個條件式都不符合的情況。

實際上a是什麼東西可以看最後兩行印出的,其分別是
a = (object 0x00000000:0x00000000)和typeof(a) = Object

總之就是有點讓人煩惱的小東西吧:)

1 意見:

0Mission0 提到...

好亂( ̄▽ ̄)
看來要找機會修整一下XD