# JS變量中有哪些需要注意的
## 引言
JavaScript作為一門動態弱類型語言,變量的使用看似簡單卻暗藏許多"陷阱"。本文將從變量聲明、作用域、提升、類型轉換等角度,詳細剖析JS變量使用中需要特別注意的關鍵點。
---
## 一、變量聲明方式的選擇
### 1. `var`的歷史遺留問題
```javascript
var x = 10;
if (true) {
var x = 20; // 同一個作用域!
console.log(x); // 20
}
console.log(x); // 20
let/const
的塊級作用域let y = 10;
if (true) {
let y = 20; // 不同作用域
console.log(y); // 20
}
console.log(y); // 10
const
let
var
var
的變量提升console.log(a); // undefined
var a = 5;
實際執行順序:
var a;
console.log(a);
a = 5;
let/const
的暫時性死區(TDZ)console.log(b); // ReferenceError
let b = 10;
var
更符合直覺let global = 1;
function outer() {
let outerVar = 2;
function inner() {
console.log(outerVar); // 2
console.log(global); // 1
}
return inner;
}
function createHeavyObject() {
const bigObj = new Array(1000000).fill('*');
return () => console.log(bigObj.length);
}
// 即使不再需要,bigObj仍被保留
console.log([] == ![]); // true
// 轉換步驟:
// ![] → false
// [] == false → "" == false → 0 == 0
原始值 | 轉換為數字 | 轉換為字符串 | 轉換為布爾值 |
---|---|---|---|
”” | 0 | ”” | false |
“123” | 123 | “123” | true |
null | 0 | “null” | false |
undefined | NaN | “undefined” | false |
function leak() {
leaked = 'oops'; // 未聲明直接賦值 → 成為全局變量
}
'use strict';
undeclaredVar = 1; // ReferenceError
// let class = 'math'; // SyntaxError
let klass = 'math'; // 可行的替代方案
UPPER_CASE
PascalCase
camelCase
_prefix
NaN
的檢測let notNumber = 0/0;
console.log(notNumber === notNumber); // false
// 正確檢測方式:
Number.isNaN(notNumber); // true
null
vs undefined
null
:顯式空值undefined
:
// 優 let temp; for (let i=0; i<1000; i++) { temp = i*2; }
2. **對象屬性訪問緩存**:
```javascript
// 多次訪問時
const len = arr.length;
for (let i=0; i<len; i++) {}
JS變量的正確使用需要理解: 1. 聲明方式的差異 2. 作用域規則 3. 類型轉換機制 4. 內存管理特性
掌握這些細節能幫助開發者寫出更健壯、可維護的JavaScript代碼。 “`
(全文約1100字,可根據需要調整具體內容細節)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。