2015-02-10 44 views
2

今天我發現可以在函數調用的括號之前使用操作。函數調用前的操作符

E.g.

console.log|('Hello world!'); 

console.log>>(33); 

爲什麼這是可能會發生什麼?

+1

'console.log |('Hello world!');'與'console.log | 'Hello world!'; – Hacketo 2015-02-10 14:25:20

回答

3

像大多數「類ALGOL」的語言,括號在JavaScript中有多重含義:

  • 分組運算符,如2 * (3 + 4)
  • 函數調用運算符,如函數聲明console.log(5)
  • 部分語法:function(x) {}

當您在函數名稱和函數調用括號之間插入運算符時,這個成爲分組操作員。這不再是函數調用。因此func(args)變成func op (args),這在語法上是一個有效的表達式,因爲函數是javascript中的「頭等公民」,並且可以像任何其他值一樣在表達式中使用。不管它是否合理,還有另一個問題,因爲除了+之外,運算符在應用於函數時不會產生任何有意義的東西。

+0

_「除了'+',操作符在應用於函數時不會產生任何有意義的結果」_我不同意:屬性訪問器('[]'和'.')_do_增加值。 'someFunction.toString = function(){return'custom behavior';};'_can_是有用的,並且可以用來在其他操作符被使用時使函數對象以某種方式運行 – 2015-02-11 08:07:07

1

其實,你是不是在執行功能,你只是計算表達式(沒有任何意義可言)

console.log|('Hello world!'),將被評估爲:

[native function] | 'Hello world!' 

這是沒有意義的,因爲「|」是一個按位運算符。和你給出的另一個例子一樣。

所以,你不是在函數調用之間放置運算符。您正在分離這些值,並且不再執行預期的操作(funcion調用)。

+0

nit-pick:'console.log | ('Hello world!')'正在執行_「動作」 - 就JS而言。它執行的動作不再是函數調用; --P – 2015-02-10 15:17:30

+0

@EliasVanOotegem - True :) - 改述 – LcSalazar 2015-02-10 15:18:35

1

簡而言之:因爲一個操作符在操作數上工作,並且函數在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

1

這是可能的函數調用的括號前使用操作。

並非如此,

console.log|('Hello world!'); 

相當於

console.log | 'Hello world!'; 

具有比你預期的:)


('Hello world!')不同的意義是一樣的'Hello world!'|bitwise JavaScript中的運算符(left | right將匹配左操作數和右操作數逐位)。

在你的榜樣,console.log沒有括號返回函數本身(而不是console.log()返回undefined),所以你基本上是[Function] | 'Hello world!'

相關問題