JavaScript 的一些奇怪概念

2025-05-25

JavaScript 的一些奇怪概念

在本文中,我们将探讨一些 JavaScript 中奇奇怪怪的概念,其中一些你可能知道,而另一些你可能不知道。所以,请持续关注。

不明确的

在非严格模式下,实际上可以(尽管非常不明智!)
为全局提供的未定义标识符分配一个值:

// non-strict
function foo() {
  undefined = 2; // really bad idea!
}

foo();
Enter fullscreen mode Exit fullscreen mode
// Strict Mode
function foo() {
  "use strict";
  undefined = 2; // TypeError!
}

foo();
Enter fullscreen mode Exit fullscreen mode

然而,无论在非严格模式还是严格模式下,你都可以创建一个名为undefined的局部变量。不过,这又是一个糟糕的主意!

function foo() {
  var undefined = 2;
  console.log(undefined); // 2
}
foo();
Enter fullscreen mode Exit fullscreen mode

非数(NaN)

如果执行的任何数学运算的两个操作数都不是数字(或可以解释为十进制或十六进制的常规数字的值),则运算将无法生成有效数字,在这种情况下,您将得到 NaN 值。

let a = 2 / "foo"; // NaN
typeof a === "number"; // true
Enter fullscreen mode Exit fullscreen mode

换句话说,“非数字的类型是数字!”令人困惑的名称和语义。

var a = 2 / "foo";
isNaN(a); // true
Enter fullscreen mode Exit fullscreen mode

很简单,对吧?我用了内置的全局函数isNaN(..),它会告诉我们值是否NaN正确。问题解决了!还没那么快。

isNaN(..) 工具有一个致命的缺陷。它似乎试图过于字面地理解 NaN(“非数字”)的含义——它的工作基本上就是“测试传入的东西是数字还是非数字”。但这并不完全准确:

var a = 2 / "foo";
var b = "foo";
a; // NaN
b; //"foo"
window.isNaN(a); // true
window.isNaN(b); // true--ouch!
Enter fullscreen mode Exit fullscreen mode

显然,"foo"它实际上不是一个数字。它是一个字符串,但当你isNaN("16")这样做时它会返回,false因为当 JavaScript 进行隐式转换时它会完美地转换为,number这就是它返回的原因false

无穷大

使用 C 等传统编译语言的开发人员可能习惯于看到编译器错误或运行时异常,例如divide by zero如下操作:

let a = 1 / 0;
Enter fullscreen mode Exit fullscreen mode

然而,在 JS 中,这个操作是定义明确的,并且会返回值Infinity(也就是Number.POSITIVE_INFINITY)。不出所料:

var a = 1 / 0; // Infinity
var b = -1 / 0; // -Infinity
Enter fullscreen mode Exit fullscreen mode

虽然这可能会让数学思维的读者感到困惑,但 JavaScript 既有普通的零 0(也称为正零 +0),也有负零 -0。在解释 -0 存在的原因之前,我们应该先了解一下 JS 是如何处理它的,因为它可能会让人感到困惑。

除了字面上的 -0 表示外,负零还可以通过某些数学运算得出。例如:

var a = 0 / -3; // -0
var b = 0 * -3; // -0
Enter fullscreen mode Exit fullscreen mode

;让我们看更多的例子zeros

var a = 0;
var b = 0 / -3;
a == b; // true
-0 == 0; // true
a === b; // true
-0 === 0; // true
0 > -0; // false
a > b; // false
Enter fullscreen mode Exit fullscreen mode

无效的

我们知道typeof这是一个运算符,通过它我们可以检查变量的类型,如下所示:

typeof undefined === "undefined"; // true
typeof true === "boolean"; // true
typeof 42 === "number"; // true
typeof "42" === "string"; // true
typeof { life: 42 } === "object"; // true
Enter fullscreen mode Exit fullscreen mode

你可能已经注意到了,我null从上面的列表中排除了它。它很特殊——之所以特殊,是因为它与typeof运算符结合使用时会出现 bug:

typeof null === "object"; // true
Enter fullscreen mode Exit fullscreen mode

如果它返回,那就太好了(而且正确!)null,但 JS 中的这个原始错误已经持续了近二十年,并且可能永远无法修复,因为有太多现有的 Web 内容依赖于其错误行为,以至于“修复”该错误会产生更多的“错误”并破坏许多 Web 软件。

null是唯一的原始值,falsy但也是objecttypeof检查中返回的。

奖金

什么是假值?
假值(有时写作 falsey)是指在布尔上下文中遇到时被视为假的值。

if (false)
if (null)
if (undefined)
if (0)
if (-0)
if (0n)
if (NaN)
if ("")
Enter fullscreen mode Exit fullscreen mode

什么是真值?
在 JavaScript 中,真值是在布尔上下文中被视为真的值。

if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
Enter fullscreen mode Exit fullscreen mode

结论

这不是结束,以后我还会讲很多类似的内容,所以不妨关注一下。如果你学到了新东西,请点赞。

现在您可以通过给我买一杯咖啡来表示您的支持。😊👇

给我买杯咖啡

另请阅读

文章来源:https://dev.to/j471n/some-strange-concept-of-javascript-4icc
PREV
每个开发人员都需要了解的十大网站
NEXT
我的 VS Code 设置