自古,三百六十行,每一行入行的時候都有個儀式。現如今程式設計這個行當,也約定俗成出了一個入行儀式,就是選你將要使用的程式語言,寫段程式碼輸出hello world!
,這片文章講的就是這麼個事——寫個函式輸出hello world,請真的不要覺得很簡單。
先立一個flag
軟體開發這個行業裡面,有這麼一句挺牛逼的話:“人生苦短,我用Python”,雖然Python我會用,也確實發自內心地覺得,在言簡意賅這條路上,它配得上這句話。但今天我就想用JavaScript
向python
叫叫板,比比更“短”。問題只有一個:請使用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行也行吧
如果只出題目和貼答案,對於各位看官來說,這也只能算是奇技淫巧。所以本著閱有所得得出發點,我還是簡略剖析下我的思路,希望能給你些啟發:
- 在每行兩個字元的限時下,考慮到字串換行符
\
的存在,所要返回的hello world!
字串還是可以輸出的,只不過多些幾行的事,問題不大。 - 基於第一步中的方法,在不考慮總行數限制的情況下,其實什麼字串都是可以分拆成多行寫的。但每行兩個字元的限制,是把函式建立的生門堵死了。
- 想到JavaScript中一起皆物件,不同型別的物件都有些許內建的屬性和方法,與此同時,最精妙絕倫的是,函式的呼叫除了用
.
符號外,還可以用陣列的方式,即可以在陣列符號[]
中,寫方法名的字串進行方法的呼叫。可使用的方法,僅供參考:''.trim()
,''.slice()
,[].join()
- 如此我們便可用些內建的函式,來代替建立新函式。可想而知,在每行兩個字元的限制下,無論是箭頭函式,還是
function()
什麼的,都顯得太過無力了。 - 你以為到此為止,問題就解決了麼?不,你會立馬遇到另一個問題——每行兩個字元限制下,呼叫函式時怎麼傳參?
- 我只能說,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問題難度雖然加大,但思路基本不變,這裡為了便於理解,僅彙總一下涉及到的知識點:
-
模板字串
,可以自由換行,但換行處會有一個換行符\n
。 -
解構賦值
,字串可以看成是單個字元組成的陣列,由於陣列的定義可以換行,通過將模板字串解構賦值給陣列,便可獲得初始化為單個字元的變數。 - 一些字串和陣列的內建方法:
join()
,splite()
。 - 改變函式執行上下文的方法:
bind()
,同時可複習與apply()
和call()
的區別和聯絡。 - 這或許算是一條奇技淫巧:
[]+[]
表示空字元''
其實我就一個想法,看過之後不要覺得這是篇講述什麼奇技淫巧的文章,倘若能幫你回顧複習了些JavaScript的基礎知識,便就善莫大焉了。