TL;DR
Infinity 曾经是可覆盖的; Number.POSITIVE_INFINITY 和 Number.NEGATIVE_INFINITY 一直是只读的。
Infinity 是全局对象的属性(window 是在浏览器中运行的 Javascript 的全局对象),而 Number.POSITIVE_INFINITY 是 Number 构造函数的属性。
在 ECMAScript 第 5 版之前,可以覆盖全局对象的值属性:
Infinity = 123;
Infinity; // 123
undefined 和 NaN 也是如此,它们也是全局对象的属性,过去是可覆盖的。
Number 构造函数的属性一直是只读的:
Number.POSITIVE_INFINITY = 123;
Number.POSITIVE_INFINITY; // Infinity
规格:
ECMAScript 1st Edition(1997 年 6 月)
15.1.1.2Infinity
Infinity的初始值为+∞。
15.7.3.6Number.POSITIVE_INFINITY
Number.POSITIVE_INFINITY 的值为+∞。
此属性应具有属性 { DontEnum, DontDelete, ReadOnly }。
ECMAScript 5th Edition(2009 年 12 月)
在 ES5 中,全局对象的值属性被设为只读:
15.1.1.2Infinity
Infinity 的值为+∞(参见 8.5)。
此属性具有{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 属性。
Number 构造函数的属性并没有真正改变,但是属性被重命名了:
15.7.3.6Number.POSITIVE_INFINITY
Number.POSITIVE_INFINITY 的值为+∞。
此属性具有{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 属性。
截至 ES2018,这些定义没有改变。
关于isFinite:
我曾经发过question,关于为什么Google Closure Library 为isFinite 实现了一个自定义函数,答案是可能存在一些跨浏览器的不一致,虽然目前还不清楚是哪个浏览器和哪个不一致。