javascript - 感叹号的优先级是否低于 Javascript 中的方法调用和属性访问?

标签 javascript

当使用感叹号否定表达式时,为了安全起见,我总是使用括号......但我做了一些测试,看起来感叹号运算符的优先级低到足以在大多数用例中不需要括号,即函数调用和属性访问:

!(myFunction());        // can be replaced by !myFunction()
!(myObject.myProperty); // can be replaced by !myObject.myProperty

对吗?无论如何使用括号是好习惯吗?

最佳答案

对于诸如运算符优先级(任何语言的基本部分)之类的东西,您最好的选择通常是查阅文档,例如

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

而不是做一堆测试。测试对于验证运行时行为很重要,但尝试根据经验确定运算符优先级可能会变得复杂:运算符有很多!

要真正了解运算符优先级的工作原理,我们必须稍微了解 Javascript 代码如何从源代码转换并最终执行。

(一般来说,这取决于您使用的 JS 运行时(例如 V8 或 WebKit 的 JavaScriptCore)。我不是这方面的专家,所以这是对您通常如何期望事情的高级概述工作。)

该过程的第一步涉及解析您的源代码的语法,并将其转换为由标记组成的抽象语法树 ,或您代码中的个人标识符。这些是代码中低级交互的“构建 block ”。

要具体查看您的第一个示例(省略括号),我们有:

!myFunction();

源代码中有四个标记:!myFunction();。我们可以通过从上到下阅读运算符优先级图表来确定这些标记的组合顺序。 (根据图表,; 不是运算符)。

“函数调用”的优先级最高,所以我们可以把表达式写成

!(myFunction());

因为“函数调用”运算符 (()) 将“绑定(bind)”到 ! 运算符之前的 myFunction 标识符。

同样,对于您的第二个示例(再次省略括号):

!myObject.myProperty;

我们有标记 !myObject.myProperty。向下阅读图表,我们看到“成员访问”(.) 的优先级 (18) 高于“逻辑非”(15),因此此表达式等同于

!(myObject.myProperty);

如果这两个运算符的优先顺序颠倒,我们将改为

(!myObject).myProperty;

为了解决您关于约定的问题:最终,我们可以简单地编写 !myObject.myProperty;,(正如大多数 JS 程序员所做的那样),因为我们直觉地期望属性访问具有比逻辑否定更高的优先级.

何时包含括号在很大程度上取决于个人喜好,您需要对何时使用括号形成良好的判断力。如果我们有选择的时间 100% 或 0% 使用括号,我们的代码将不可读。在两者之间有一条中间路径,最好的方法是阅读大量的 JS 代码,并培养对社区约定的直觉。当您刚开始时,多加括号永远不会有坏处;一旦您掌握了专业知识,您可能会喜欢更简洁的编码风格。

关于javascript - 感叹号的优先级是否低于 Javascript 中的方法调用和属性访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33531153/

相关文章:

javascript - 从 window.digitalData.user 获取值

javascript - Angularjs:在 $routeProvider 中使用 'resolve' 时如何显示加载图标?

javascript - node.js http.get 中的缓存控制

javascript - 将类组件转换为函数组件时出错

javascript - 如何将 GitHub 要点合并到我的 Codepen 项目中?

javascript - 如何用JQuery自动包装 `ul`中的所有 `div`元素?

javascript - Content-Security-Policy 和外部 Javascript 文件

javascript - 如何识别照片库中的 GIF 图片 (iOS)

javascript - babel.config.js 和 vue.config.js 有什么区别,我可以合并这两个文件吗?

javascript - 合并来自多个 rxjs observables 的结果