在了解
undefined
資料類型之前,我們來複習一下js資料類型。
JS 的資料類型包括:
- Boolean:
和true
false
- Number: 整數
和浮點數1
1.2
- String:
Conan Wang
- Null:
null
- Undefined:
undefined
- Symbol:
(ES2015)Symbol("name")
undefined 的資料類型:
typeof undefined === “undefined”; //true
2. 導緻undefined的常見場景
2.1 未初始化變量
尚未指派的(未初始化)的聲明變量預設為
undefined
var res;
console.log(typeof res); //undefined
技巧1 : 使用let 和 const 來代替的 var
const 和 let 具有塊級作用域,在聲明行之前存在于暫時性死區。
當變量一次性且永久地接收到一個值時,建議使用const聲明const聲明,它建立一個不可變的綁定。
技巧2 :增加内聚性
内聚描述子產品的元素(命名空間、類、方法、代碼塊)内聚在一起的程度。凝聚力的測量通常被稱為高凝聚力或低内聚力。
高内聚是優選的,因為它建議設計子產品的元素以僅關注單個任務,它構成了一個子產品。
- 專注且易懂
- 可維護且更容易重構
- 可重用
-
可測試
高内聚和低耦合是一個設計良好的系統的特征。
代碼塊本身可能被視為一個小子產品,為了盡可能實作高内聚,需要使用變量盡可能接近使用它們代碼塊的位置。
2.2 通路不存在的屬性
通路不存在的對象屬性時,JS傳回的 undefined
var obj = {
name: 'conan';
}
//使用屬性選擇器obj.age通路不存在的屬性age将被計算為`undefined`;
本身通路不存在的屬性不會引發錯誤,但是嘗試從不存在的屬性中擷取資料時就會發生出問題。
技巧3 檢查屬性是否存在
JS提供了很多方法來确定對象具有特定屬性:
-
: 直接與obj.name !== undefined
進行比較undefined
-
: 驗證屬性值類型typeof obj.name !== 'undefined'
- obj.hasOwnProperty(‘name’) : 驗證對象是否具有自己的屬性 僅在對象自己的屬性中進行驗證
-
: 驗證對象的是否具有自己的屬性或繼承屬性'name' in obj
建議使用操作符,它的文法短小精悍。
in
操作符的存在表明一個明确的意圖,即檢查對象是否具有特定的屬性,而不通路實際的屬性值。
in
技巧4 解構通路對象屬性
技巧5 用預設屬性填充對象
2.3 函數參數
函數參數隐式預設為 undefined
技巧6:使用預設參數值
2.4 函數傳回值
隐式地, 沒有語句, JS函數傳回
return
.
undefined
技巧7:不要相信自動插入分号
JS中的以下語句必須以分号結尾:
- 空語句
-
,let
,const
,var
,import
聲明export
- 表達語句
-
語句debugger
-
語句,continue
語句break
-
語句throw
-
語句return
void 操作符
void <expression>
計算表達式計算結果如何都傳回
undefined
.
3. 未定義的數組
通路越界索引的數組元素時,會得到
undefined
.
var arr = [name, age, desc];
arr[5]; //=> undefined
通路稀疏數組的間隙(空槽)時,也會得到
undefined
.
4. undefined 和 null 之間的差別
兩個特殊值都表示空狀态,主要差別在于
undefined
表示尚未初始化的變量的值,
null
表示故意不存在對象。
var num;
console.log(num);//undefined
// num 變量未定義,這清楚的表明未初始化的變量。
undefined == null; //true
undefined === null; //false
總結
undefined
的存在是JS的允許性質的結果,它允許使用:
- 未初始化的變量
- 不存在的對象屬性或方法
- 通路越界索引的數組元素
- 不傳回任何結果的函數的調用結果
減少代碼中的
undefined
關鍵字的出現:
- 減少未初始化變量的使用
- 使變量生命周期變短并接近其使用的位置
- 盡可能為變量配置設定初始值
- 多敷衍 const 和 let
- 使用預設值來表示無關緊要的函數參數
- 驗證屬性是否存在或使用預設屬性填充不安全對象
- 避免使用稀疏數組