【问题标题】:Javascript unusual FOR loop. Please, confirm that my interpretation is correctJavascript 异常 FOR 循环。请确认我的解释是正确的
【发布时间】:2015-05-26 18:31:57
【问题描述】:

我有一段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) 根据 == 运算符(而不是 ===)的定义为 false 时,for 循环会中断。

在这个question中已经向我解释了内部代码结构,我很确定,但是请确认这部分。

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

【问题讨论】:

  • 是的,据我所知,这两者是相等的。为了澄清:a = o.exec(s)o.exec(s) 分配给a 并使用o.exec(s) 的结果(真实性)。

标签: javascript syntax minify


【解决方案1】:

我能看到的唯一区别是

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 上没有正在使用的访问器属性,那么这两段代码是等价的。

【讨论】:

  • 哦,原来如此!实际上我什至没有猜到,javascript 确实有可能管理对象属性的自定义 getter 和 setter,类似于 C#(当然,考虑到 javascript 语言的差异)。 / 细节。 defineProperty docs 帮助了我的细节(也许会帮助其他人)。考虑到 getter/setter 和执行优先级/条件的副作用,您的代码看起来 100% 等效。谢谢!
  • 我能否再澄清一件事:defineProperty 是否有任何替代的简短语法?我在文档中没有找到任何内容,但需要确定,以避免在分析代码时丢失它。
【解决方案2】:

还有一个。抱歉,我不确定该放在哪里。这可能是一个单独的问题,但我不确定。所以,这里是代码:

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 和一些副作用。因此,如果在它们之前没有 var,在函数体内,使它们成为本地的,那么来自自定义 getter/setter 的副作用将两次而不是一次应用于上下文,显然打破了逻辑。真的是这样吗?

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 2014-04-12
    • 2016-08-20
    • 2013-10-23
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多