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 的副作用将被应用到上下文两次而不是一次,显然打破了逻辑。真的是这样吗?
我在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 的副作用将被应用到上下文两次而不是一次,显然打破了逻辑。真的是这样吗?