Javascript - 为什么首先评估 bool 表达式内的函数调用?

标签 javascript function boolean-expression

我将从我的问题的一个简化示例开始。

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/

相关文章:

javascript - 切换开关按钮的问题

javascript - 计算对象中出现的次数并记录序列被打破时的次数

javascript - 如何将en.jscript文件更改为farsi.jscript?

python - Tkinter 中的数据包生成器

c - C中的 "!!"是什么?

boolean 表达式困惑

javascript - 在 Javascript 中将复杂的字符串表达式解析为 bool 值

javascript - 使用javascript在鼠标悬停时停止动画

javascript - 如何在函数调用之间设置超时?

java - 从枚举调用函数