精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十個你可能從未見過的 JavaScript 怪現象:第4條把我整破防(程序員別裝了,都中招)

開發 前端
JS 里數組的?length?屬性不只是“描述”,還是“指令”。你可以手動改它,后果要么制造空洞,要么直接裁掉元素。

上周我踩了一個特別隱蔽的坑,再次被提醒:不管你寫 JavaScript 多久,這門語言的“性格缺陷”,總有新的姿勢讓你開眼。

下面這些不是“Bug”,而是規范里白紙黑字的行為。理解它們,不是炫技,而是更穩地寫出可預期的代碼。本文挑了10個最值得知道的點,有例子、有緣由、有對策

1. NaN 悖論:唯一一個“永遠不等于自己”的值

NaN(Not a Number)很諷刺:typeof NaN === 'number'。它也是 JS 里唯一一個不等于自身的值。

console.log(NaN === NaN); // false
console.log(NaN == NaN);  // false

為什么?NaN 表示“無法表示/未定義”的數值結果(比如 0/0Math.sqrt(-1))。既然兩個“未定義的結果”無法保證一致,那么它們就不相等。

因此,用相等比較來檢測 NaN 完全靠不住。正確姿勢是 Number.isNaN(),避免了全局 isNaN() 的類型強轉陷阱。

console.log(Number.isNaN(NaN)); // true(推薦)

// 全局 isNaN 會先做 Number() 強轉
console.log(isNaN("hello"));        // true,因為 Number("hello") 是 NaN
console.log(Number.isNaN("hello")); // false,因為它不是“值 NaN”

要點串聯:因此→不要迷信比較運算;然而→全局 isNaN 會誤傷;盡管如此→Number.isNaN 足夠可靠。

2. Array.length:可寫的“幻覺”

JS 里數組的 length 屬性不只是“描述”,還是“指令”。你可以手動改它,后果要么制造空洞,要么直接裁掉元素

let arr = ['a', 'b', 'c'];

// 增大長度:變稀疏數組
arr.length = 5;
console.log(arr);    // ['a', 'b', 'c', empty × 2]
console.log(arr[3]); // undefined

// 縮短長度:破壞性截斷
arr.length = 1;
console.log(arr);    // ['a'] —— 'b' 和 'c' 永久丟失

“稀疏數組”的“空槽”和顯式的 undefined 不同;大多數迭代方法(map/filter/forEach)會跳過空槽

const sparse = new Array(3);                     // [empty × 3]
const explicit = [undefined, undefined, undefined];

console.log(sparse.map(() => 1));   // [empty × 3]
console.log(explicit.map(() => 1)); // [1, 1, 1]

實踐建議:因此→避免隨意改 length;然而→slice/splice 更可控;同時→遍歷前先判斷是否真的需要保留“空槽”語義。

3. “像數組但不是數組”的家族

很多對象長得像數組沒有數組方法,比如函數的 arguments、DOM 的 NodeList

function example() {
  console.log(Array.isArray(arguments)); // false
  // arguments.map(...) // TypeError: arguments.map is not a function
}

現代做法:用擴展語法或 Array.from() 把“類數組/可迭代”轉真數組。

function betterExample() {
  const args = [...arguments];       // 簡潔首選
  // const args = Array.from(arguments);
  return args.map(x => x * 2);
}

連接詞到位:因此→遇到類數組先轉型;不過→可迭代對象直接展開更優雅;與此同時→確保運行環境支持擴展語法。

4. 浮點數現實:IEEE 754 的代價

JS 使用 IEEE 754 雙精度,不是 JS 的錯,但你會見到熟悉的“驚嚇”:

console.log(0.1 + 0.2);         // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

console.log(
  Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
); // true(已超出“安全整數”范圍)

現代解法

  • 整數超范圍:用 BigInt
const huge = BigInt(Number.MAX_SAFE_INTEGER);
console.log(huge + 2n === huge + 1n); // false
  • 小數運算:用“分(整數化)”方案,或 decimal.js 等庫;展示用 toFixed() / Intl.NumberFormat
