摘要:感覺(jué)挺有意思的,于是打算自己用寫(xiě)一個(gè)試試。為有趣起見(jiàn),準(zhǔn)備從一個(gè)打印本站域名的額外功能開(kāi)始這個(gè)命令可以在控制欄打印出一行。接下來(lái)我準(zhǔn)備一步一步改造這個(gè)命令,直至達(dá)成的目標(biāo)。注意到源碼里外用了不同的引號(hào),這是為了規(guī)避轉(zhuǎn)義符。
原文自轉(zhuǎn)->這里
早上看了justjavac大大的一篇文章:javascript 的 quine 程序升級(jí)版,了解了一下所謂quine程序的概念:
一個(gè) quine 是一個(gè)計(jì)算機(jī)程序,它不接受任何輸入,且唯一的輸出就是自身的源代碼。
感覺(jué)挺有意思的,于是打算自己用js寫(xiě)一個(gè)試試。
首先確定輸出方式為控制臺(tái),即通過(guò)console.log輸出。
為有(guang)趣(gao)起見(jiàn),準(zhǔn)備從一個(gè)“打印本站域名”的“額外功能”開(kāi)始:
console.log("perichr.org")
這個(gè)命令可以在控制欄打印出一行perichr.org。接下來(lái)我準(zhǔn)備一步一步改造這個(gè)命令,直至達(dá)成quine的目標(biāo)。
首先試著打印上面這個(gè)命令:
console.log("console.log("perichr.org")")
這樣就在控制欄打印了一行console.log("perichr.org")。注意到源碼里外用了不同的引號(hào),這是為了規(guī)避轉(zhuǎn)義符。
對(duì)了,別忘了需要執(zhí)行自己,那么有:
console.log("perichr.org");console.log("console.log("perichr.org")")
很好,這樣即執(zhí)行了“額外功能”,又打印了自己的源代……不對(duì)!壓根沒(méi)有打印自己的源代碼對(duì)吧!
從簡(jiǎn)單的入手,不考慮打印完整源代碼,先想想要怎樣能在執(zhí)行一個(gè)功能的同時(shí)打印功能代碼呢?打印的是字符串,執(zhí)行的是js源碼……想到什么了?對(duì)了,eval!
p="console.log("perichr.org")";eval(p);console.log(p)
很好,這次完美地打印了perichr.org和console.log("perichr.org")。要注意的是,這里的變量p沒(méi)有做聲明,嚴(yán)格模式下是通不過(guò)的喲!
不過(guò)這還遠(yuǎn)遠(yuǎn)不夠!來(lái)做一點(diǎn)小調(diào)整:
p="console.log("perichr.org");console.log(p)";eval(p)
發(fā)現(xiàn)了嗎?這次輸出了perichr.org和console.log("perichr.org");console.log(p)!進(jìn)化了!接下來(lái)先討個(gè)巧,利用 賦值表達(dá)式返回右值 的小技巧來(lái)簡(jiǎn)化一下代碼,畢竟代碼越精簡(jiǎn)心理壓力越小嘛……
eval(p="console.log("perichr.org");console.log(p)")
接下來(lái)怎么辦呢……來(lái)對(duì)比下上面的源碼和輸出的代碼:console.log("perichr.org");console.log(p),其實(shí)已經(jīng)很接近了有木有!輸出碼就是缺少了頭eval(p="和尾")!來(lái),補(bǔ)上!
eval(p="console.log("perichr.org");console.log("eval(p=""+p+"")")")
在補(bǔ)的時(shí)候就應(yīng)該已經(jīng)注意到了一個(gè)問(wèn)題:轉(zhuǎn)義符!這里已經(jīng)無(wú)法避免轉(zhuǎn)義符了!來(lái)看看輸出的代碼:eval(p="console.log("perichr.org");console.log("eval(p=""+p+"")")")
真好,已經(jīng)十分接近了對(duì)吧!但還是有一點(diǎn)小問(wèn)題:沒(méi)錯(cuò),轉(zhuǎn)義符!輸出時(shí)源碼中的"被轉(zhuǎn)義成了"!怎么辦?那就要把文本中的"反轉(zhuǎn)義為"!怎么轉(zhuǎn)?可以使用""".replace(/"/g,""")這種方式。考慮到文本要在p的賦值時(shí)轉(zhuǎn)義,那么就需要手動(dòng)反轉(zhuǎn)義為:".replace(/"/g,""")"。接下來(lái)把它插入源碼中:
eval(p="console.log("perichr.org");console.log("eval(p=""+p.replace(/"/g,""")+"")")")
等等……好像有什么不對(duì)?我剛才是不是把一大波 有用的反斜杠 加入源代碼了?要知道,這貨也是會(huì)被轉(zhuǎn)義的啊!!怎么辦?好嘛,來(lái)改造下反轉(zhuǎn)義代碼,這回單引號(hào)和反斜杠都要反轉(zhuǎn)義一下:.replace(/["]/g,"$&"),這里的$&是指返回匹配字符串。手動(dòng)反轉(zhuǎn)義:.replace(/["]/g,"$&"),再來(lái)一次:
eval(p="console.log("perichr.org");console.log("eval(p=""+p.replace(/["]/g,"$&")+"")")")
在控制臺(tái)試一試……成功!完美!強(qiáng)力!分毫不差地返回了自身!任務(wù)圓滿完成!
怎么樣,看起來(lái)很高大上的東西,其實(shí)入門很簡(jiǎn)單吧?
有人問(wèn),費(fèi)勁心機(jī)寫(xiě)這么個(gè)東西,有啥意義?嘛,這個(gè)世界不是為了“某些人所謂的意義”而存在的。世界存在的意義在于“世界存在”這個(gè)現(xiàn)象本身;我折騰這個(gè)東西的意義也就在于“折騰代碼”這件事本身。我覺(jué)得我獲得了一些有意義的東西。你說(shuō)呢?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/78119.html
摘要:并不是所有人寫(xiě)的代碼或者插件都適合小白使用,比如這是一個(gè)的滾動(dòng)插件,大多數(shù)人使用了之后發(fā)現(xiàn)滾動(dòng)不了,去作者提,其實(shí)是他們并不懂滾動(dòng)的原理。 最近在這里看了一篇關(guān)于面試的文章《回顧自己三次失敗的面試經(jīng)歷》,作者三次倒在了輪播圖上。囧,所以我也寫(xiě)個(gè)輪播圖看看。這次是用jQuery寫(xiě)的,因?yàn)樽罱恢痹谘芯縥Query插件的寫(xiě)法,所以用jQuery寫(xiě)的,而且我發(fā)現(xiàn),我vue用太多,完全不熟悉d...
摘要:但是,既然我博客的關(guān)于頁(yè)面都已經(jīng)折騰出升級(jí)版了,那么我們就再折騰一個(gè)出來(lái)。程序的升級(jí)版動(dòng)態(tài)的。最后在附贈(zèng)一個(gè),這個(gè)其實(shí)不能算是嚴(yán)格的程序可以滾動(dòng)的地球儀 本文來(lái)自我的博客:http://justjavac.com/javascript/2013/10/11/javascript-quine-plus.html Quine 以哲學(xué)家 Willard van Orman Quine (1...
摘要:目前已經(jīng)在運(yùn)行的線上前端監(jiān)控系統(tǒng)代碼和講解都放在這篇文章里監(jiān)控系統(tǒng)介紹及代碼用戶對(duì)前端程序員來(lái)說(shuō),就是一個(gè)黑匣子。 摘要: 通過(guò)錄屏或者截圖,快速?gòu)?fù)現(xiàn)BUG場(chǎng)景。 作者:一步一個(gè)腳印一個(gè)坑 原文:搭建前端監(jiān)控系統(tǒng)(備選)Js截圖上報(bào)篇 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 PS:本文關(guān)于Fundebug錄屏功能的內(nèi)容有些不準(zhǔn)確的地方,比如錄屏并非通過(guò)截圖實(shí)現(xiàn)的,錄屏插件...
摘要:摘要通過(guò)記錄用戶行為,快速?gòu)?fù)現(xiàn)場(chǎng)景。這是搭建前端監(jiān)控系統(tǒng)的第二章,主要是介紹如何統(tǒng)計(jì)報(bào)錯(cuò),跟著我一步步做,你也能搭建出一個(gè)屬于自己的前端監(jiān)控系統(tǒng)。 摘要: 通過(guò)記錄用戶行為,快速?gòu)?fù)現(xiàn)BUG場(chǎng)景。 作者:一步一個(gè)腳印一個(gè)坑 原文:搭建前端監(jiān)控系統(tǒng)(備選)用戶行為統(tǒng)計(jì)和監(jiān)控篇(如何快速定位線上問(wèn)題) Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 一步一步搭建前端監(jiān)控系統(tǒng)系列博客: ...
閱讀 3387·2021-11-22 15:22
閱讀 2371·2021-09-06 15:00
閱讀 871·2020-06-22 14:39
閱讀 3704·2019-08-30 15:56
閱讀 1540·2019-08-30 12:55
閱讀 3260·2019-08-29 17:19
閱讀 3231·2019-08-26 11:41
閱讀 613·2019-08-23 17:14