只有 1% 的开发人员能在 60 秒内找到代码中的错误

开发 前端
这个 Bug 并不常见,但偶尔会让人头疼半天。如果在代码中习惯把大括号换行到下一行,又忘了手动加分号,就可能被 ASI“坑”到。

下面这段简单的 JavaScript 代码里藏着一个不起眼但足以让人抓狂的错误:

function getResult(a, b) {
    return 
    {
        result: a + b
    };
}

console.log(getResult(2, 3)); // 结果真的是 5 吗?

表面看上去,这只是一个“把两个数相加,然后返回对象”的函数,可实际运行后却并非预期的 { result: 5 }。乍一眼看不出任何毛病,但结果可能会让你大吃一惊。

Bug 原因

实际输出会是 undefined。为什么?这是 JavaScript 的自动分号插入(Automatic Semicolon Insertion, ASI)在作祟:

  • return 语句后面由于换行,JavaScript 会在此自动插入一个分号。
  • 花括号 {} 便被解释成代码块而不是对象字面量。
  • 这样一来,真正的返回语句被看作 return;,函数自然就返回了 undefined。

用“JS 眼中的解释”来写就是:

return; // 这行被自动插入了分号
{
    result: a + b;
}

如何修复

有两种常见做法都能解决这个问题:

让对象字面量跟在 return 同一行:

function getResult(a, b) {
    return {
        result: a + b
    };
}

在对象外包一层小括号:

function getResult(a, b) {
    return (
        {
            result: a + b
        }
    );
}

两种写法都能保证没有意外的分号插入,从而让函数正常返回 { result: 5 }

小结

这个 Bug 并不常见,但偶尔会让人头疼半天。如果在代码中习惯把大括号换行到下一行,又忘了手动加分号,就可能被 ASI“坑”到。
平时可以多注意一下这个特性,或者手动在 return 后面写对象时直接跟在同一行,避免自动分号的意外影响。自动格式化工具有时也会发生这种失误,看到这里或许就知道要警惕什么了。

责任编辑:姜华 来源: 大迁世界
相关推荐

2023-09-01 08:51:31

2010-08-09 16:09:25

2020-04-20 18:15:46

开发自信技术

2015-09-21 09:34:57

2020-05-25 16:36:19

开发工具编码

2019-04-24 08:56:34

Java开发人员常犯错误

2020-09-23 22:40:31

Python 开发编程语言

2012-07-20 10:46:44

Web

2020-05-17 16:10:36

开发人员软件开发开发

2022-10-09 19:02:16

JavaScript开发测验

2015-03-19 09:13:24

应用程序开发云服务商亚马逊

2022-12-29 08:27:03

Java开发人员编码

2022-04-30 17:15:45

Retool软件工程师开发者

2009-03-06 13:47:07

开发人员SOA

2010-03-20 20:35:33

2012-11-27 10:23:18

CSSWeb开发

2012-08-01 09:34:51

代码编辑器开发代码

2021-12-10 13:06:37

低代码无代码开发人员

2012-12-28 10:10:18

2021-12-10 23:48:19

Java开发技术
点赞
收藏

51CTO技术栈公众号