const price = 19.99;
const fmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
console.log(fmt.format(price)); // "$19.99"

因果鏈:因為→表示法有限;所以→算術有誤差;因此→要么整數化,要么引入十進制庫。

5. 對象屬性與“淺凍”真相

屬性背后有“描述符”(writable、enumerable、configurable)。Object.defineProperty 可控更細。Object.freeze() 常用但只有淺層:頂層屬性被凍結,嵌套對象仍可改

const frozen = Object.freeze({
  metadata: { version: 1 }
});

// 無法改引用
// frozen.metadata = {} // 嚴格模式下 TypeError

// 但能改內部屬性
frozen.metadata.version = 2;
console.log(frozen.metadata.version); // 2

想要“真不可變”:寫個深凍結(遞歸 Object.freeze),或使用不可變數據工具(例如 Immer/Immutable.js)。

6. 原型污染:看不見的安全洞

當攻擊者改寫了 Object.prototype,問題會像傳染一樣擴散到全局對象,后果難以預料。 常見入口是不安全的遞歸合并(merge/clone)把惡意 __proto__ 丟進來了。

const maliciousPayload = JSON.parse('{"__proto__": {"isPolluted": true}}');
let target = {};

// 模擬某些老舊庫的合并副作用
if (maliciousPayload.__proto__) {
  Object.assign(Object.prototype, maliciousPayload.__proto__);
}

const innocentObject = {};
console.log(innocentObject.isPolluted); // true!所有對象“中招”

防御要點:因此→用 Object.create(null) 構造“無原型對象”;同時→對外部 JSON 做白名單校驗;并且→升級依賴(如 Lodash)到修復版本

7. 類型強制:ToPrimitive 的“幕后操作”

自動類型轉換很能打,但容易反直覺,尤其 == 與 +

當 + 遇到對象,會走 ToPrimitive 抽象操作:

  • [ ].toString() → ""
  • { }.toString() → "[object Object]"

于是:

console.log([] + {}); // "[object Object]"  == "" + "[object Object]"

再看一個“坑樣例”:

console.log({} + []); // 瀏覽器里可能是 0 或 "[object Object]"

原因:行首的 {} 有時會被當成空代碼塊,接著算 +[] → 0對策:因此→堅持用 ===/!==;另外→顯式做 String()/Number() 轉換;盡管如此→模板字符串也能提升可讀性。

8. 聲明提升 vs. 暫時性死區(TDZ)

“提升”分三種:

  • 函數聲明:名字與函數體都提升,可先用后聲明。
sayHello(); // "Hello!"
function sayHello(){ console.log("Hello!"); }
  • var:只提升“聲明”,并以 undefined 初始化;賦值不提升。
console.log(myVar); // undefined
var myVar = "Hello";
  • let / const:也會被“登記”,但不初始化。從作用域開始到聲明處的這段是 TDZ,訪問會拋 ReferenceError
// 作用域開始 & myLet 的 TDZ
console.log(myLet); // ReferenceError
let myLet = "Hello";
// TDZ 結束

寫法建議:因此→統一把聲明放到使用之前;同時→塊作用域內盡量“聲明即賦值”;并且→避免在 TDZ 中做任何讀取。

9. this 的流沙:調用方式決定歸屬

this 的值取決于函數如何被調用。回調里尤其愛“跑丟”。

const myObj = {
name: "My Object",
regularMethod: function () {
    setTimeout(function () {
      // 這里的 this 指向 window/global,不是 myObj
      console.log(this.name); // undefined
    }, 100);
  },
arrowMethod: function () {
    setTimeout(() => {
      // 箭頭函數從外層“捕獲”this
      console.log(this.name); // "My Object"
    }, 100);
  },
};

在 class 里,傳方法當回調時更明顯。類字段箭頭函數能自動綁定 this

