我将从我的问题的一个简化示例开始。
function foo(arr) {
let limit = 1,
count = 0;
for (let i=0, len=arr.length; i<len;) {
if (arr[i] === '0' || arr[i] === '1') {
let start = i;
do {
if (i - start >= limit) {
count++;
}
i++;
} while (i < len && arr[i] === '0' || arr[i] === '1');
} else {
i++;
}
}
return count;
}
function bar(arr) {
let limit = 1,
count = 0;
for (let i=0, len=arr.length; i<len;) {
if (arr[i] === '0' || arr[i].charCodeAt(0) === 49) {
let start = i;
do {
if (i - start >= limit) {
count++;
}
i++;
} while (i < len && arr[i] === '0' || arr[i].charCodeAt(0) === 49);
} else {
i++;
}
}
return count;
}
let arr = ['0', '2', '3', '0', '1', '0', '4', '2', '0'];
console.log(bar(arr));
console.log(foo(arr));
上述函数返回数组中某个模式出现的总次数,在某个连续限制后开始计数。它们是我的实际函数的简化示例,我想在其中计算类似 arr[i].charCodeAt(0) === 49
的表达式。仅当 i < len
.
foo 函数按预期工作,但如果我在 while 条件中包含函数调用(如 bar 中所示),则首先对其进行求值,并抛出一个 TypeError 尝试求值未定义的值索引。
我可以在 do-while-loop 内将该表达式移动到另一个表达式之前 i<len
查看。我想知道为什么函数的优先级高于“从左到右”的评估,以及是否可以采取其他措施来防止这种情况发生。
最佳答案
it throws a TypeError trying to evaluate an undefined index.
因为arr[9]
不存在,只需添加一个控制台语句来检查是否存在。
演示
function foo(arr) {
let limit = 1,
count = 0;
for (let i=0, len=arr.length; i<len;) {
if (arr[i] === '0' || arr[i] === '1') {
let start = i;
do {
if (i - start >= limit) {
count++;
}
i++;
} while (i < len && arr[i] === '0' || arr[i] === '1');
} else {
i++;
}
}
return count;
}
function bar(arr) {
let limit = 1,
count = 0;
for (let i=0, len=arr.length; i<len;) {
if (arr[i] === '0' || arr[i].charCodeAt(0) === 49) {
let start = i;
do {
if (i - start >= limit) {
count++;
}
i++;
console.log(i);
} while (i < len && arr[i] === '0' || arr[i].charCodeAt(0) === 49);
} else {
i++;
}
}
return count;
}
let arr = ['0', '2', '3', '0', '1', '0', '4', '2', '0'];
console.log(bar(arr));
console.log(foo(arr));
说明
你的陈述相当于写作
var a = 1;
var b = 2;
a < 1 && b < 2 || true; //return true
a < 1 && b < 2 || false; //return false
因为你使用过||在没有 ()
的表达式中,除非前两个表达式为 true
,否则它将被求值。
使用()
作为
} while (i < len && (arr[i] === '0' || arr[i].charCodeAt(0) === 49));
演示
function foo(arr) {
let limit = 1,
count = 0;
for (let i=0, len=arr.length; i<len;) {
if (arr[i] === '0' || arr[i] === '1') {
let start = i;
do {
if (i - start >= limit) {
count++;
}
i++;
} while (i < len && arr[i] === '0' || arr[i] === '1');
} else {
i++;
}
}
return count;
}
function bar(arr) {
let limit = 1,
count = 0;
for (let i=0, len=arr.length; i<len;) {
if (arr[i] === '0' || arr[i].charCodeAt(0) === 49) {
let start = i;
do {
if (i - start >= limit) {
count++;
}
i++;
console.log(i);
} while (i < len && (arr[i] === '0' || arr[i].charCodeAt(0) === 49));
} else {
i++;
}
}
return count;
}
let arr = ['0', '2', '3', '0', '1', '0', '4', '2', '0'];
console.log(bar(arr));
console.log(foo(arr));
关于Javascript - 为什么首先评估 bool 表达式内的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49513119/