Javascript 函数调用之前的运算符

Javascript 函数调用之前的运算符,javascript,Javascript,今天我发现可以在函数调用的括号之前使用操作 例如 或 为什么会出现这种情况以及会发生什么?与大多数“类似algol”的语言一样,括号在javascript中有多种含义: 分组运算符,如2*(3+4) 函数调用操作符,如console.log(5) 函数声明语法的一部分:function(x){} 在函数名和函数调用括号之间插入运算符时,该运算符将成为分组运算符。这不再是函数调用了。所以func(args)变成了func op(args),这在语法上是一个有效的表达式,因为函数在javascr

今天我发现可以在函数调用的括号之前使用操作

例如

为什么会出现这种情况以及会发生什么?

与大多数“类似algol”的语言一样,括号在javascript中有多种含义:

  • 分组运算符,如
    2*(3+4)
  • 函数调用操作符,如
    console.log(5)
  • 函数声明语法的一部分:
    function(x){}

在函数名和函数调用括号之间插入运算符时,该运算符将成为分组运算符。这不再是函数调用了。所以
func(args)
变成了
func op(args)
,这在语法上是一个有效的表达式,因为函数在javascript中是“一流公民”,可以像任何其他值一样在表达式中使用。但是,它是否有意义是另一个问题,因为除了
+
,运算符在应用于函数时不会产生任何有意义的结果。

实际上,您不是在执行函数,只是在计算表达式(这根本没有意义)

console.log |('Hello world!')
将被评估为:

[native function] | 'Hello world!'
这毫无意义,因为“|”是位运算符。与您给出的另一个示例相同


因此,您没有将运算符放在函数调用之间。您正在分离这些值,而不再执行预期的操作(function调用)。

简单地说:因为运算符作用于操作数,而函数至少在JS中是第一类对象(这意味着它们可以被传递、返回和操作)

为此,您当然需要使用运算符。一个简单而不太牵强的例子:

function foo()
{
    return foo.bar;//. is an operator
}
console.log(foo());//logs undefined
foo.bar = '123';//again, the . operator
console.log(foo());//logs 123
但是,在您的情况下,JS将计算两个操作数(运算符任一侧的表达式):

并尝试将其评估为兼容类型,以便操作员执行其工作
console.log
是一个对象,实际上是一个函数实例
hello world
是分组运算符中的字符串常量。
ECMAScript标准(google it)中指定了如何强制和计算这些类型,但归根结底,函数(
console.log
)很可能被强制为字符串(就像调用
console.log.toString()
,在chromium上给出
“function log(){[native code]}”
)。结果是,代码的行为与:

"function log() { [native code] }"|"Hello world"
这将产生
0

可以在函数调用的括号之前使用操作

不完全如此

console.log|('Hello world!');
相当于

console.log | 'Hello world!';
其含义与您的意图不同:)


('Hello world!')
'Hello world!'相同
|
是JavaScript中的运算符(
left | right
将逐位匹配左操作数和右操作数)

在您的示例中,不带括号的
console.log
返回函数本身(而
console.log()
返回
未定义的
),因此您基本上是
[function]|“Hello world!”
console.log |('helloworld!')
console.log |“你好,世界!”;挑剔:
console.log |('helloworld!')
正在执行JS所关心的“操作”。它执行的操作不再是函数调用-P@EliasVanOotegem-True:)-重新表述为“除了
+
,运算符在应用于函数时不会产生任何有意义的结果”。我不同意这种说法:属性访问器(
[]
)确实增加了值
someFunction.toString=function(){return'custom behavior';}
非常有用,当使用其他运算符时,可以使用它使函数对象以某种方式运行
"function log() { [native code] }"|"Hello world"
console.log|('Hello world!');
console.log | 'Hello world!';