首页 > 解决方案 > 你可以在使用条件时不使用函数的 ( ) 吗?

问题描述

抱歉,如果我的英语打扰了您,但我刚刚意识到您在使用条件时不需要将 ( ) 与函数一起使用 - 至少三元运算符是这种情况。

这是我的代码:

let mark = {

fullName: 'Mark Wough',

mass: 100,

height: 1.8,

calcBMI: function()

return this.mass / (this.height * this.height;)

}

};



let john = {

fullName: 'John Smith',

mass: 90,

height: 1.5,

calcBMI: function()

return this.mass / (this.height * this.height;)

}

};

console.log(mark.calcBMI(, john.calcBMI());)

mark.calcBMI>john.calcBMI? console.log('Mark has higher BMI'): console.log('John has higher BMI');)

请注意,我正在做 mark.calcBMI 而不是 mark.calcBMI() 并且两者似乎都在工作!

任何人都可以解释一下这是否正是它的方式,或者我错过了什么,如果它是正确的,你不需要在使用条件的函数中使用 (),这是一个好习惯,不要仅仅因为它而使用它们可选的还是我应该使用它们来更安全?

标签: javascriptfunctionconditional-statementsconditional-operator

解决方案


在您的代码中mark.calcBMI,并且john.calcBMI都是对函数的引用。所以当你执行时:

mark.calcBMI > john.calcBMI

您正在检查一个函数是否大于另一个函数(请注意,这些是函数值,而不是调用这些函数的返回值)。所以上面的内容或多或少类似于写作:

(function() {}) > (function() {})

由于询问一个函数值是否大于另一个函数值是没有意义的,因此 JavaScript 会尝试将两个函数都转换为基元(基元是字符串、数字、布尔值等类型)。由于函数是对象,JavaScript 将调用这.toString()两个函数的方法,这会将函数对象转换为原始字符串。JavaScript 为我们进行了这种转换,所以在幕后它被解释为:

"function() {}" > "function() {}"

现在两个函数都是字符串,可以比较它们。由于左侧字符串不大于右侧字符串(它们相等),因此您会得到false结果。相同的想法适用于calcBMIjohn 和 mark 的函数。由于它们的.toString()值都相同,因此在比较这两个函数时会得到错误的结果。

这意味着( )在调用函数1时需要使用括号,否则:

mark.calcBMI > john.calcBMI

... 将始终评估为false,因为两个calcBMItoString 方法都返回相同的字符串。

请参阅下面的示例以进一步了解:

const ex1 = (function() {}) > (function() {});
console.log("ex1", ex1);

const ex2 = (function(a) {}) > (function(b) {});
console.log("ex2", ex2);

const ex3 = (function(b) {}) > (function(a) {});
// "function(b) {}" > "function(a) {}", code unit of "b" larger is than the code unit of "a" so the result is `true` 
console.log("ex3", ex3);

1. 例外情况是您的方法是吸气剂


推荐阅读