JS 的動態類型有好有壞。好的一面,不必指明變量的類型。不好的是,咱們永遠無法確定變量的類型。
typeof運算符可以確定 JS 中的6種類型:
typeof 10; // => 'number'typeof 'Hello'; // => 'string'typeof false; // => 'boolean'typeof { a: 1 }; // => 'object'typeof undefined; // => 'undefined'typeof Symbol(); // => 'symbol'同樣,instanceof 運算符用于檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。
class Cat { }const myCat = new Cat();myCat instanceof Cat; // => true但是typeof和instanceof的一些行為可能會令人混淆。防范于未然,咱們需要提前了解一些邊緣情況。
1. typeof null
typeof myObject === 'object'會告知myObject是否是一個對象類型。舉個例子:
const person = { name: '前端小智' };typeof person; // => 'object'typeof person是'object',因為person是一個普通的 JS 對象。
在某場景下,變量值可能需要指定為 null,下面是一些場景:
可以使用null來跳過指示配置對象
使用null初始化稍后要保存對象的變量
當函數由于某種原因無法構造對象時,返回null
例如,如果不存在正則表達式匹配項,則str.match(regExp)方法返回null:
const message = 'Hello';message.match(/Hi/); // => null
這里引出一個問題,可以使用typeof 來區分有值的對象和具有 null 值的對象嗎?
let myObject = null;typeof myObject; // => 'object'myObject = { prop: 'Value' };typeof myObject; // => 'object'從上面可以看出,typeof 對象有值的對象和具有 null 值的對象,得到的結果都是'object'。
可以如下面方法來檢測變量是否有對象且不是null:
function isObject(value) { return typeof value === 'object' && value !== null;}isObject({}); // => trueisObject(null); // => false除了檢查value是否為object: typeof value === 'object'之外,還需要明確地驗證null: value !== null。
2. typeof array
如果試圖檢測一個變量是否包含一個數組,常見的錯誤就是使用typeof操作符:
const colors = ['white', 'blue', 'red'];typeof colors; // => 'object'
檢測數組的正確方法是使用Array.isArray():
const colors = ['white', 'blue', 'red'];const hero = { name: 'Batman' };Array.isArray(colors); // => trueArray.isArray(hero); // => falseArray.isArray(colors)返回一個布爾值true,表示colors是一個數組。
3.虛值類型檢查
JS中的undefined是一個特殊值,表示未初始化的變量。
如果試圖訪問未初始化的變量、不存在的對象屬性,則獲取到的值為 undefined :
新聞熱點
疑難解答
圖片精選