在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 標準對象 在JavaScript的世界里,萬物皆對象。 但是對象與對象之間也有區別。為了區分 ...
在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意!
如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。
標準對象
在JavaScript的世界里,萬物皆對象。
但是對象與對象之間也有區別。為了區分對象的類型,我們可以用 typeof 操作符來獲取對象的類型,它總是返回一個對象的類型:
typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typeof Math.abs; // 'function' typeof null; // 'object' typeof []; // 'object' typeof {}; // 'object'
從上面的例子我們可以看出, number , string , boolean , undefined , function 不同於其他的類型。 null 的類型是 object , Array 的類型也是 object ,所以,通過 typeof 操作符,我們無法區分 null ,Array 和通常意義上的 object —— { } 。
包裝對象
除了以上這些標準類型外,JavaScript還提供了包裝對象,就好像Java裡面 int 與 Integer 的關係。
在JavaScript中, number , boolean , string 都有它們對應的包裝對象。包裝對象用 new 來創建。
var n = new Number(123); // 123,生成了新的包裝類型 var b = new Boolean(true); // true,生成了新的包裝類型 var s = new String('str'); // 'str',生成了新的包裝類型
雖然包裝對象看上去和原來的值一模一樣,但是它們的類型已經變成了 object 類型,所有,用 == 來比較包裝對象和原始值,會返回 false 。
typeof new Number(123); // 'object' new Number(123) === 123; // false typeof new Boolean(true); // 'object' new Boolean(true) === true; // false typeof new String('str'); // 'object' new String('str') === 'str'; // false
所以在非必要情況下,不要隨意使用包裝對象,尤其是針對string類型。
註意:如果我們在使用 Number , Boolean 和 String 時,沒有用new關鍵字來創建對象, Number() , Boolean() , String() 會被當做普通對象,把傳入的任何類型的數據轉換為 number , boolean , string 類型(不是其包裝類型):
var n = Number('123'); // 傳入字元串“123”,相當於parseInt()或parseFloat() typeof n; // 'number' 123 var b = Boolean('true'); // 傳入字元串“true”,結果為true typeof b; // 'boolean' var b2 = Boolean('false'); //傳入字元串'false',結果為true!因為它是非空字元串! var b3 = Boolean(''); // 空字元串,結果為false var s = String(123.45); // 傳入數字123.45,結果為string字元串‘123.45’ typeof s; // 'string'
總結
在JavaScript中,使用標準對象和包裝對象時,需要遵循一下幾點:
- 不要使用new Number() ,new Boolean() ,new String() 來創建包裝對象;
- 使用parseInt() 和parseFloat() 可以將任意類型轉換為number 類型;
- 使用String() 可以將任意類型轉換成string 類型,或者直接調用某個對象的toString() 方法;(null,undefined沒有此方法)
- 一般不用把任意類型轉換為 boolean 再判斷,直接寫成 if (myVar) {...} 即可;
- 使用typeof 操作符可以判斷出number ,boolean ,string ,function ,undefined ;
- 使用Array.isArray(arr) 來判斷是不是Array ;
- 使用myVar === null 來判斷是不是null ;
- 使用typeof window.myVar === 'undefined' 來判斷某個全局變數是否存在;
- 使用typeof myVar === 'undefined' 來判斷某個函數內部某個變數是否存在;
註意:
- 以上5-9點註意事項,剛好可以判斷所有的標準數據類型。
- 以上第3點註意事項中,並不是所有的對象都有 toString() 方法,null和undefined沒有此方法。
- number 對象調用 toString() 方法時,會報錯 SyntaxError :
123.toString(); // SyntaxError //需要經過如下處理: 123..toString(); // '123', 註意是兩個點! (123).toString(); // '123'