2015-06-16 35 views
1

在下面的代碼片段中,爲什麼whatDoesItDo()函數返回「fail」作爲字符串? 如果有人能夠解釋這種行爲背後的概念,這將是有益的。帶字符串和索引的JavaScript類型強制

function whatDoesItDo() { 
 

 
    return (![] + [])[+[]] + (![] + [])[+!+[]] + 
 
    ([![]] + [][ 
 
     [] 
 
    ])[+!+[] + [+[]]] + (![] + [])[!+[] + !+[]]; 
 

 
} 
 

 
function result() { 
 

 
    document.getElementById("result").innerHTML = whatDoesItDo(); 
 

 
} 
 

 
result();
<html> 
 

 
<body> 
 
    <p id="result"></p> 
 
</body> 
 

 
</html>

+0

。什麼是你的預期輸出? –

+2

「失敗」是輸出。但問題是爲什麼? – Flake

+0

謎題應該去http://codegolf.stackexchange.com/ –

回答

14

您看到的效果)的強制類型轉換,B)索引到使用[]字符串,C)字符串連接。

讓我們看一下第一位:

(![] + [])[+[]] 

![]給我們false因爲[]是一個「truthy」值時,爲一個布爾測試,它可以強制對true,所以![]false

然後,我們添加[]給它,它變成他們倆成字符串,因爲+運營商要挾它的兩個參數爲字符串,如果其中一方不是數字(如果兩個都是數字,它增加了),給我們"false"(因爲[].toString()[].join(),它是"")。我們現在有"false"

然後,+[]0因爲它強制轉換的空數組的數目,這需要通過它是一個字符串(""),並+""0

最後,該值是在"false"使用:"false"[0]"f

等等,它的其餘部分是就這一主題只是變化(!+[]true,其中重要的更新版本。)

+0

'+'運算符有兩個參數.....所以如果一個是0,那麼第二個參數是什麼呢 – Flake

+0

@Flake這不是加法運算符,它是[asm.js類型註釋](http:// asmjs.org/spec/latest/#parameter-type-annotations)。 –

+1

@Flake:在JavaScript中有兩個'+'運算符(以及大多數從語言B語法上得到的其他編程語言):[* unary *'+'](http://www.ecma-international.org/ecma -262/5.1 /#sec-11.4.6)(一元=取一個操作數)和[* binary *'+'](http://www.ecma-international.org/ecma-262/5.1/#sec -11.6.1)(二進制=需要兩個操作數)。 '+ []'中的'+'是一元'+'。在JavaScript中,它的唯一工作就是強制操作數到一個數字。 –

相關問題