JavaScript中的“躲藏类”(也称为“形状”或“结构”)是V8等现代JavaScript引擎用来优化目标特点拜访速度的一个内部机制。这个概念关于开发者来说是通明的,但了解它有助于编写更高效的JavaScript代码。

躲藏类的概念

在JavaScript中,目标是特点的调集。在早期的JavaScript引擎中,特点拜访(读取或写入)或许相对较慢,因为引擎需求在目标的特点调集中搜索给定的键。为了优化这一过程,现代引擎(如V8,用于ChromeNode.js)引入了躲藏类。

当你创立一个目标时,V8会为该目标分配一个躲藏类。这个躲藏类描绘了目标的结构:它有哪些特点,每个特点存储在哪里。当你修正目标(增加、删去或修正特点)时,V8或许会为目标创立一个新的躲藏类。

优化特点拜访

躲藏类的首要目的是优化特点拜访。假如两个目标有相同的躲藏类,V8知道它们有相同的特点和相同的特点布局,这样就能够直接拜访特点,而不需求搜索。

躲藏类和功能

躲藏类的一个重要功能影响是:坚持目标结构的安稳功能够显著进步代码的执行速度。假如常常改动目标的结构(例如,频频增加或删去特点),V8需求不断创立新的躲藏类,这会降低特点拜访速度并增加内存使用。

示例代码

考虑以下两个函数,它们创立具有两个特点的目标,但以不同的次序增加特点:

function createObjA() {
    let obj = {};
    obj.x = 1;
    obj.y = 2;
    return obj;
}
function createObjB() {
    let obj = {};
    obj.y = 2;
    obj.x = 1;
    return obj;
}
let objA = createObjA();
let objB = createObjB();

虽然objAobjB终究有相同的特点,但因为特点的增加次序不同,它们会被分配不同的躲藏类。这意味着V8无法在这两个目标之间同享特点拜访的优化。

功能比照

功能比照涉及丈量具有安稳和不安稳目标结构代码的执行时间。通常,坚持目标结构安稳的代码会运行得更快,因为引擎能够更有效地优化特点拜访。

因为这些优化发生在底层,直接的功能比照需求使用特定的功能丈量东西(如V8的功能剖析东西)来调查特点拜访的时间差异。在日常开发中,遵循最佳实践(如初始化目标时一次性增加所有特点,避免频频增加或删去特点)通常是足够的。

结论

躲藏类是JavaScript引擎的内部优化机制,旨在加快特点拜访速度。作为开发者,了解躲藏类的存在和其对功能的影响有助于编写更高效的代码。经过避免频频改动目标结构,能够让引擎更好地优化代码,进步执行速度。