我一直将其理解为 JavaScript 中的一种节省成本的操作,以避免重复引用对象上的嵌套属性。您不必一遍又一遍地编写 a.b.c.d
,而是更喜欢 let x = a.b.c.d;
,然后使用 x
(我经常听到的通俗说法是“缓存引用。”)
最近与一位 friend 交谈时发现,这样的事情在 C++ 中是完全没有必要的,而且是愚蠢的。
这是真的吗?如果是这样,为什么?我猜这与 C++ 对象和 JavaScript 对象之间底层语言实现的差异有关,但到底有什么区别?
最佳答案
与 C++ 类相比,JavaScript 对象更接近于 C++ 的 std::map
(或 std::unordered_map
)。
C++ 的优点是具有单独的编译和运行步骤。编译器确实可以花很长时间来分析程序的大块并对其进行大量优化。当您编写 C++ 时,您实际上并不是在编写供 CPU 执行的程序。您正在描述程序的行为,编译器将使用该描述为您生成一个程序。您的浏览器的 JavaScript 运行时(可能是 JIT 编译器)根本没有时间进行相同级别的分析和优化。它必须足够快地编译和运行您的程序,以便用户不会感觉到任何延迟。这并不是说 JavaScript 运行时不会进行任何优化,但与需要 20 分钟编译程序的 C++ 编译器相比,它往往会更加增量和本地化。
C++ 类的所有属性在编译时都是已知的。当您在 C++ 中访问对象的属性时,编译器将在编译时解析该访问;可能是少量内存加载或单个函数调用指令。由于这一切都在编译时解决,因此属性查找嵌套的深度并不重要。运行时性能将是相同的。此外,编译器将为您进行此类内存,可能是通过在寄存器中保留重复访问的属性来实现。
JavaScript 则不然。 JavaScript 对象没有一组已定义的属性。它们可以在对象的整个生命周期中添加和删除。这意味着 JavaScript 运行时必须使用某种关联数据结构(可能是哈希表)来跟踪对象的属性。当您请求对象的属性时,运行时必须查看该数据结构以查找所需的值,并且它必须对每个嵌套级别进行查找。
关于javascript - 为什么在 JavaScript 中访问 myInstance.property1.subproperty2.subproperty3 很方便,而在 C++ 中则免费?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61261378/