class Logger {
  constructor() {
    this.prefix = "LOG:";
  }
  // 自動綁定 this
  logMessage = (message) => {
    console.log(this.prefix, message);
  };
}

const logger = new Logger();
const button = document.getElementById('my-button');
button.addEventListener('click', logger.logMessage); // this 正確指向 logger

思路閉環:因此→箭頭函數適合回調;不過→對象方法若需復用,可 bind;與此同時→TS 中可用類字段語法統一風格。

10. Symbol:被忽略的“超能力”

Symbol 是唯一且不可變的原始值,常用作對象屬性鍵,既能防沖突,也能做“半隱藏”。

1) 隱式私有屬性:Symbol 作為鍵不會被 for...in/JSON.stringify 枚舉到。

const _privateMethod = Symbol('privateMethod');
class MyClass {
  [_privateMethod]() {
    return 'secret';
  }
}

2) 定制語言行為:一批“知名 Symbol”讓你接入 JS 內部協議

const customIterable = {
  *[Symbol.iterator]() { yield 1; yield 2; }
};
console.log([...customIterable]); // [1, 2]

const objWithCustomConversion = {
  [Symbol.toPrimitive](hint) {
    return hint === 'number' ? 42 : 'hello';
  }
};
console.log(objWithCustomConversion + 10); // 52
console.log(`${objWithCustomConversion}`); // "hello"

邏輯銜接:因此→Symbol能避免命名沖突;然而→調試要注意可見性;同時→知名 Symbol 讓對象“像內建類型一樣可用”。

速記卡

  • 用 ===/!== 為默認:避開寬松相等的“黑魔法”。
  • 擁抱不可變思維:默認 const;用 Object.freeze() + 展開語法(const clone = { ...orig })減少副作用。
  • 理解原理,而不是死記:抽空翻翻規范里的 ToPrimitive、TDZ 等概念,理解一遍,受用更久。
  • 上現代工具:ESLint 把大坑自動攔住;大項目考慮 TypeScript,類型安全從入口把關
  • 測邊界:對 null/undefined/NaN/稀疏數組 等寫單測,把“怪現象”關進籠子。

現在,去把你代碼里那段“可疑正則/類型強轉/遍歷邏輯”修一修吧。你的未來維護者,會沖你微笑的。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2025-05-16 07:56:55

Vue Router架構前端

2018-09-05 09:33:41

DevOps轉型指標

2021-03-02 10:11:13

MySQL死鎖數據庫

2019-05-13 09:25:07

大數據數據分析隱私

2011-07-15 16:06:16

程序員

2020-07-26 18:34:46

Python開發工具

2022-10-17 15:47:19

JavaScript開發Web

2025-03-27 00:04:33

AIChatGPT生成模型

2020-07-10 06:10:14

Python開發代碼

2023-06-27 17:42:24

JavaScript編程語言

2025-01-10 08:00:00

JavaScript開發編程語言

2009-06-25 10:15:41

糟糕的程序員

2017-10-09 12:05:57

優秀的代碼代碼量糟糕的代碼

2023-02-06 16:46:59

JavaScript程序員技巧

2020-11-16 12:09:25

Python開發工具

2010-11-10 10:39:19

2020-06-17 09:52:16

數據庫Redis技術

2024-04-24 14:52:26

JavaScriptWeb 開發

2015-12-14 10:20:57

Python程序員錯誤

2025-03-19 09:46:45

點贊
收藏

51CTO技術棧公眾號

