我偷了一個會說話的行李箱⌚️2016.03.15javascript
&
html
你今天照常在火車站偷東西,此次的收穫是一個行李箱。正打算依具《偷術大全》裏面的建議,強行把她拆開。但卻在拍乾淨手掌,蹲下身子,準備把她舉到頭上的時候,你忽然聽到有人在說話。java
「喂」git
環顧四周卻又沒有看到什麼人。segmentfault
「把我放下來!」數組
聲音又響起來,你感受聲音是從上方傳來的,不由擡頭看了看手上的行李箱。閉包
你趕忙把箱子放了下了,這個過程當中,箱子裏還有隱約有「哎颯喲颯」的嘟囔。「裏面難道有人?」你內心忽然冒出這樣一個奇怪而可怕的猜想,那麼爲何有我的呢?函數
...具體情節請看《箱之少女》...spa
最後,你瞭解到,這個箱子的密碼會在每十次嘗試以後再自動隨機生成一個新密碼。code
一開始他回返回個‘空(null)’給你,你得處理這個‘空(null)’,再返回給他一個由0~9三個正整數組成的數組。
這個數組將會和密碼匹配後再返回一個數組(咱們喚其爲 差距數組)。差距數組表示輸入數與密碼數之間的差距:
輸入數 < 密碼數 --> +1
輸入數 > 密碼數 --> -1
輸入數 = 密碼數 --> 0
10次嘗試不成功以後,舊密碼失效,新密碼將從新生成。
快快想出辦法來,拯救箱中的少女,而後作些♨️羞羞的事情吧!
var guess = [5, 5, 5];① function tryCode(indications) { if (indications != null) { for (var i = 0; i <= 2; i++) { guess[i] += indications[i]; } } return guess;② }
?竹節:
這個應當能夠放入 tryCode 方法中去,單獨放置在外面,略微不合適。
實現單一出口。
✨兩處均可以簡化,由於 差距數組 的值,就是 猜想數組 要進行的調整。
var guess = [5, 5, 5]; function tryCode(indications) { if (indications != null) { for (var i = 0; i <= 2; i++) { if (indications[i] == 1)✨ ++guess[i]; if (indications[i] == -1)✨ --guess[i]; } } return guess; }
失誤,‘=’ 和 ‘==’ 。
var guess = [5, 5, 5]; function tryCode(indications) { if (indications != null) { for (var i = 0; i <= 2; i++) { if (indications[i] = 1)✨ ++guess[i]; if (indications[i] = -1)✨ --guess[i]; } } return guess; }
一開始只把 差距數組 當作表達 大小關係。因而想着用 二分法 來進行調整,最後發現比較複雜,須要考慮的太多。
zarjay
var tryCode = (function() { var guess = [5, 5, 5]; ②return function(indication) { guess = indication ?③ guess.map④(function(d, i) { return d + indication[i]; }):guess; return guess; } })();①
?竹節:
(function(){})();
?
建立並當即執行函數 js中(function(){…})()
使用(function(){}())
也可實現相同的效果 知乎-(function(){}())和(fucntion(){})()
function(){return funciton(){}}
?
?
& :
?
是 JavaScript 僅有的使用三個操做數的運算符。本運算符常常做爲 if 語句的簡短形式來使用。
若是條件值爲真值(true),運算符就會返回 expr1 的值;不然, 就會返回 expr2 的值。
map()
?
adolfo7x, chunghanliou
var digits = [5, 5, 5]; function tryCode(indications) { if (!①indications){ digits = [5, 5, 5]; return digits; } return digits = digits.map(function(value, index){ return value + indications[index]; }); }
竹節:
!
?
!
:邏輯非
!(expr)
若是單個表達式能轉換爲 true
的話返回 false
,不然返回 true
.
可以轉換爲false
的表達式有: null
, 0
, ""
和 undefined
.
∴ 原表達式 = if(indications == false)
map()
?
JQ的一個遍歷方法。
若是調用該方法的數據是數組A則 從數組A吃一個數,進行加工並把加工的結果吐出到一個新數組B中去,待吐完最後一個數後把數組B返回去。
MaximeDesRoches
function tryCode(indications) { if(indications == null) { tryCode.test = [5,5,5];① return tryCode.test; } return tryCode.test = tryCode.test.map(function(c, i){ if (indications[i] === 0) return c; return (indications[i] === 1) ? ++c : --c; }); }
竹節:
爲何tryCode.test在運行結束以後沒有被回收呢?
感受和閉包有關係。