你真的會寫hello world的麼?

weixin_34302561發表於2018-06-29
自古,三百六十行,每一行入行的時候都有個儀式。現如今程式設計這個行當,也約定俗成出了一個入行儀式,就是選你將要使用的程式語言,寫段程式碼輸出hello world!,這片文章講的就是這麼個事——寫個函式輸出hello world,請真的不要覺得很簡單。

先立一個flag

軟體開發這個行業裡面,有這麼一句挺牛逼的話:“人生苦短,我用Python”,雖然Python我會用,也確實發自內心地覺得,在言簡意賅這條路上,它配得上這句話。但今天我就想用JavaScriptpython叫叫板,比比更“”。問題只有一個:請使用JavaScript語言編寫一個函式,返回hello world!

但是我有些個附加條件,嘿嘿嘿

題目 1. 每行程式碼不超過3個字元,總行數不超過9行

我先來做個示範,先拋開這條的附加條件,實現起來那就太簡單了

function f(){
    return "hello world!"
}

OK, 然後在控制檯用console.log(f())列印就可以看到hello world!了。

當加上這個附加條件,傳統的函式定義方式顯然行不通了。

當然現在,ES6已經相當普及,能想到箭頭函式應在情理之中。其次就是一行字串如何寫成多行,這也應該是程式設計基礎,不繞彎子了,直接上程式碼:

f=(
)=>
"h\
el\
lo\
 w\
or\
ld\
!"

涉及的JavaScript知識點:箭頭函式字串換行

題目 2. 每行程式碼不超過2個字元,總行數不超過30行

每行兩個字元,你是不是連函式都不會定義了,反正箭頭函式是行不通了
總行數不超過30行,有點殘忍,算了40行也行吧

如果只出題目和貼答案,對於各位看官來說,這也只能算是奇技淫巧。所以本著閱有所得得出發點,我還是簡略剖析下我的思路,希望能給你些啟發:

  1. 在每行兩個字元的限時下,考慮到字串換行符\的存在,所要返回的hello world!字串還是可以輸出的,只不過多些幾行的事,問題不大。
  2. 基於第一步中的方法,在不考慮總行數限制的情況下,其實什麼字串都是可以分拆成多行寫的。但每行兩個字元的限制,是把函式建立的生門堵死了。
  3. 想到JavaScript中一起皆物件,不同型別的物件都有些許內建的屬性和方法,與此同時,最精妙絕倫的是,函式的呼叫除了用.符號外,還可以用陣列的方式,即可以在陣列符號[]中,寫方法名的字串進行方法的呼叫。可使用的方法,僅供參考:''.trim()''.slice()[].join()
  4. 如此我們便可用些內建的函式,來代替建立新函式。可想而知,在每行兩個字元的限制下,無論是箭頭函式,還是function()什麼的,都顯得太過無力了。
  5. 你以為到此為止,問題就解決了麼?,你會立馬遇到另一個問題——每行兩個字元限制下,呼叫函式時怎麼傳參
  6. 我只能說,ES6中有個好東西——帶標籤的模板字串

不說啥了,看程式碼吧

f=
''
[
'\
t\
r\
i\
m'
][
'\
b\
i\
n\
d'
]`
H\
e\
l\
l\
o\
,\
 \
w\
o\
r\
l\
d!
`

涉及的JavaScript知識點:字串換行trim()join()bind()模板字串

激不激動,刺不刺激。
其實還不夠,我是個有時間,就想把事情做到極致的人
握緊方向盤,繫好安全帶,我們繼續

題目 3. 每行程式碼不超過1個字元,總行數不超過120行

有沒有世界觀快要崩塌了,是不是開始覺得,自己從來沒學過真的JavaScript。
有沒有不僅函式不會建立使用了,沒有字串換行符,是不是連字串都不會寫了。

好了,言歸正傳,

如果你想挑戰一下自己,那麼就請先不要繼續往下閱讀,暫時移步如下你熟悉的線上編輯器,嘗試一番:

或者直接在瀏覽器的Console中嘗試也可以。







[
,
j
,
,
o
,
,
i
,
,
n
,
,
b
,
,
d
,
,
s
,
,
p
,
,
l
,
,
t
]
=
`
j
o
i
n
b
d
s
p
l
t
`
f
=
[
]
[
j
+
o
+
i
+
n
]
[
b
+
i
+
n
+
d
]
(
`
H
e
l
l
o
,
 
w
o
r
l
d
!
`
[
s
+
p
+
l
+
i
+
t
]
`
`
,
[
]
+
[
]
)

在問題2時,已較為詳細的分析了思路,問題3問題難度雖然加大,但思路基本不變,這裡為了便於理解,僅彙總一下涉及到的知識點:

  1. 模板字串,可以自由換行,但換行處會有一個換行符\n
  2. 解構賦值,字串可以看成是單個字元組成的陣列,由於陣列的定義可以換行,通過將模板字串解構賦值給陣列,便可獲得初始化為單個字元的變數。
  3. 一些字串和陣列的內建方法:join()splite()
  4. 改變函式執行上下文的方法:bind(),同時可複習與apply()call()的區別和聯絡。
  5. 這或許算是一條奇技淫巧:[]+[]表示空字元''
其實我就一個想法,看過之後不要覺得這是篇講述什麼奇技淫巧的文章,倘若能幫你回顧複習了些JavaScript的基礎知識,便就善莫大焉了。