首页 > 解决方案 > 需要代码解释(它是如何工作的以及为什么)

问题描述

我很难理解下面的代码以及它是如何工作的。

var createNestedObject = function( base, names ) {
    for( var i = 0; i < names.length; i++ ) {
        base = base[ names[i] ] = base[ names[i] ] || {};
    }
};

// Usage:
createNestedObject( window, ["shapes", "triangle", "points"] );
// Now window.shapes.triangle.points is an empty object, ready to be used.

它来自这个 Q/A: Javascript:如何使用数组给出的对象名称动态创建嵌套对象

你能解释一下base = base[ names[i] ] = base[ names[i] ] || {};工作原理吗?

由于上面的代码,我的思维过程卡住了。让我发狂。

标签: javascript

解决方案


你能解释一下如何base = base[ names[i] ] = base[ names[i] ] || {}; 作品?

假设我们在循环的第一圈,所以baseis windowiis0names[i]is “shapes”。评估的第一部分是base[ names[i] ] || {}。这将解决window.shapes它是否存在,或者如果它不存在则为空对象。

接下来,我们向左移动到这个作业:

base[ names[i] ] = base[ names[i] ] || {};

这将分配给window.shapes我们从右侧得到的任何东西。因此,如果window.shapes已经存在,我们将其分配给自身,并且没有任何变化。或者如果它不存在,我们给它分配一个空对象。

再向左移动一次:

base = base[ names[i] ] = base[ names[i] ] || {};

我们现在将重新分配base变量以指向我们刚刚创建的对象(或我们重用的对象)。所以对于下一轮循环,base不再是window,而是window.shapes

此时循环重复,但我们的变量现在更进一步了。basewindow.shapesi1names[i]是“三角形”。从baseis now 开始window.shapes,我们正在探测并分配给更深一层的对象。因此,虽然第一次通过循环我们确定window.shapes存在,但这次我们正在检查是否window.shapes.triangle存在。因此,它会随着每次循环继续,越来越深入地进入对象。


推荐阅读