JavaScript 錯誤物件

在 JavaScript 中,有7個錯誤物件,它們根據錯誤類型在 try/catch 表達式中引發: Error EvalError RangeError ReferenceError SyntaxError TypeError URIError 讓我們分析每個錯誤物件。 Error 這是一個通用的錯誤,所有其他錯誤物件都繼承自它。你永遠不會直接看到 Error 的實例,而是 JavaScript 會引發列在上面的其他錯誤之一,這些錯誤繼承自 Error。 它包含兩個屬性: message:錯誤描述,一個可讓人理解的訊息,解釋發生了哪種錯誤 name:錯誤類型(具體錯誤物件的名稱,例如 TypeError 或 SyntaxError) 它只提供一個方法 toString(),負責將錯誤轉換為有意義的字串,可用於將其顯示在螢幕上。 EvalError 這種錯誤在現代 JavaScript 中已被定義,但實際上從未由 JavaScript 拋出,僅僅是出於相容性的目的而保留。它在 ECMAScript 3 中被定義,但在 ECMAScript 5.1 中的標準中已經不存在了。 它用於指示全域函數 eval() 的使用方式不正確,與其定義不兼容。 RangeError 當數字值不在其允許值的範圍內時,會引發 RangeError 錯誤。 最簡單的例子是將陣列長度設置為負值: [].length = -1 //RangeError: Invalid array length 或者將其設置為大於 4294967295 的數字: [].length = 4294967295 //4294967295 [].length = 4294967296 //RangeError: Invalid array length (此魔術數字在 JavaScript 規範中被指定為32位無符號整數的最大範圍,相當於 Math....

JavaScript 類型

有些時候你可能會聽說 JS 是一種無類型的語言,但這是不正確的。確實,你可以將各種不同的類型賦值給變量,但 JavaScript 是有類型的。特別是,它提供了原始類型和對象類型。 原始類型 數字 字符串 模板字面量 布林值 null undefined 對象類型 如何查找變量的類型 原始類型 原始類型有: 數字 字符串 布林值 符號 還有兩種特殊類型: null undefined 我們將在下一節中詳細介紹它們。 數字 在內部,JavaScript 只有一種數字類型:每個數字都是浮點數。 數字字面量是在源代碼中表示的數字,根據它的寫法不同,它可以是整數字面量或浮點數字面量。 整數: 10 5354576767321 0xCC // 十六進制 浮點數: 3.14 .1234 5.2e4 //5.2 \* 10^4 字符串 字符串類型是一個字符序列。它在源代碼中被定義為字符串字面量,該字面量用引號或雙引號括起來。 'A string' "Another string" 字符串可以跨多行使用反斜杠: "A \ string" 字符串可以包含轉義序列,在打印字符串時可以被解釋,比如使用 \n 創建新行。當你需要在被引號括起來的字符串中輸入引號時,反斜杠也是很有用的,以防止被解釋為結束引號的字符: 'I\'m a developer' 字符串可以使用 + 運算符拼接: "A " + "string" 模板字面量 在 ES2015 中引入的模板字面量是一種更強大的定義字符串的方式。 const a\_string = `something` 你可以執行字符串替換,將任何 JS 表達式的結果嵌入其中:...

JavaScript 嚴格模式(Strict Mode)

嚴格模式(Strict Mode)是 ES5 的一個功能,它讓 JavaScript 的行為更好,也以不同的方式改變了 JavaScript 語言的語義。了解 JavaScript 的嚴格模式和「普通」JavaScript(通常稱為鬆散模式)之間的主要區別非常重要。 嚴格模式主要移除了 ES3 中尚可使用但自 ES5 起已被棄用的功能(由於向後相容性需求的緣故,這些功能並未被刪除)。 如何啟用嚴格模式 嚴格模式是可選的。對於 JavaScript 中的每個破壞性更改,我們不能更改語言的默認行為,否則會破壞大量現有的 JavaScript 代碼。JavaScript 在確保 1996 年的 JavaScript 代碼仍然運作正常方面非常注重,這是它成功的原因之一。 因此,我們需要使用 'use strict' 指令來啟用嚴格模式。 您可以將它放在文件的開頭,從而將其應用於文件中的所有代碼: 'use strict' const name = 'Flavio' const hello = () => 'hey' //... 您還可以通過將 'use strict' 放在函數體的開頭,為個別函數啟用嚴格模式: function hello() { 'use strict' return 'hey' } 這在處理舊代碼時很有用,當您無法花時間進行測試或沒有信心在整個文件中啟用嚴格模式時。 嚴格模式中的變化 意外的全局變數 如果您將值賦給未聲明的變數,JavaScript默認會在全局對象上創建該變數: ;(function() { variable = 'hey' })()(() => { name = 'Flavio' })() variable //'hey' name //'Flavio' 在啟用嚴格模式後,如果您試圖執行上述操作,將會引發一個錯誤:...

JavaScript 屬性描述符

