基于自动分号插入JS规则的有趣错误。需要说明

时间:2019-05-07 10:36:46

标签: javascript ecmascript-6 syntax

今天我写了一些编程竞赛的代码。当我运行它时,我因错误而感到惊讶。 在看起来像“无错误空间”的地方无法读取未定义的属性“ forEach”

sum = 0
            [-1,0,1].forEach(deltar =>{...});

sum变量值赋值代码开始起作用后添加分号时。

sum = 0;
            [-1,0,1].forEach(deltar =>{...});

对于 JS 的行为很好奇,这里的解释器不匹配是什么? JS 如何与整数数组混淆?

这里是完整的变量声明代码功能的完整代码。

function boxBlur(img) {
    let [h,w] = [img.length-1,img[0].length-1];
    let [answer,sum,tmp] = [[],0,[]]
    for(let row = 1; row < h; row += 1){
        tmp = []
        for(let clmn = 1; clmn < w; clmn += 1){
            sum = 0;
            [-1,0,1].forEach(deltar =>{
                [-1,0,1].forEach(deltac =>{
                    sum += img[row+deltar][clmn+deltac]
                });
            });
            tmp.push(parseInt(sum/9));
        }
        answer.push(tmp);
    }
    return answer;
}

2 个答案:

答案 0 :(得分:3)

问题在于,当您不放置分号时,它不会自动放置;

  • 它尝试获取数字的属性3
  • 这里[1,2,3]不能用作数组,而可以用作Bracket Notation
  • 由于Comma Operator的最后一个操作数3
  • 因此0[3]undefinedundefined.forEach(){...}显然会引发错误。

let sum = 0
[1,2,3]
console.log(sum)

答案 1 :(得分:3)

Nodejs version: 8.12.0
React version: 16.8.3
React Native version: 0.59.5
react-native-gifted-chat version: 0.8.0
Platform: Android

comma operator

如此

1,2,3 === 3 

bracket notation

因此

[1,2,3] -> [3] i.e. is property named 3 

因为Number(0)没有称为3的属性

以进一步说明

sum = 0[3] is undefined - 

现在代码等同于

var sum = 0
[1,2,3,'constructor']

console.log(sum);

var sum = 0['constructor']

在控制台中看到的是var sum = 0..constructor 对象构造函数