国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一步一步寫一個簡單的js版quine程序

AJie / 668人閱讀

摘要:感覺挺有意思的,于是打算自己用寫一個試試。為有趣起見,準備從一個打印本站域名的額外功能開始這個命令可以在控制欄打印出一行。接下來我準備一步一步改造這個命令,直至達成的目標。注意到源碼里外用了不同的引號,這是為了規(guī)避轉(zhuǎn)義符。

原文自轉(zhuǎn)->這里

早上看了justjavac大大的一篇文章:javascript 的 quine 程序升級版,了解了一下所謂quine程序的概念:

  

一個 quine 是一個計算機程序,它不接受任何輸入,且唯一的輸出就是自身的源代碼。

感覺挺有意思的,于是打算自己用js寫一個試試。

首先確定輸出方式為控制臺,即通過console.log輸出。

為有(guang)趣(gao)起見,準備從一個“打印本站域名”的“額外功能”開始:

console.log("perichr.org")

這個命令可以在控制欄打印出一行perichr.org。接下來我準備一步一步改造這個命令,直至達成quine的目標。

首先試著打印上面這個命令:

console.log("console.log("perichr.org")")

這樣就在控制欄打印了一行console.log("perichr.org")。注意到源碼里外用了不同的引號,這是為了規(guī)避轉(zhuǎn)義符。

對了,別忘了需要執(zhí)行自己,那么有:

console.log("perichr.org");console.log("console.log("perichr.org")")

很好,這樣即執(zhí)行了“額外功能”,又打印了自己的源代……不對!壓根沒有打印自己的源代碼對吧!
從簡單的入手,不考慮打印完整源代碼,先想想要怎樣能在執(zhí)行一個功能的同時打印功能代碼呢?打印的是字符串,執(zhí)行的是js源碼……想到什么了?對了,eval

p="console.log("perichr.org")";eval(p);console.log(p)

很好,這次完美地打印了perichr.orgconsole.log("perichr.org")。要注意的是,這里的變量p沒有做聲明,嚴格模式下是通不過的喲!

不過這還遠遠不夠!來做一點小調(diào)整:

p="console.log("perichr.org");console.log(p)";eval(p)

發(fā)現(xiàn)了嗎?這次輸出了perichr.orgconsole.log("perichr.org");console.log(p)!進化了!接下來先討個巧,利用 賦值表達式返回右值 的小技巧來簡化一下代碼,畢竟代碼越精簡心理壓力越小嘛……

eval(p="console.log("perichr.org");console.log(p)")

接下來怎么辦呢……來對比下上面的源碼和輸出的代碼:console.log("perichr.org");console.log(p),其實已經(jīng)很接近了有木有!輸出碼就是缺少了頭eval(p="和尾")!來,補上!

eval(p="console.log("perichr.org");console.log("eval(p=""+p+"")")")

在補的時候就應(yīng)該已經(jīng)注意到了一個問題:轉(zhuǎn)義符!這里已經(jīng)無法避免轉(zhuǎn)義符了!來看看輸出的代碼:eval(p="console.log("perichr.org");console.log("eval(p=""+p+"")")")

真好,已經(jīng)十分接近了對吧!但還是有一點小問題:沒錯,轉(zhuǎn)義符!輸出時源碼中的"被轉(zhuǎn)義成了"!怎么辦?那就要把文本中的"反轉(zhuǎn)義為"!怎么轉(zhuǎn)?可以使用""".replace(/"/g,""")這種方式。考慮到文本要在p的賦值時轉(zhuǎn)義,那么就需要手動反轉(zhuǎn)義為:".replace(/"/g,""")"。接下來把它插入源碼中:

eval(p="console.log("perichr.org");console.log("eval(p=""+p.replace(/"/g,""")+"")")")

