概念
Javascript是一門動態(tài)
、弱類型
語言。
何為動態(tài)?
既定義了一種類型的數(shù)據(jù),仍然可以賦值為其他類型的數(shù)據(jù)。
例如:
var x = 1;
x = 'string'
何為弱類型?
既兼容不同類型之間的數(shù)據(jù)進行比較。
例如:
var x = true;
var y = 1;
console.log(x == y) // true
類型轉換
在JavaScript中,類型轉換可以分為兩類:顯式類型轉換
和隱式類型轉換
顯式類型轉換
定義
顯式轉換既通過函數(shù)進行手動的類型轉換。
下面通過Number()、String()、Boolean()這三個基本類型函數(shù)進行舉例,主要從基本數(shù)據(jù)類型和對象兩方面進行闡述。
Number()
對于基本數(shù)據(jù)類型,其轉換規(guī)則如下:
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(1)); // 1
console.log(Number('1')); // 1
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number('')); // 0
console.log(Number('a')); // NaN
總結:
-
對于null和undefined兩類比較特殊的值,分別返回null和NaN
(個人理解:因為null是一個對象,只是當前值為null,所以返回0;undefined的意思是并未進行定義,因此返回NaN)
對于true和false,則和日常理解一致,分別返回 1 和 0
-
對于字符串:
若為空,則返回0
若為純數(shù)字字符串,則返回對應數(shù)字
其余字符串則返回NaN
對于對象,其轉換規(guī)則如下:
簡單來說,大部分對象都會得出NaN
的結果。(對于對象沒有進行深究...以后仔細看了再進行補充)
String()
對于基本數(shù)據(jù)類型,其轉換規(guī)則如下:
console.log(String(null)); // 'null'
console.log(String(undefined)); // 'undefined'
console.log(String(1)); // '1'
console.log(String('1')); // '1'
console.log(String(true)); // 'true'
console.log(String(false)); // 'false'
console.log(String('')); // ''
console.log(String('a')); // 'a'
總結:
根據(jù)具體內容轉換為對應的字符串
對于對象,其轉換規(guī)則如下:
var x = ['1', '2', '3'];
console.log(String(x)); // 1,2,3
var y = {
value: 'demo'
}
console.log(String(y)); // [object Object]
總結:
對于數(shù)組,會轉換為該數(shù)組對應的字符串
對于對象,會轉換為類型字符串
Boolean()
除了空字符串、數(shù)字0、fasle、null、undefined、NaN這幾類數(shù)值外,其余數(shù)值均轉化為true
// 以下表達式均返回false
console.log(Boolean(''));
console.log(Boolean(0));
console.log(Boolean(false));
console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean(NaN));
隱式類型轉換
定義
隱式類型轉換既在進行某些操作(例如:+、==,這兩種運算符使用頻率最高)時,如果兩邊數(shù)據(jù)的類型不一致,數(shù)據(jù)會自動進行類型轉換再進行運算。
當進行隱式類型轉換時,主要是涉及以下三種轉換:
ToPrimitive
ToNumber
ToString
至對應不同的運算符也會有各種各樣的情況發(fā)生,這里不做詳細介紹。日后若做了系統(tǒng)學習再進行補充...(詳情可看參考文章的第4篇)
參考文章
-
數(shù)據(jù)類型的轉換
https://wangdoc.com/javascript/features/conversion.html#number
-
What exactly is Type Coercion in Javascript?
https://stackoverflow.com/questions/19915688/what-exactly-is-type-coercion-in-javascript
-
有趣的JavaScript隱式類型轉換
-
你所忽略的js隱式轉換
https://juejin.im/post/5a7172d9f265da3e3245cbca#heading-8
(這篇文章對隱式轉換有較為詳細的介紹)
-
ECMAScript規(guī)范
https://ecma262.docschina.org/#sec-toprimitive
(關于類型轉換,規(guī)范里面也會有詳細的解讀,而且看規(guī)范文檔是最為官方的)