JavaScript (ECMAScript6), satır başına 2 bayt
'\
'[
'\
b\
i\
g'
][
'\
c\
o\
n\
s\
t\
r\
u\
c\
t\
o\
r'
][
'\
c\
a\
l\
l'
](
0,
`\
n\
=\
p\
r\
o\
m\
p\
t\
(\
'\
'\
)\
;\
i\
=\
0\
;\
f\
o\
r\
(\
;\
+\
+\
i\
<\
=\
n\
;\
c\
o\
n\
s\
o\
l\
e\
.\
l\
o\
g\
(\
i\
%\
5\
?\
f\
|\
|\
i\
:\
f\
+\
'\
P\
i\
e\
'\
)\
)\
f\
=\
i\
%\
3\
?\
'\
'\
:\
'\
A\
p\
p\
l\
e\
'\
`)
()
Uzun açıklama
Satırları kısaltmamızın yolu, kodu bir dizgeye dönüştürmek ve satır sonlarından kaçmaktır; bu, satır başına 2 baytlık bir sınır getirecektir.
Öyle alert(1)
olur
"\
a\
l\
e\
r\
(\
1\
)"
Ancak şimdi kodunuz bir dizedir, bu nedenle dizeyi kod olarak yürütmemiz gerekir. Dize kod olarak yürütmenin en az 4 yolunu biliyorum:
- eval (kod) . Aramak için en az 5 bayt sürer
eval(
- setTimeout (kod, zaman aşımı) . Fonksiyonu asenkronize olarak çalıştırır, ancak isteğe bağlı olarak bir dizgiyi geçirirseniz, içten eval'ü çağırır.
- DOM'den faydalanabilir ve kodunuzu bir
onclick=""
özniteliğin içine koyabilirsiniz , ancak öğe oluşturmayı kısmen kısaltmayı başaramadım.
- Çağırmak Function yapıcısını new Function () , kodunuzu daha sonra çağırabileceğiniz adsız bir işleve ayrıştırır (bunu kullandım).
Tüm yerel işlevler, pencere nesnesinin içinde yaşar ve javascript'te, nokta gösterimini kullanarak nesne özelliklerine erişebilir, böylece eval()
olur window.eval()
ya da ayraç gösterimini kullanarak özelliklere erişebilirsiniz window['eval']()
. Daha eval
önce açıklanan yöntemi kullanarak çoklu çizgileri kırmak için bundan yararlanabilirsiniz . Ama yine de pencereyi yazmak zorundasınız , bir püf noktası, bir çerçevenin içinde değilseniz üst değişkenin de pencere olduğu, yani window.eval'in top.eval olacağı (3 byte az).
w=top
w['eval']
You can shorten the assignment using parenthesis
w=(
top
)
w[
'e\
av\
al'
](
/*string*/
)
Bu, kodu en az 3 bayt yapacaktır. Kod 2 bayt yapmak için yapıcıyı kullandım new Function(/*string*/);
, ancak yazmak zorunda kalmadan erişebilmek için yaratıcı olmam gerekiyordu.
İlk olarak, İşlev yapıcısı, yeni anahtar kelimeyi çıkartan bir işlev olarak çağırmanıza izin verir, bu, 4 baytı azaltır ancak başka bir nedenle de önemlidir. Yapıcıyı işlev olarak çağırmak yine de dönmemize izin veren bir örnek döndürür new Function(code)
.Function(code)
. Bir diğer önemli husus, İşlev yapıcısının call
herhangi bir işlevi çağırmanıza izin veren ancak bu referansı geçersiz kılan bir yönteme sahip olması ve İşlev yapıcısının kendisinde onun gibi bir yöntem olarak çağırabileceğiniz bir işlev olmasıdır Function.call(null, code)
.
Tüm yerel işlevler, İşlev yapıcısının örnekleridir ve javascript'teki tüm nesnelerin yapıcı özelliği vardır. Böylece, herhangi bir yerel işlevdeki İşlev yapıcısına erişebilir alert.constructor
ve call yöntemini kullanarak yapıcıyı işlev olarak çalıştırabiliriz. Şimdi biz alert.constructor.call (null, code) bir fonksiyon döndürür.
önceki teknolojilerin birleştirilmesiyle onu dönüştürebiliriz alert['constructor']['call'](null, code)
Şimdi kısa bir adlandırılmış işlev veya yöntem bulmamız gerekiyor, bu yüzden String yapıcısının içindeki big () yöntemini seçiyorum . Böylece doğrudan boş bir dizeden erişebiliyorum"".big
"".big.constructor.call(null, "code")();
''['big']['constructor']['call'](0,'/* code */')()
Sonra her şeyi 2 baytta kırdım.
Kısa er açıklama (TLDR)
Yeni Function (code) yapıcısına eval (code) yerine dizeyi ayrıştırmak için erişiyorum . Bu yapıcı, anyFunction işlevini kullanarak her yerel işlevde kullanılabilir. yapıcı , gibi alert.constructor===Function
. String.prototype.big içinde bir işlev / yöntem kullanıyorum, String.prototype.big.constructor.call(null, /*string*/)
ancak doğrudan bir dizgiden birebir erişerek onu parantez notasyonuna"".big
çevirdim . kullanarak kırabilmeniz için .""['big']['constructor']['call'](0, CODE)
\