型別之間的轉換、比較--數字、原始值、物件
阿新 • • 發佈:2019-02-19
JS中的原始值是不可更改的;
原始值的比較是值的比較,只有在它們值相等的時候它們才相等;
物件的比較時引用的比較,兩個單獨的物件永不相等,當且僅當它們引用同一個基物件時才相等;
通常稱物件為引用型別;
var a = [];
var b = a;
如果將一個物件賦值給另一個物件,賦的是引用,即a和b指向的是同一個引用,物件並沒有複製一次;
如果想得到一個物件的副本,那麼就要顯示的將原物件中的變數、屬性、方法複製到另一個物件中;
轉換:
注意:一個值可以轉換為另一個值,但並不意味著這兩個值相等;比如,undefined會在某些情況下轉換為false,但是undefined不等於false;
顯示轉換:最簡單的方法就是使用包裝物件;
除了undefined和null之外的任何值都具有toString()方法;
JS中的某些運算子會做隱式型別轉換:
如果“+”有一個運算元是字串,那麼另一個會被轉換為字串,a + ""等價於String(a);
一元“+”會把運算元轉換為數字,+a等價於Number(a);
“!”把運算元轉換為布林值然後取反;
轉換為數字的三種方法:
Number()--只能基於十進位制轉換;
toFixed()--引數指定小數位數;
toExponential()--科學計數法,引數是要保留的小數位數;
toPrecision()--科學計數法,引數是有效數字位數;
parseInt()--可接受兩個引數,第一個是要轉換的變數,第二個是進位制;
若第一個字元不是數字,則轉換為NaN;
parseFloat()--同上 (1)原始值-->原始值 簡單; 轉換為數字:以數字表示的字串可以直接轉換為數字,並且允許在開始和結尾處帶有空格; (2)原始值-->物件 原始值呼叫String()、Number()、Boolean()建構函式,轉換為各自的包裝型別; undefined和null除外,他們用在期望是一個物件的地方會造成一個型別錯誤,不會執行正常的轉換; (3)物件-->原始值 所有的物件繼承了兩個轉換方法:toString()和valueOf()
toString()--返回一個反映這個物件的字串;
valueOf()--如果存在任意原始值,他就預設將物件轉換為表示他的原始值,但是物件是複合值,大多數物件無法真正的表示為一個原始值,因此,預設的valueOf()簡單的返回物件本身;
物件轉換為字串:
首先呼叫toString()方法(如果有的話),如果返回的是一個原始值,則將這個原始值轉換為字串;
如果沒有toString(),或者返回的不是一個原始值,那麼就呼叫valueOf()(如果有的話),如果返回一個原始值,那麼就將它轉換為字串;
如果無法從toString()或valueOf()獲得一個原始值,就會丟擲一個型別錯誤的異常;
物件轉換為數字:
首先呼叫valueOf(),如果返回一個原始值,就將它轉換為數字;
如果沒有valueOf(),或者返回的不是原始值,那麼就呼叫toString(),如果返回了一個原始值,將它轉換為數字;
如果不能從valueOf()或toString()獲得一個原始值,就丟擲錯誤;
對於所有非日期物件來說,物件到原始值的轉換基本上都是到數字的轉換(首先呼叫valueOf());
日期物件使用物件到字串的轉換模式,並且通過valueOf()或toString()得到的原始值會被直接使用,不會被強制轉換為數字或字串(+、==、!=、關係運算符的情況下)
;
如果將一個物件和原始值比較,轉換會遵照物件-->原始值的轉換方式進行;
parseFloat()--同上 (1)原始值-->原始值 簡單; 轉換為數字:以數字表示的字串可以直接轉換為數字,並且允許在開始和結尾處帶有空格; (2)原始值-->物件 原始值呼叫String()、Number()、Boolean()建構函式,轉換為各自的包裝型別; undefined和null除外,他們用在期望是一個物件的地方會造成一個型別錯誤,不會執行正常的轉換; (3)物件-->原始值 所有的物件繼承了兩個轉換方法:toString()和valueOf()