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