JavaScript 語言核心(4)弱型別的代價 - WAT!
|
JavaScript 語言核心(3)你的變數 var 了嗎? << 前情 在程式語言的分類上,有所謂強型別(Strong type)、弱型別(Weak type)語言,強弱之別是相對的,沒有絕對之分野,端看語言對型態檢查的嚴格程度、型態轉換規則是否多元。 靜態定型語言不一定就是強型別語言,例如 Scala 可以使用 Java 偏向強型別語言,在 Java 中運算或操作,較少有自動之型態轉換,舉例來說,字串在 Java 中不能直接作以下之操作: String number1 = "3"; String number2 = "2"; int result = number1 - number2; 在偏向強型別的語言中,多數情況下型態轉換或剖析必須明確指定。例如: String number1 = "3"; String number2 = "2"; int result = Integer.parseInt(number1) - Integer.parseInt(number2); 並非偏向強型別的語言,就不會發生自動型態。例如,Java 中的 String number = 1 + "23"; // "123",基本型態按字面轉為字串 Person person = new Person(); String description = "Person: " + person; // 呼叫 person 的 toString() JavaScript 偏向弱型別語言,字串的減法操作是可行的: var result = '3' - '2'; console.log(result); // 1 console.log(typeof result); // number 偏向強型別的語言,多數情況下必須明確進行型態轉換或剖析,避免了許多非預期的自動型態轉換造成的錯誤,然而帶來了語法上的冗長,弱型別語言則相反,取得了語法簡潔的優點,但必須多注意非預期型態轉換帶來的問題。 JavaScript 的基本型態 > var number = 10; undefined > number.toString(2); '1010' > (10).toString(2); '1010' >
類似地,在對 > 'caterpillar'.toUpperCase(); 'CATERPILLAR' >
你可以直接建立包裹物件。例如: > typeof 10;
'number'
> typeof 'caterpillar';
'string'
> typeof new Number(10);
'object'
> typeof new String('caterpillar');
'object'
>
關於 你也可以使用 > parseInt('10 years old...XD');
10
> parseFloat('3.14159......');
3.14159
> parseInt('0x10');
16
> parseInt('010');
10
> parseInt('010', 10);
10
> parseInt('010', 8);
8
>
後兩個 對於字串,如果代表數字的話,可使用 > '6' + '2'; '62' > '6' - '2'; 4 > '6' * '2'; 12 > '6' / '2'; 3 > 在 JavaScript 中若結合布林值作 > 1 + true; 2 > 1 + false; 1 > 布林值很有趣,在真假判斷式中,所有東西都可以轉換為布林值。一個口訣是 …
0、 例如,若物件上不存在某個特性,直接取用該特性會得到 > var o = {};
undefined
> o.x ? 'has x' : 'has no x';
'has no x'
> o.x = 10;
10
> o.x ? 'has x' : 'has no x';
'has x'
>
在布林值判斷式中,如果取得 function hasX(obj) {
return typeof(obj.x) !== 'undefined';
}
console.log('has x? ' + hasX({})); // has x? false
console.log('has x? ' + hasX({x : 10})); // has x? true
型態轉換也會發生在相等性比較時,在 JavaScript 中有兩個相等性運算子 > '' == 0; true > '' === 0; false > null == undefined; true > null === undefined; false > 1 == true; true > 1 === true; false > 簡單來說, 在弱型別語言中,型態轉換自動發生的規則多,若是不確定,最好還是實際測試了解結果,避免不必要的型態轉換而發生誤判或錯誤的運算結果。 以下來看幾個初學者容易 WAT 脫口而出的例子: > [] + [];
''
> [] + {};
'[object Object]'
> {} + [];
0
> {} + {};
NaN
>
這個例子其實是來自 Gary Bernhardt 在 CodeMash 2012 時的一場 WAT 閃電秀,有時間的話,上去看看笑一笑吧!
|

Java 學習之路





