今天我發現可以在函數調用的括號之前使用操作。函數調用前的操作符
E.g.
console.log|('Hello world!');
或
console.log>>(33);
爲什麼這是可能會發生什麼?
今天我發現可以在函數調用的括號之前使用操作。函數調用前的操作符
E.g.
console.log|('Hello world!');
或
console.log>>(33);
爲什麼這是可能會發生什麼?
像大多數「類ALGOL」的語言,括號在JavaScript中有多重含義:
2 * (3 + 4)
console.log(5)
function(x) {}
當您在函數名稱和函數調用括號之間插入運算符時,這個成爲分組操作員。這不再是函數調用。因此func(args)
變成func op (args)
,這在語法上是一個有效的表達式,因爲函數是javascript中的「頭等公民」,並且可以像任何其他值一樣在表達式中使用。不管它是否合理,還有另一個問題,因爲除了+
之外,運算符在應用於函數時不會產生任何有意義的東西。
_「除了'+',操作符在應用於函數時不會產生任何有意義的結果」_我不同意:屬性訪問器('[]'和'.')_do_增加值。 'someFunction.toString = function(){return'custom behavior';};'_can_是有用的,並且可以用來在其他操作符被使用時使函數對象以某種方式運行 – 2015-02-11 08:07:07
其實,你是不是在執行功能,你只是計算表達式(沒有任何意義可言)
的console.log|('Hello world!')
,將被評估爲:
[native function] | 'Hello world!'
這是沒有意義的,因爲「|」是一個按位運算符。和你給出的另一個例子一樣。
所以,你不是在函數調用之間放置運算符。您正在分離這些值,並且不再執行預期的操作(funcion調用)。
nit-pick:'console.log | ('Hello world!')'正在執行_「動作」 - 就JS而言。它執行的動作不再是函數調用; --P – 2015-02-10 15:17:30
@EliasVanOotegem - True :) - 改述 – LcSalazar 2015-02-10 15:18:35
簡而言之:因爲一個操作符在操作數上工作,並且函數在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 (LOperand)
| (operator)
('hello world') (ROperand, to be evaluated further still because of the grouping operator())
,並嘗試評估他們對於兼容類型的運營商來完成其工作。 console.log
實際上是一個對象,一個函數實例。 hello world
是分組操作符內的字符串常量。
這些類型將如何被強制和評估是在ECMAScript標準(谷歌它)中指定的,但底線,函數(console.log
)可能被強制爲一個字符串(就好像您打電話給console.log.toString()
,這會給出"function log() { [native code] }"
鉻)。其結果是,該代碼的行爲一樣:
"function log() { [native code] }"|"Hello world"
這將產生0
這是可能的函數調用的括號前使用操作。
並非如此,
console.log|('Hello world!');
相當於
console.log | 'Hello world!';
具有比你預期的:)
('Hello world!')
不同的意義是一樣的'Hello world!'
和|
是bitwise或 JavaScript中的運算符(left | right
將匹配左操作數和右操作數逐位)。
在你的榜樣,console.log
沒有括號返回函數本身(而不是console.log()
返回undefined
),所以你基本上是[Function] | 'Hello world!'
。
'console.log |('Hello world!');'與'console.log | 'Hello world!'; – Hacketo 2015-02-10 14:25:20