等等……好像有什么不對?我剛才是不是把一大波 有用的反斜杠 加入源代碼了?要知道,這貨也是會被轉(zhuǎn)義的啊!!怎么辦?好嘛,來改造下反轉(zhuǎn)義代碼,這回單引號和反斜杠都要反轉(zhuǎn)義一下:.replace(/["]/g,"$&"),這里的$&是指返回匹配字符串。手動反轉(zhuǎn)義:.replace(/["]/g,"$&"),再來一次:

eval(p="console.log("perichr.org");console.log("eval(p=""+p.replace(/["]/g,"$&")+"")")")

在控制臺試一試……成功!完美!強力!分毫不差地返回了自身!任務(wù)圓滿完成!

怎么樣,看起來很高大上的東西,其實入門很簡單吧?

有人問,費勁心機寫這么個東西,有啥意義?嘛,這個世界不是為了“某些人所謂的意義”而存在的。世界存在的意義在于“世界存在”這個現(xiàn)象本身;我折騰這個東西的意義也就在于“折騰代碼”這件事本身。我覺得我獲得了一些有意義的東西。你說呢?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78119.html

相關(guān)文章

  • 小白成長日記:步一步寫個輪播圖插件

    摘要:并不是所有人寫的代碼或者插件都適合小白使用,比如這是一個的滾動插件,大多數(shù)人使用了之后發(fā)現(xiàn)滾動不了,去作者提,其實是他們并不懂滾動的原理。 最近在這里看了一篇關(guān)于面試的文章《回顧自己三次失敗的面試經(jīng)歷》,作者三次倒在了輪播圖上。囧,所以我也寫個輪播圖看看。這次是用jQuery寫的,因為最近一直在研究jQuery插件的寫法,所以用jQuery寫的,而且我發(fā)現(xiàn),我vue用太多,完全不熟悉d...

    notebin 評論0 收藏0
  • javascript quine 程序(升級

    摘要:但是,既然我博客的關(guān)于頁面都已經(jīng)折騰出升級版了,那么我們就再折騰一個出來。程序的升級版動態(tài)的。最后在附贈一個,這個其實不能算是嚴格的程序可以滾動的地球儀 本文來自我的博客:http://justjavac.com/javascript/2013/10/11/javascript-quine-plus.html Quine 以哲學(xué)家 Willard van Orman Quine (1...

    nidaye 評論0 收藏0
  • 步一步搭建前端監(jiān)控系統(tǒng):如何將網(wǎng)頁截圖上報?

    摘要:目前已經(jīng)在運行的線上前端監(jiān)控系統(tǒng)代碼和講解都放在這篇文章里監(jiān)控系統(tǒng)介紹及代碼用戶對前端程序員來說,就是一個黑匣子。 摘要: 通過錄屏或者截圖,快速復(fù)現(xiàn)BUG場景。 作者:一步一個腳印一個坑 原文:搭建前端監(jiān)控系統(tǒng)(備選)Js截圖上報篇 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 PS:本文關(guān)于Fundebug錄屏功能的內(nèi)容有些不準確的地方,比如錄屏并非通過截圖實現(xiàn)的,錄屏插件...

    Martin91 評論0 收藏0
  • 步一步搭建前端監(jiān)控系統(tǒng):如何記錄用戶行為?

    摘要:摘要通過記錄用戶行為,快速復(fù)現(xiàn)場景。這是搭建前端監(jiān)控系統(tǒng)的第二章,主要是介紹如何統(tǒng)計報錯,跟著我一步步做,你也能搭建出一個屬于自己的前端監(jiān)控系統(tǒng)。 摘要: 通過記錄用戶行為,快速復(fù)現(xiàn)BUG場景。 作者:一步一個腳印一個坑 原文:搭建前端監(jiān)控系統(tǒng)(備選)用戶行為統(tǒng)計和監(jiān)控篇(如何快速定位線上問題) Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 一步一步搭建前端監(jiān)控系統(tǒng)系列博客: ...

    tolerious 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<