亚洲欧美一级| 日本最黄一级片免费在线| 久久亚洲欧洲| 精品国产一区二区三区久久狼5月| 我要看一级黄色大片| 亚洲按摩av| 久久久激情视频| 91亚洲午夜在线| 超碰影院在线观看| 在线a免费看| 成人免费高清视频| 国产精品男人的天堂| 久一视频在线观看| av在线精品| 天天色综合天天| 樱花www成人免费视频| 污污视频在线观看网站| 精品一区二区三区视频| 欧美一级大片在线免费观看| 中国毛片直接看| 国产成人一区| 亚洲精品不卡在线| 色偷偷中文字幕| 九色成人搞黄网站| 国产亚洲精品中文字幕| 91福利视频导航| 正在播放亚洲精品| 中日韩男男gay无套| 久久亚洲国产精品成人av秋霞| 黄色aaa级片| 成年人黄色大片在线| 成人欧美一区二区三区| 成人精品久久久| 黄色录像免费观看| 久久av综合| 亚洲国产毛片完整版| 91视频福利网| www.成人| 91精品欧美一区二区三区综合在| www.xxx亚洲| 中文字幕 在线观看| 亚洲午夜国产一区99re久久| 在线免费观看成人网| 成人精品福利| 国产日韩欧美精品在线| 麻豆一区区三区四区产品精品蜜桃| 亚洲男人第一天堂| 成人性生交大片免费看中文网站 | 91超碰在线播放| 亚洲美女屁股眼交3| 成人免费高清完整版在线观看| 久久久久久久极品| 一区二区亚洲| 国内精品久久久久久| 久久综合亚洲色hezyo国产| 国产精品久久久久久久久久10秀 | 日本vs亚洲vs韩国一区三区| 社区色欧美激情 | 在线免费观看视频| 第一会所亚洲原创| 日韩亚洲第一页| 中日韩一级黄色片| 综合久久亚洲| 欧美黄色片免费观看| 久久久久久久久久综合| 亚洲午夜av| 97免费视频在线| 日韩色图在线观看| 国产精品99一区二区三区| 在线视频欧美性高潮| 乳色吐息在线观看| 136福利精品导航| 亚洲精品一区二区在线观看| 日韩成人av一区二区| 亚洲区小说区图片区qvod| 亚洲男人av电影| 91狠狠综合久久久久久| 88国产精品视频一区二区三区| 九九精品在线观看| 国产成人亚洲欧洲在线| 久久福利影视| 成人免费视频a| 免费观看黄一级视频| 91网站黄www| 亚洲一卡二卡三卡| 午夜福利理论片在线观看| 久久先锋资源网| 午夜精品一区二区在线观看的| av在线中文| 悠悠色在线精品| 日韩av在线第一页| 福利精品在线| 欧美成人bangbros| 蜜桃无码一区二区三区| 91精品观看| 青草青草久热精品视频在线网站 | 国产高清视频在线观看| 1区2区3区精品视频| 国产男女免费视频| 久久69成人| 亚洲国产精品福利| 日本免费网站视频| 香蕉av777xxx色综合一区| 国产主播精品在线| 天天干天天爽天天操| 国产精品福利一区二区三区| 无码中文字幕色专区| 狂野欧美性猛交xxxx| 亚洲第一视频网| 开心激情五月网| 国产精品美女| 亚洲最大av网站| a视频网址在线观看| 婷婷激情综合网| 国产在线观看中文字幕| 免费久久精品| 97精品国产97久久久久久春色| 一卡二卡三卡在线| 2023国产一二三区日本精品2022| 公共露出暴露狂另类av| 正在播放日韩精品| 精品女同一区二区| 最新av电影网站| 天堂影院一区二区| 狠狠色综合色区| 伊人手机在线| 欧美剧在线免费观看网站| 免费黄色在线视频| 要久久爱电视剧全集完整观看| 九色精品免费永久在线| 亚洲综合精品国产一区二区三区| www日韩大片| 免费观看美女裸体网站| 日韩在线成人| 久久久国产视频91| 中文字幕av在线免费观看| 26uuu国产电影一区二区| 99在线免费视频观看| 欧美a级大片在线| 亚洲高清久久网| 538任你躁在线精品视频网站| 日本强好片久久久久久aaa| 欧美日韩精品免费观看| 麻豆mv在线观看| 日韩成人中文电影| 人人干人人干人人干| 成人黄色在线看| 欧美国产日韩激情| 国产成人澳门| 97国产在线视频| 天天在线女人的天堂视频| 国产亚洲欧美一区在线观看| 老太脱裤让老头玩ⅹxxxx| 高清日韩中文字幕| 91精品国产色综合| 日韩一区二区三区中文字幕| 欧美三级免费观看| 少妇精品一区二区三区| 久久国产免费| 亚洲欧美日韩在线综合| 日韩成人综合网| 日韩精品福利在线| 国产精品人人人人| 久久久久国产精品麻豆 | 麻豆精品一区二区综合av| 2022国产精品| 色爱综合区网| 日韩风俗一区 二区| 欧美日韩乱国产| 国产欧美一区二区精品仙草咪| 日韩久久久久久久久久久久| 欧美男女交配| 最新中文字幕亚洲| 精品国产九九九| 亚洲成人777| 日本aaa视频| 九九精品视频在线看| 日韩亚洲欧美一区二区| 欧美日韩看看2015永久免费 | 国产精品对白久久久久粗| 欧美在线中文字幕| av在线天堂| 日韩精品一区二区三区三区免费| 日本三级理论片| 欧美国产在线观看| 免费观看黄网站| 久久国产精品毛片| 欧美做受777cos| 国产剧情在线观看一区| 亚洲自拍偷拍色图| jk漫画禁漫成人入口| 精品久久国产精品| 色资源在线观看| 91精品国产综合久久福利| 奇米影视第四色777| 国产精品你懂的在线| 国产一卡二卡三卡四卡| 欧美a一区二区| 国产免费黄色一级片| 日韩高清欧美| 国产精品露脸av在线| 日韩精品亚洲人成在线观看| 亚洲欧洲一区二区三区在线观看 | 亚洲天堂成人在线| 亚洲av综合色区无码一二三区| 亚洲6080在线| 亚洲伦理一区二区三区| 国产亚洲污的网站| 国产精品无码专区| 亚洲每日更新| 色中文字幕在线观看| 亚洲区小说区| 国产精品日韩欧美一区二区| 美女视频一区| 国产成人精品综合| 狠狠操一区二区三区| 美女精品视频一区| 亚洲国产精品成人久久蜜臀| 日本精品视频一区二区| 青青操免费在线视频| 自拍视频在线观看一区二区| 男人舔女人下部高潮全视频| 成人一区二区三区视频| 在线观看网站黄| 久久成人18免费观看| 天天影视综合色| 欧美中文日韩| 黄色www网站| 一区在线播放| 欧美日韩福利在线| 黄色成人av网站| 免费的一级黄色片| 午夜久久99| 成人短视频在线观看免费| 久久精品亚洲欧美日韩精品中文字幕| 日韩精品电影网站| 国产亚洲电影| 日本在线播放一区| 欧美日韩中文一区二区| 欧美重口乱码一区二区| 青青操综合网| 久久亚洲免费| 亚洲资源网站| 视频一区免费观看| 精品国产精品国产偷麻豆| 日本一区免费看| 精品国精品国产自在久国产应用| 欧美一区二区三区在线免费观看 | a∨色狠狠一区二区三区| 国产成人精品久久二区二区| 久久青青视频| 国产精品一区二区三区久久久| 成人黄色网址| 日韩中文字幕在线看| 免费黄网站在线播放| 久久人人爽人人爽人人片亚洲| 黄网站在线播放| 欧美成人激情视频| 久久免费电影| 91sa在线看| 国产亚洲一区二区手机在线观看| 国产精品麻豆va在线播放| 男人亚洲天堂| 91原创国产| 欧美巨大xxxx| 午夜欧美性电影| 中文字幕一区二区三区在线视频 | 国产三级伦理在线| 在线成人免费网站| 欧美jizzhd欧美| 欧美激情一区二区三区在线视频观看 | 久久亚洲国产精品尤物| 成人性生交大片免费看视频直播| 欧美h版在线观看| 精品欧美一区二区三区久久久| 综合伊思人在钱三区| 永久久久久久| 在线观看一区视频| 国产福利影院在线观看| 国产一区二区三区黄视频 | 米奇精品关键词| 日本在线观看不卡| 你懂的一区二区| 成人在线看视频| 国产精品一级在线| 日韩不卡一二三| 国产成人一区在线| 久久久久亚洲av成人无码电影 | 日韩av在线播| 欧洲av一区二区嗯嗯嗯啊| 国产高清视频免费观看| 日韩精品视频中文在线观看| 午夜激情视频在线| 69久久夜色精品国产69| 国内自拍亚洲| 久久精品一二三区| 婷婷亚洲最大| 午夜精品久久久内射近拍高清| 黑人精品欧美一区二区蜜桃 | 久久国产精品国产精品| 成人性色生活片| 蜜桃av免费观看| 色综合天天综合网天天看片| 国产精品一品二区三区的使用体验| 亚洲国产精品字幕| 伊人精品影院| 国产一区二区在线免费| 天天做夜夜做人人爱精品| 久久视频免费在线| 免费看欧美女人艹b| 国产麻豆xxxvideo实拍| 亚洲天堂精品在线观看| 在线视频一区二区三区四区| 欧美mv日韩mv亚洲| 黄在线免费看| 国产欧美婷婷中文| 久久99精品久久久久久园产越南| 欧美日韩激情四射| 国产乱码精品一区二区三区忘忧草 | 久久综合偷偷噜噜噜色| 四虎一区二区| 久久久久久久波多野高潮日日| www.啪啪.com| 亚洲一区二区综合| 精品久久久中文字幕人妻| 日韩中文字幕在线播放| 久久精品超碰| 日韩欧美视频一区二区| 久久亚洲精选| 国产高潮呻吟久久| 91成人免费网站| 欧美另类自拍| 日本精品一区二区三区在线| 狠狠久久伊人| 成人在线观看你懂的| av一区二区三区黑人| 亚洲国产精一区二区三区性色| 精品人在线二区三区| 手机av免费在线| 成人av资源网| 亚洲一级一区| 亚洲天堂av网站| 精品欧美激情精品一区| 亚洲免费国产视频| 国语自产精品视频在线看| 成人福利免费在线观看| 亚洲熟妇无码一区二区三区| 成人激情小说乱人伦| 成人毛片18女人毛片| 精品无人区乱码1区2区3区在线| 五月天av在线| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 国产三级一区二区| 欧美一区二区三区久久久| 伊人伊成久久人综合网小说| 欧美色片在线观看| 亚洲图色在线| 国产一区二区在线看| 亚洲一区二区91| 精品一区二区三区电影| 日韩av超清在线观看| 杨幂一区欧美专区| 国产一区二区91| 日本三级片在线观看| 国产亚洲视频在线观看| 在线观看av免费| 国产区一区二区三区| 久久国产免费| 神马午夜精品91| 精品国精品国产| 欧美亚洲韩国| 青青草原国产免费| 成人动漫一区二区| 国产字幕在线观看| 精品国产自在精品国产浪潮| 亚洲精品v亚洲精品v日韩精品| 欧美乱大交xxxxx潮喷l头像| 久久日韩精品一区二区五区| 国产又粗又长视频| 久久免费视频观看| japanese国产精品| 精品人妻人人做人人爽夜夜爽| 国产欧美日韩久久| av网站在线免费看| 欧美整片在线观看| 91精品一区二区三区综合在线爱| 在线精品视频播放| 欧美性猛交xxxx乱大交退制版| 天天干天天干天天干| 国产精品色婷婷视频| 欧美日韩亚洲一区| 久久久久无码精品| 激情av一区二区| 蜜芽在线免费观看| 久久亚洲精品欧美| 国产精品一区专区| 毛片在线免费播放| 午夜精品一区二区三区在线视| 日韩国产综合| 国产精品福利导航|