我的github部落格 github.com/zhuanyongxi…
資料型別的轉換
在JS中,引用資料型別轉換為原始資料型別轉換隻有三種情況:
- 轉換為布林值;
- 轉換為數字;
- 轉換為字串。
換一種方式來表達,在JS中,所有的資料都可以去轉(注意這裡的用詞,是“轉”,不是“轉成”)布林值、數字和字串(並不一定能成功)。
轉成布林值
非常簡單,除了undefined、null、“”、NaN、0、-0、false之外,全都是true。
轉成字串
也非常的簡單,需要注意的有四個:陣列、物件、函式、symbol。
其實重要的就是陣列和物件。
function fn() {
console.log("Hello World");
}
console.log(String([1, 2])); // "1,2"
console.log(String({})); // "[object Object]"
console.log(String(fn));
// "function a() {window.runnerWindow.proxyConsole.log(\"Hello World\");}"
console.log(String(Symbol('foo'))); // "Symbol(foo)"
複製程式碼
轉成數字
在JS中,轉數字比較複雜。常用的轉換數字的方法有:Number、parseInt和parseFloat。其中Number在轉字串的時候如果遇到有非數字的東西,會返回NaN
,所以也被稱為強制轉換。另外兩個是從左到右一位一位的轉換,所以也被成為非強制轉換。
Number方法
與一元操作符+
的效果相同。即Number("1")
與+"1"
相同。
- Boolean,true和false分別是1和0;
- 數字返回數字;
- null返回0;
- undefined返回NaN;
- Symbol會拋錯;
- 如果是字串:
- 空字串轉為0;
- 只包含數字的情況,Number會消除前導的0,比如“001”,轉換之後就是1。浮點格式與整數相同。
- 如果字串包含除數字以外的其他字元(字串開頭可以有正負號),都會轉為NaN。
- 如果是物件,先轉成字串,再把字串轉成數字。
如果是四則運算,字串的優先順序最高,數字第二。意思就是如果相加的遇到了字串,則不是字串的轉化為字串,如果沒有字串,有一個數字,則不是數字的轉化為數字。
資料型別的比較(隱式轉換)
- NaN與任何值都不相等,包括它自己。
- 物件與物件比較,比較的是不是指向同一個記憶體地址
- 物件與字串比較,物件先轉化為字串,然後做比較
- 物件與布林型別值比較,兩邊都要先轉為數字(false是0,true是1)。物件型別的值先隱式呼叫toString方法,在隱式呼叫Number方法
- 物件與數字比較,物件轉化為數字再比較(先隱式呼叫toString方法,再隱式呼叫Number方法將物件轉化為數字)
- 數字與布林型別值比較,就是進行數字的比較
- 數字與字串的比較,把字串轉化為數字,再比較
- 布林與布林,兩邊都轉化為數字再比較
- null與undefined比較,true
- null、undefined與其他型別比較,結果都是false,因為他們倆沒有toString方法
簡化版:
- 只要有數字和布林值的,都轉換成數字進行比較;
- 物件與物件比較,比較的是不是指向同一個記憶體地址;
- 物件與字串比較,物件先轉化為字串,然後做比較;
- null、undefined、NaN與其他型別比較,null和undefined除了自己之外,相互比較也是相等的,此外與其他型別比較,結果都是false,因為他們倆沒有toString方法。其中NaN與任何比較都是false(包括自己)。
// 1,
1 == "1"; // true
1 == true; // true
// 2,
var obj1 = {}
var obj2 = {}
var obj3 = obj1
obj1 == obj2 // false
obj1 == obj3 // true
// 3,
{} == "{}" // false,物件{}轉化為字串是"[object Object]"
// 4,
null == null // true
undefined == undefined // true
null == undefined // true
"" == null // false
NaN == NaN // false
複製程式碼