Javascript对于循环来说是不寻常的。请确认我的解释是正确的

Javascript对于循环来说是不寻常的。请确认我的解释是正确的,javascript,syntax,minify,Javascript,Syntax,Minify,我有一段javascript代码: for ( m = a[1], s = a[2], c.hash_match = i.replace(m, ""), o.lastIndex = 0; a = o.exec(s); ) { e[a[1]] && (c[e[a[1]]] = c[e[a[1]]] || decodeURIComponent(a[2])); } 我认为它是如何工作的: m = a[1]; s

我有一段javascript代码:

for (
    m = a[1],
        s = a[2],
        c.hash_match = i.replace(m, ""),
        o.lastIndex = 0;
    a = o.exec(s);
) {
    e[a[1]] && (c[e[a[1]]] = c[e[a[1]]] || decodeURIComponent(a[2]));
}
我认为它是如何工作的:

m = a[1];
s = a[2];
c.hash_match = i.replace(m, "");
o.lastIndex = 0;
while(a = o.exec(s))
{
    if(e[a[1]])
    {
        if(!c[e[a[1]]])
        {
            c[e[a[1]]] = decodeURIComponent(a[2]);
        }
    }
}
据我所知,在for循环中第一个分号之前的四个运算符可以放在外部,因为for循环不使用由逗号分隔的赋值列表返回的结果

对于==运算符(not==)的定义,当o.exec为false时,for循环中断

内部代码的构造已经在这篇文章中向我解释过了,我很确定,但是请确认这一部分


我做了一些测试并检查了一些行为,但需要确保我的解释100%正确,因为它是大型js脚本的一部分,我不确定我的测试工作是否足以在重构后保留代码逻辑。那么,这两个片段相等吗?

我能看到的唯一区别是

c[e[a[1]]] = c[e[a[1]]] || decodeURIComponent(a[2])
更像

var temp = c[e[a[1]]];
if(!temp)
{
    c[e[a[1]]] = decodeURIComponent(a[2]);
} else {
    c[e[a[1]]] = temp;
}
如果
c[e[a[1]]]=c[e[a[1]]]
是由具有setter函数的访问器属性定义的,则显然冗余的自分配
c[e[a[1]]]=c[e[a[1]]]]
是相关的。赋值操作将调用setter


如果在
c
上没有使用访问器属性,那么这两段代码是等效的。

这里还有一段。对不起,我不知道该放在哪里。这可能是一个单独的问题,但我不确定。下面是代码:

function i(e,t) {
    var h = y.map;
    var m = h && h["*"] || {};
}
因此,考虑到目前所知,功能体的替代物可以是:

var h = y.map;
var m;
var temp;
if(h)
{
    temp = h["*"];
    if(temp)
    {
        m = temp;
    }
    else
    {
        m = {};
    }
}
else
{
    m = {};
}
我还可以说:

var h = y.map;
var m = {};
if(h && h["*"])
{
    m = h["*"];
}

但h和m可以在更高范围内的其他地方定义,并有一个自定义的getter/setter,带有一些副作用。因此,如果函数体中没有使它们成为局部变量的变量,那么来自自定义getter/setter的副作用将应用于上下文两次而不是一次,这显然破坏了逻辑。真的是这样吗?

是的,据我所知,这两个是相等的。为了澄清:
a=o.exec
o.exec
分配给
a
,并使用
o.exec
的结果(真实性)。哦,就是这样!事实上,我甚至没有猜到,javascript确实有可能管理对象属性的自定义getter和setter,类似于C#(当然,考虑到javascript语言的差异)细节。在细节上帮助了我(也许会帮助其他人)。考虑到getter/setter和执行优先级/条件的副作用,您的代码看起来100%等效。非常感谢。我能再澄清一件事吗:defineProperty是否有其他简短的语法?我没有在文档中找到任何内容,但需要确定,以避免在分析代码时丢失它。