JavaScript 中的一切都是对象吗?

2025-06-07

JavaScript 中的一切都是对象吗?

好吧好吧!这篇文章的动机源于我上一篇文章,当时一位读者发表了一条我无法认同的评论。我当时讨论了函数和闭包(以及闭包的内部工作原理),以及 JavaScript 中的每个函数在其作用域中实际上都是一个闭包。但后来有人说,JavaScript 中的所有实体不都是对象吗?我没想到这一点,但这也不是第一次有人提出这个问题了。所以,你会发现我在这篇文章中试图实际地解释这个问题。

如果可以的话,打开浏览器控制台,尝试创建一个简单的变量并赋值给它一个字符串值。你是怎么做到的?你写过类似这样的代码吗?

var myString = "That's my string";
Enter fullscreen mode Exit fullscreen mode


或者你选择

var myString = new String("That's my string");
Enter fullscreen mode Exit fullscreen mode


事实上,我知道你没有选择最后一种方法。我的意思是没有人会这么做。如果你想证明我错了,说你确实选择了第二种方法,那么有人可能会问你,为什么?MDN 说“字符串原语和字符串对象在大多数情况下可以互换使用”。MDN 还说“原语是非对象的数据”。第二句话清楚地表明了“ JavaScript 中并非所有东西都是对象”,这可以通过使用“ typeof 运算符”轻松验证。我们仍然需要澄清引脚大小的区别。举个例子?

let myString = "That's my string";
let yourString = new String("That's your string");

console.log(typeof myString); // outputs "string"
console.log(typeof yourString); // outputs "object"

//MDN says primitives and objects can SOMETIMES be interchangeably used
let yourBigString = yourString.toUpperCase();
console.log(yourBigString); // outputs "THAT'S YOUR STRING"
let myBigString = myString.toUpperCase();
console.log(myBigString); // outputs "THAT'S MY STRING"
Enter fullscreen mode Exit fullscreen mode
在 codepen 上尝试一下

这听起来耳熟吗?我们经常交替使用原始值和对象,因为 JavaScript 允许原始值以某种方式使用真实对象中设计的方法。使用原始值可以让你写得简洁,同时又能享受使用简单方法操作和处理值的便利。当你在原始字符串值上调用 String 对象的方法时,为了使其工作,你的原始值首先会被包装到一个合适的包装类(在本例中为 String)中。你想要调用的方法会在瞬态对象上调用,该对象会在返回结果后立即被丢弃。请阅读 MDN 上的说明。以下代码笔将提供一个演示。

您现在可能有两个问题

  1. 如果在内部解决这个问题,如果我们假设 JavaScript 中的一切都是对象,会发生什么问题?
  2. 如果每次我们使用原语时 JS 引擎都在内部执行自动装箱,这是否比简单地使用字符串对象更昂贵?

为了回答第一个问题,让我再举一个例子,它是对第一个例子的扩展。这个例子展示了这样一种情况:有人试图将某个属性赋值给某个原语,并期望该属性可以被检索。如果你将某个属性赋值给一个字符串原语,并希望在某个时刻取回该属性的值,那么你只会得到“ undefined ”的结果,因为临时字符串对象当时就被丢弃了。同样,在使用 eval 时,这种假设也可能失效(eval 确实不应该使用)。这些例子可能不太贴切,但我想它们足以警示我们不要妄下结论。

我认为第二个问题同样重要。尽管将原始类型强制转换为对象,然后调用临时对象的方法,这看起来是一个繁琐的过程,但 JavaScript 引擎高度优化了这个过程。它甚至可能完全跳过创建额外对象的过程。如果你仍然想知道我们为什么需要原始类型,最好问问 Brendan Eich,正如 TJ Crowder 在这篇回答中所说。


结论

最后,我只想强调一下 MDN 上的说法:“在大多数情况下,字符串原语和字符串对象可以互换使用”。我们大概知道为什么他们说的是“大多数情况下”,而不是“总是”。

最初发布于此处 -

https://mayankav.webflow.io/blog/is-everything-in-javascript-an-object

文章来源:https://dev.to/mayankav/is-everything-in-javascript-an-object-1alg
PREV
实施微前端——发展遗留代码库的途径下一步是什么?
NEXT
开始学习 React.js 之前你需要掌握的知识!什么是 React.js??先决条件