1,強弱類型的判別; 按照電腦語言的類型系統的設計方式,可以分為強型別和弱類型兩種。二者之間的區別,就在於計算時是否可以不同類型之間對使用者透明地隱式轉換。從使用者的角度來看,如果一個語言可以隱式轉換它的所有類型,那麼它的變數、運算式等在參與運算時,即使類型不正確,也能通過隱式轉換來得到正確地類型,這對使用者而言,就好像所有類型都能進行所有運算一樣,所以這樣的語言被稱作弱類型。與此相對,強型別語言的類型之間不一定有隱式轉換。
強型別如c,在c中的算術轉換中對於所有比int小的類型,包括char, signed char, unsigned char, short, unsigned short,首先會提升為int類型。
在進行運算時,以運算式中最長類型為主,將其他類型位據均轉換成該類型,如:
(1)若運算數中有double型或float型,則其他類型資料均轉換成double類型進行運算。
(2)若運算數中最長的類型為long型.則其他類型數均轉換成long型數。
(3)若運算數中最長類型為int型,則char型也轉換成int型進行運算。算術轉換是在運算過程中自動完成的。
2,js弱類型的體現
一般規律是,約束越強越不容易出錯,但編寫程式時也越麻煩。在JavaScript中,因為約束比較弱,所以容易出現這種錯誤:最簡單的例子:
var a =200;
var b ="1";
var c= a + b;
你可能期望c是201,但實際上它是"2001",這個錯誤在強型別語言中決不會出現。然而正是因為JavaScript沒有這些約束,所以可以很方便地拼接數字和字串類型。
再比如下面這個例子:
var a = '11';
a = a - '';
alert(typeof a);// -->number
“-”可以是一元運算子(取負),也可以是二元(減法運算)
在迴圈語句中(if,while)中,一個Object對象可以隱式的轉換從BOOLEAN值。
var obj = {name:'jack'}
if(obj){
//do more
}
比較難以發現的是在alert()函數中。
String.prototype.fn = function(){return this};
var a = 'hello';
alert(typeof a.fn()); //-->object
alert(a.fn()); //-->hello
我們知道this可以理解成當前類的執行個體對象,既然是對象那麼typeof a.fn()自然返回是object了。
關鍵是最後的alert(a.fn()),a.fn()返回的明明是對象,但卻隱式的轉換成了字串“hello”顯示。