解釋了屬性描述符以及它們的用途 在 JavaScript 中,任何物件都有一組屬性,而每個屬性都有一個 描述符。 這個描述符是一個物件,它定義了屬性的行為和自身屬性。 許多 Object 靜態方法與之相互作用。這些方法包括: Object.create() Object.defineProperties() Object.defineProperty() Object.getOwnPropertyDescriptor() Object.getOwnPropertyDescriptors() 以下是一個屬性描述符物件的例子: { value: 'Something' } 這是最簡單的描述符物件。value 是屬性的值,在鍵值定義中使用。這個 key 是在物件中定義此屬性時所使用的鍵: { breed: { value: 'Siberian Husky' } } 示例: const animal = {} const dog = Object.create(animal, { breed: { value: 'Siberian Husky' } }); console.log(dog.breed) //'Siberian Husky' 您可以為每個不同的物件屬性傳遞其他屬性: value:屬性的值 writable:若為 true,則該屬性可以被更改 configurable:若為 false,則該屬性無法被移除,也無法更改任何屬性,除非它的值 enumerable:若為 true,則該屬性是可枚舉的 get:屬性的 getter 函式,在讀取屬性時呼叫 set:屬性的 setter 函式,在變更屬性值時呼叫 writable、configurable 和 enumerable 設定該屬性的行為。它們的值是布林值,默認情況下都是 false。...

JavaScript 變數

變數是指向識別符的字面值,因此您可以在程序中引用並使用它。了解如何使用 JavaScript 声明一个变量。 JavaScript 變數介紹 使用 var 使用 let 使用 const JavaScript 變數介紹 變數是指向識別符的字面值,因此您可以在程序中引用並使用它。 JavaScript 中的變數沒有任何附加的類型。一旦您將特定的字面值類型分配給變量,您可以稍後將變量重新分配給任何其他類型,而不會出現類型錯誤或任何問題。 這就是為什麼有時會將 JavaScript 稱為“未命名”的原因。 在使用變量之前,必須先聲明變量。有三種方式可以實現這一點,使用 var,let 或 const,而這三種方式在稍後與變量互動方面有所不同。 使用 var 在 ES2015 之前,var 是定義變量的唯一構造。 var a = 0 如果忘記添加 var,就會將值分配給未聲明的變量,結果可能會有所不同。 在開啟嚴格模式的現代環境中,您將收到一個錯誤。在較舊的環境中(或在未開啟嚴格模式的情況下),這將初始化該變量並將其分配給全局對象。 如果在聲明變量時未初始化該變量,則該變量將具有 undefined 的值,直到您將值分配給它。 var a //typeof a === 'undefined' 您可以多次重新聲明變量以覆蓋它: var a = 1 var a = 2 您也可以在同一語句中同時聲明多個變量: var a = 1, b = 2 作用域是變量可見的代碼部分。 使用 var 在任何函數外部初始化的變量將被分配給全局對象,具有全局作用域並且在任何地方都可見。使用 var 在函數內部初始化的變量將分配給該函數,具有局部作用域並且僅在其中可見,就像函數參數一樣。 在具有相同名稱的全局變量的函數中定義的任何變量將優先於全局變量,遮蔽它。 重要的是要理解,塊(由一對花括號識別)不定義新的作用域。只有在創建函數時才會創建新的作用域,因為 var 沒有塊作用域,而是函數作用域。...

JavaScript 邏輯運算子

了解 JavaScript 邏輯運算子的基礎知識。 JavaScript 為我們提供了三個邏輯運算子:and(且)、or(或)和 not(非)。 邏輯且 如果兩個操作數都為 true,則返回 true: <表達式> && <表達式> 例如: a === true && b > 3 這個運算子的一個很酷的特性是,如果第一個表達式為 false,則不會執行第二個表達式。這在某些實際應用中非常有用,例如,可以在使用對象之前檢查它是否已定義: const car = { color: 'green' } const color = car && car.color 邏輯或 如果至少有一個操作數為 true,則返回 true: <表達式> || <表達式> 例如: a === true || b > 3 這個運算子非常有用,可以用來設置默認值。例如: const car = {} const color = car.color || 'green' 如果 car.color 未定義,則將 color 設置為默認值 green。 邏輯非 (!) 反轉布爾值的值:...

javascript-array

#介紹JavaScript陣列 對JavaScript的關鍵構建塊-陣列進行簡要介紹 陣列是一組元素的集合。 在JavaScript中,陣列本身不是一種“類型”。 陣列是對象。 我們可以用以下兩種不同的方式來初始化一個空陣列: const a = [] const a = Array() 第一種是使用“陣列文字語法”。第二種使用內置的Array函數。 您可以使用以下語法預填充陣列: const a = [1, 2, 3] const a = Array.of(1, 2, 3) 陣列可以存儲任何值,甚至是不同類型的值: const a = [1, 'Flavio', ['a', 'b']] 由於我們可以將陣列添加到陣列中,所以我們可以創建多維陣列,這在一些應用中非常有用(例如矩陣): const matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] matrix[0][0] //1 matrix[2][0] //7 您可以通過引用索引來訪問任何元素,索引從零開始: a[0] //1 a[1] //2 a[2] //3 您可以使用以下語法初始化具有一組值的新陣列,該語法首先初始化一個包含12個元素的陣列,然後將每個元素填充為數字0: Array(12).fill(0) 您可以通過檢查其length屬性來獲取陣列的元素數量: const a = [1, 2, 3] a....

