Javascript 不正常的 FOR 循环。请确认我的解释是正确的

Javascript unusual FOR loop. Please, confirm that my interpretation is correct

我在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 循环不使用这个逗号分隔的赋值列表返回的结果。

根据 == 运算符(不是 ===)的定义,当 o.exec(s) 为假时 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 可以在上层作用域的其他地方定义,并且有一个带有一些副作用的自定义 getters/setters。因此,如果在它们之前没有 var,在函数体内,使它们成为局部的,那么来自自定义 getters/setters 的副作用将被应用到上下文两次而不是一次,显然打破了逻辑。真的是这样吗?