首頁 > web前端 > js教程 > 深入了解JavaScript中的null

深入了解JavaScript中的null

青灯夜游
發布: 2020-11-10 17:46:01
轉載
2966 人瀏覽過

深入了解JavaScript中的null

推薦教學:《JavaScript影片教學

#JavaScript有2種類型:基本型別(string, booleans number, symbol)和物件。

物件是複雜的資料結構,JS 中最簡單的物件是普通物件:一組鍵和關聯值:

let myObject = {
  name: '前端小智'
}
登入後複製

但是在某些情況下無法建立物件。在這種情況下,JS 提供一個特殊值null —表示缺少物件。

let myObject = null
登入後複製

在本文中,我們將了解有關JavaScript中null的所有知識:它的含義,如何檢測它,nullundefined之間的區別以及為什麼使用null造成程式碼維護困難。

1. null的概念

JS 規範說明了有關null的資訊:

null 特指物件的值未設置,它是JS 基本類型之一,在布林運算中被認為是falsy

例如,函數greetObject()建立對象,但是在無法建立物件時也可以返回null

function greetObject(who) {
  if (!who) {
    return null;
  }
  return { message: `Hello, ${who}!` };
}

greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject();       // => null
登入後複製

但是,在不當帶參數的情況下呼叫函數greetObject() 時,函數會傳回null。傳回null是合理的,因為who參數沒有值。

2. 如何檢查null

檢查null值的好方法是使用嚴格相等運算子:

const missingObject = null;
const existingObject = { message: 'Hello!' };

missingObject  === null; // => true
existingObject === null; // => false
登入後複製

missingObject === null的結果為true,因為missingObject變數包含一個null 值。

如果變數包含非空值(例如物件),則表達式existObject === null的計算結果為false

2.1 null 是虛值

nullfalse0 ''undefinedNaN都是虛值。如果在條件語句中遇到虛值,那麼 JS 將會強制虛值為false

Boolean(null); // => false

if (null) {
  console.log('null is truthy')
} else {
  console.log('null is falsy')
}
登入後複製

2.2 typeof null

typeof value運算子決定值的型別。例如,typeof 15是'number'typeof {prop:'Value'}的計算結果是'object'

有趣的是,type null的結果是什麼

typeof null; // => 'object'
登入後複製

為什麼是'object'typoef nullobject是早期JS 實作中的錯誤。

要使用typeof運算子來偵測null值。如前所述,使用嚴格等於運算子myVar === null

如果我們想使用typeof運算子檢查變數是否是對象,我們還需要排除null值:

function isObject(object) {
  return typeof object === 'object' && object !== null;
}

isObject({ prop: 'Value' }); // => true
isObject(15);                // => false
isObject(null);              // => false
登入後複製

3. null 的陷阱

null經常會在我們認為該變數是物件的情況下意外出現。然後,如果從null中提取屬性,JS 會拋出錯誤。

再次使用greetObject() 函數,並嘗試從傳回的物件存取message屬性:

let who = '';

greetObject(who).message; 
// throws "TypeError: greetObject() is null"
登入後複製

因為who變數是一個空字串,所以該函數傳回null。從null存取message屬性時,將引發TypeError錯誤。

可以透過使用帶有空值合併的可選連結來處理null:

let who = ''

greetObject(who)?.message ?? 'Hello, Stranger!'
// => 'Hello, Stranger!'
登入後複製

4. null 的替代方法

當無法建構物件時,我們通常的做法是傳回null,但是這種做法有缺點。在執行堆疊中出現null時,剛必須進行檢查。

嘗試避免返回null 的做法:

  • 傳回預設物件而不是null
  • 拋出錯誤而不是返回null

回到開始返回greeting物件的greetObject()函數。缺少參數時,可以傳回一個預設對象,而不是返回null

function greetObject(who) {
  if (!who) {
    who = 'Stranger';
  }
  return { message: `Hello, ${who}!` };
}

greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject();       // => { message: 'Hello, Stranger!' }
登入後複製

或拋出一個錯誤:

function greetObject(who) {
  if (!who) {
    throw new Error('"who" argument is missing');
  }
  return { message: `Hello, ${who}!` };
}

greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject();       // => throws an error
登入後複製

這兩種做法可以避免使用null

5. null vs undefined

undefined是未初始化的變數或物件屬性的值,undefined是未初始化的變數或物件屬性的值。

let myVariable;

myVariable; // => undefined
登入後複製

nullundefined之間的主要區別是,null表示遺失的對象,而undefined表示未初始化的狀態。

嚴格的相等運算符===區分nullundefined :

null === undefined // => false
登入後複製

而雙等運算子==則認為nullundefined 相等

null == undefined // => true
登入後複製

我使用双等相等运算符检查变量是否为nullundefined:

function isEmpty(value) {
  return value == null;
}

isEmpty(42);                // => false
isEmpty({ prop: 'Value' }); // => false
isEmpty(null);              // => true
isEmpty(undefined);         // => true
登入後複製

6. 总结

null是JavaScript中的一个特殊值,表示丢失的对象,严格相等运算符确定变量是否为空:variable === null

typoef运算符对于确定变量的类型(number, string, boolean)很有用。 但是,如果为null,则typeof会产生误导:typeof null的值为'object'

nullundefined在某种程度上是等价的,但null表示缺少对象,而undefined未初始化状态。

更多编程相关知识,请访问:编程视频课程!!

以上是深入了解JavaScript中的null的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板