javascript-comparison-operators

#JavaScript比較運算子 學習JavaScript比較運算子的基礎知識 你可以使用以下運算子來比較兩個數字或兩個字串。 這些運算的結果將返回一個布林值。 < 小於 <= 小於或等於 > 大於 >= 大於或等於 const a = 2 a >= 1 //true 當比較字串時,這些運算子會檢查字母的順序,該順序編碼在Unicode中。字母的數值越大,對於運算子來說,該字母越大。 你可以在Wikipedia的Unicode字符代碼列表中找到字符的Unicode編碼。

javascript-difference-let-var

#JavaScript 中使用 let 和 var 有什麼區別? 何時應該使用 let 而不是 var?為什麼?讓我們一起找出答案! 在現代 JavaScript 中,我們有三種方式來聲明變量並賦值: const let var 在使用 JavaScript 中的變量時,我總是默認使用 const。它確保變量的值無法重新賦值,因此更安全使用。 但在需要稍後重新聲明變量時,我總是使用 let。 多年來我一直沒有使用 var,對我來說它只是為了保持向後兼容性而存在,當我看到有人使用它時,我總是會感到疑惑。 為什麼呢? 首先,let 具有合理的作用域。 在幾乎所有流行的編程語言中都使用的塊作用域,它指定使用 let 聲明的變量作用域為最接近的塊。 相反,var 更奇怪,因為它具有函數作用域,這意味著使用 var 聲明的變量作用域限制在最接近的函數內。 這對實際應用有影響。例如,在 if 語句內聲明一個變量或將變量用作 for 循環的迭代器。使用 let 使該變量僅在這兩個塊內有效。然而,使用 var 則允許該變量在該塊之外也可用,這可能導致錯誤。 總是使用功能最少的工具,以確保對其擁有最大的控制。 追求極大的力量就需要承擔極大的責任。 喜歡使用 let 的另一個原因是變量提升。與 const 一樣,let 變量不具有變量提升,但在評估時會進行初始化。 相反,var 變量會被提升到函數的頂部,因此即使在其聲明之前的行中也可以使用它們。這很奇怪,對吧? 第三個原因:當您聲明一個已經存在的 let 變量時,您會收到一個錯誤(在 嚴格模式 下)。 最後,另一個重要的區別是:如果您在任何函數之外聲明一個 var 變量,它將被分配給全局對象(在瀏覽器內部為 window)。let 不會以此方式工作;該變量是可用的,但不附加到全局對象,因此無法從文件外部訪問。

javascript-generators

#JavaScript生成器教程 生成器是一種特殊類型的函數,具備自我暫停和稍後恢復的能力,從而允許其他代碼在此期間運行。 生成器是一種特殊類型的函數,具備自我暫停和稍後恢復的能力,從而允許其他代碼在此期間運行。 代碼決定自己需要等待,所以它讓“隊列中的其他代碼”運行,並保留當“它等待的東西”完成時恢復操作的權利。 所有這些都是通過一個簡單的關鍵字yield完成的。當生成器包含該關鍵字時,執行被暫停。 生成器可以包含多個yield關鍵字,因此可以多次暫停,並且通過*function關鍵字進行標識,不要將其與用於低層次編程語言(如C,C ++或Go)的指針解引用運算符混淆。 生成器使得在JavaScript中實現全新的編程範式成為可能,包括: 在生成器運行時的雙向通信 長壽命的循環不會凍結您的程序 以下是解釋它們如何工作的生成器的示例。 function \*calculator(input) { var doubleThat = 2 \* (yield (input / 2)) var another = yield (doubleThat) return (input \* doubleThat \* another) } 使用以下方式初始化它: const calc = calculator(10) 然後在生成器上啟動迭代器: calc.next() 第一次迭代開始運行迭代器。代碼返回以下對象: { done: false value: 5 } 發生的情況是:代碼運行函數,並將input = 10作為傳遞給生成器構造函數的參數。它運行直到達到yield語句,並返回yield的內容:input / 2 = 5。因此,我們獲得了一個值為5的結果,並且告知迭代尚未完成(函數僅暫停)。 在第二次迭代中,我們將值7傳遞進去: calc.next(7) 返回的結果是: { done: false value: 14 } 7被設置為doubleThat的值。重要的是:你可能會認為input / 2是參數,但這只是第一次迭代的返回值。我們現在跳過它,並使用新的輸入值7,乘以2。 然後我們到達第二個yield,返回doubleThat的值,因此返回值為14。 在下一個(也是最後一個)迭代中,我們傳入100:...