JSF ** k มีเพียง 5 สัญลักษณ์?


47

นี่ไม่ใช่ความท้าทาย แต่เป็นคำถามที่ฉันคิดว่ามันเป็นหัวข้อเนื่องจาก

คำถามที่ไม่ท้าทายที่เกี่ยวข้องกับการแก้ปริศนาการเขียนโปรแกรมหรือความท้าทายบางประเภทนั้นอยู่ในหัวข้อด้วย

ตอนนี้คำถาม:

เป็นไปได้ไหมที่จะเขียนโค้ด JavaScript ด้วยตัวอักษรเพียง 5 ตัว? JSFuckทำสิ่งนี้ด้วยสัญลักษณ์ 6 อันแล้ว!+[]()แต่ฉันสงสัยว่าต้องใช้!ตัวละครนี้หรือไม่

JSFuck ทำงานร่วมกับการคัดเลือกนักแสดงเป็นสตริง (โดยการเพิ่มอาร์เรย์ที่ว่างเปล่า) การคัดเลือกนักแสดงไปยังหมายเลข (โดยการเขียนเครื่องหมาย + ด้านหน้า) และการคัดเลือกนักแสดงเพื่อบูลีนโดยปฏิเสธ ตัวอย่างเช่น:

[]        \\ Empty array
+[]       \\ Cast to number -> 0
!+[]      \\ Negate -> true
!+[]+[]   \\ Cast to string -> "true"

จากสตริงนี้เราสามารถแยกตัวอักษรทั้งหมดโดยใช้เครื่องหมายวงเล็บเหลี่ยมที่มีตัวเลขอยู่ข้างในและตัวเลขใด ๆ ที่สามารถทำได้โดยการเพิ่มจริงเข้าด้วยกันหลายครั้ง

เช่นนี้สามารถพบตัวอักษรจำนวนมากและสามารถต่อกับสตริงได้ สตริงที่สำคัญที่สุดที่สามารถสร้างได้คือ"constructor"สามารถใช้เพื่อรับค่าFunctionจากฟังก์ชั่นใด ๆ และวัตถุนี้สามารถใช้ในการเรียกใช้สตริงเป็น JavaScript:

[]["find"]                          \\ the function Array.prototype.find
[]["find"]["constructor"]           \\ the Function object
[]["find"]["constructor"](string)() \\ same as eval(string)

อย่างที่คุณเห็น!มี 2 ​​ประโยชน์ที่นี่:

  • การสร้างตัวเลขเพื่อเลือกตัวอักษรจากสตริง
  • ส่งไปยังบูลที่จะได้รับและ"true""false"

คนแรกของ 2 คนนี้สามารถทำได้โดยใช้ตัว++เพิ่มไม่ใช่โดยตรง0แต่มันสามารถใช้กับองค์ประกอบภายในอาเรย์:

+[]          \\ 0
[+[]]        \\ [0]
[+[]][+[]]   \\ [0][0] -> 0
++[+[]][+[]] \\ ++[0][0]-> 1
++[[]][+[]]  \\ also works because ++ casts to number

!ดังนั้นตัวเลขทั้งหมดที่สามารถสร้างขึ้นได้โดยไม่ต้อง

อันที่สองนั้นยากกว่า ความสำคัญของการ"true"และ"false"วางในตัวอักษร"r"และซึ่งทั้งสองปรากฏใน"s" "constructor"ผมได้พบแล้วทุกตัวอักษรอื่น ๆ"constructor"โดยใช้วิธีการ"undefined", "Infinity", "NaN"และฟังก์ชั่นโดยการหล่อสตริง

ดังนั้นคำถามสุดท้าย: (อย่างไร) คุณสามารถสร้างบูลีนหรือตัวอักษร"r"และ"s"ใน JavaScript โดยใช้เพียง+[]()?

จดหมาย"l"อาจช่วยได้ สามารถรับแบบฟอร์มได้nullแต่ฉันไม่สามารถรับค่านั้นได้ด้วยสัญลักษณ์ทั้งห้า ตัวอย่างเช่นสามารถใช้เพื่อรับ booleans ถ้าเรามี"s":

[]["includes"]()       \\ false
[+[]]["includes"](+[]) \\ true

จดหมาย"l"และ"k"ร่วมกันจะให้การเข้าถึง"r":

([]+[])["link"]() \\ "<a href="undefined"></a>"

วิธีใดก็ตามที่จะได้รับบูลีนnullหรือตัวอักษรใด ๆr s l kจะมีประโยชน์มาก!

ห้องสมุดของสิ่งที่เรามี:

Array.prototype.find: [] [(([] [[]] + []) [(++ [[]] [+ []]) + + (++ [[]] [+ []] + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+] []) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])]

อินฟินิตี้: + ((++ [[]] [+ []] + []) + (([] [[]] + []) [[++] [+] [+] [+] [+] + [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ []))

NaN: + [] [[]]

ไม่ได้กำหนด: [][[]]

0: + []

1: ++ [[]] [+ []]

2: (++ [[]] [+ []]) + (++ [[]] [+ []]

3: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]

4: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ []] ] [+ []])

5: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ []] ] [+ []]) + (++ [[]] [+ []])

6: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ []] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

7: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ []] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

8: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ []] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

9: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ []] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

a: (+ [] [[]] + []) [++ [[]] [+ []]

c: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]

d: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]]]]]

e: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])]

f: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []])]

i: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]

n: ([] [[]] + []) [++ [[]] [+ []]

o: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+] []) + (++ [[]] [+ []])]

t: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [] + + () [+] [+] [+] ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ])]

u: ([] [[]] + []) [+ []]

v: ([] [(([] [[]] + []) [(++ [[]] [+ []])) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]))]

y: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [] + + (] [+] [+] [+] ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ]) + (++ [[]] [+ []])]

ฉัน: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) []) [(++ [[]] [+]] [+] [+] ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [+ []]

N: (+ [] [[]] + []) [+ []]

"": ([] [(([] [[]] + []] +])) [(++ [[]] [+ []]) + (++ [[]] [+] [+] [+] [+] + [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [ ]) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ [] ] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])))]

(: ([] [(([] [[]] + []) [(++ [[]] [+ []])) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))]

): ([] [(([] [[]] + []) [(++ [[]] [+ []]) + + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))]

{: ([] [(([] [[]] + []) [(++ [[]] [+ []])) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))]

}: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ ((++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + ( ++ [[]] [+ []])))]

.: (+ (++ [[]] [+ []] + [] + (++ [[]] [+ []]) + ([] [[]] + []] [[] [+] []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (++ [[]] [+ [] ] + [] + (+ []) + (+ []))) + []) [++ [[]] [+ []]]

:[[]] [([] [(([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [(++ [[]] [+] []) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + ([] [(([] [] [] + []) [ (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[] ] + []) [++ [[]] [+ []]]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []] )] + ([] [] [] + []) [++ [[]] [+ []]] + ([] [(([] [] [] + []) [(++ [[ ]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) ]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [] [] + []) [++ [[]] [+ []]]) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [ + []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (+ [] [[]] + []) [++ [[]] [+ []]] + (+ ((++ [[]] [+ []] + []) + (([] [] [] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + ( ++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ [])) + []) [(++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[ ]] [+ []]) + (++ [[]] [+ []])]] ([[]]) + []

นี่เกี่ยวข้องอย่างใกล้ชิดกับcodegolf.stackexchange.com/q/11690/194และหากคำถามนั้นมีคำตอบ JS ฉันจะลงคะแนนให้ปิด ตามที่เป็นอยู่คำตอบสำหรับคำถามนี้น่าจะแปลโดยตรงเป็นคำตอบของคำถามก่อนหน้านี้ แต่ความแตกต่างทำให้เพียงพอที่ฉันไม่ต้องการปิดฝ่ายเดียว
Peter Taylor

29
เป็นคำถามที่ดีมาก ฉันชอบคำถามเกี่ยวกับการเขียนโปรแกรมลึกลับและรูปแบบการคำนวณที่แปลกใหม่แต่ต้องเตรียมพร้อมสำหรับบางคนที่ปิดการลงคะแนนเนื่องจากปัจจุบันนี้ไม่เหมาะกับขอบเขตที่คนเห็นด้วยในเมตาดาต้า ฉันชอบที่จะตั้งค่าแบบอย่างสำหรับคำถามดังกล่าว :)
Martin Ender

1
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Alex A.

4
คำถามเช่นนี้ทำให้ฉันหวังว่าจะมีฟีเจอร์ในการให้รางวัลกับคำถาม
xnor

1
ฉันได้รับอนุญาตevalเมื่อปี 2453 window
CalculatorFeline

คำตอบ:


23

หลังจากระดมความคิดผลที่ได้ดูเหมือนว่าอย่างน้อยในเบราว์เซอร์ที่ทันสมัยอย่างน้อยก็ไม่มีวิธีการทำเช่นนี้

ฉันจะพยายามสรุปกระบวนการทั้งหมดโดยเพิ่มเหตุผลบางอย่างเกี่ยวกับสาเหตุที่เราหมดตัวเลือกของเราในโดเมนที่กำหนดก่อนที่จะดำเนินการต่อ จากนั้นยกเว้นความเข้าใจใหม่ที่น่าอัศจรรย์ (เช่นกรณีมุมของไวยากรณ์ JavaScript ที่ทุกคนลืม) มันจะค่อนข้างชัดเจนว่าไม่มีทางที่จะได้รับจดหมายที่เหลืออยู่

ตัวอักษร

เพียงทันทีอักษรที่คุณสามารถทำกับ+()[]เป็นอาร์เรย์ที่ว่างเปล่าที่ซ้อนกัน[], [[]], [[[]]]ฯลฯ จากนั้นเราสามารถเริ่มต้นหล่อค่าใช้+:

  • +[]ได้รับเป็นศูนย์ซึ่งเคล็ดลับของ Jens ++ขยายจำนวนเต็มบวกโดยพลการใช้

  • []+[]""เป็น ในความเป็นจริง[]+xทำให้เราเป็นตัวแทนสตริงxโดยทั่วไป

[]การใช้ครั้งต่อไปคือการจัดทำดัชนี การทำดัชนีวัตถุออกจากขอบเขต ( [][[]]) undefinedทำให้คุณได้รับ หล่อที่สตริงและจัดทำดัชนีผลที่ทำให้คุณได้รับตัวอักษรd e f i n u; การคัดเลือกให้เป็นจำนวนเต็มก่อนใช้เพื่อให้+ได้NaNตัวอักษรที่a Nตามมา

การใช้++เคล็ดลับกับค่าที่ไม่เป็นจำนวนเต็มจนถึงการให้NaNหรือการผิดพลาด นอกจากนี้ไม่มีวัตถุใดที่เราสามารถสร้างได้เรียกได้ (ยัง) ดังนั้นจึง()ไม่ช่วย (ยกเว้นการจัดกลุ่ม)

กลอุบายที่เหลืออยู่บนแขนเสื้อของเรากำลังหล่อและจัดทำดัชนี ดังนั้นคำถามคือเราสามารถสร้างสตริงที่ใช้ตัวละคร0123456789adefinuNที่อย่างใดอย่างหนึ่ง

  • เป็นตัวเลขตัวอักษรที่เราสามารถปัดเศษไปเป็นจำนวนเต็มเพื่อรับสายใหม่หรือ
  • ชื่อคุณสมบัติของวัตถุที่เราสามารถเข้าถึงได้อยู่แล้ว?

จำนวนตัวอักษร

เป็นตัวอย่างของตัวเลือกที่สองที่เราสามารถทำให้สตริง"1e1000"แล้วได้รับInfinityจาก+"1e1000"และหล่อที่กลับไปยังสตริงเราได้รับจดหมายและyI

นอกจากนี้เรายังสามารถทำให้"11e100"โยนไปที่หมายเลขและกลับไปสตริงที่จะได้รับ"1.1e+101"จากการที่เราดึงและ.+

ใช้ว่า.ในทางกลับกันเราสามารถทำให้สตริง".0000001"โยนไปยังหมายเลขและด้านหลังเพื่อให้ได้ชนะเรา"1e-7"-

ที่เป็นพื้นลอยทั้งหมดคุณจะได้รับ: มีไม่ใดค่าที่น่าสนใจอื่น ๆ อีกกว่าInfinityและNaNและมีไม่ตัวอักษรใด ๆ -+.0123456789eที่ใช้ในการแสดงสตริงปกติของพวกเขาอื่นที่ไม่ใช่

คุณสมบัติ

-+.0123456789adefinuyINดังนั้นเราจึงมีตัวอักษร เราสามารถเข้าถึงคุณสมบัติใดได้บ้าง ลองถาม JavaScript

>>> R = /^[-+.0123456789adefinuyIN]+$/
>>> [Array, Object, String, Number].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'find' ], Object: [], String: [], Number: [] }

เฉพาะ[].findซึ่ง Jens พบแล้ว ลองโยนมันลงบนสตริงแล้วเก็บเกี่ยวตัวอักษรทั้งหมดแล้วลองอีกครั้ง การแทนสตริงจะแตกต่างกันเล็กน้อยในเบราว์เซอร์ บน Chrome และ Edge "function find() { [native code] }"มีacdefinotuv()[]{}และเว้นวรรค +-.()[]{}0123456789INacdefinotuvyตัวอักษรเต็มรูปแบบของเราอยู่ในขณะนี้ บน Firefox มีช่องว่างและบรรทัดใหม่มากขึ้น แต่ตัวอักษรเหมือนกัน

เราทำการค้นหาซ้ำ:

>>> R = /^[+-.()\[\]{}0123456789INacdefinotuvy]+$/
>>> [Array, Object, String, Number, Function].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'concat', 'find' ],
  Object: [],
  String: [ 'concat' ],
  Number: [],
  Function: [] }

String.prototype.concatเลิกใช้แล้ว: มันทำสิ่ง+ที่เราทำไปแล้ว ดังนั้นเราจึงได้และArray.prototype.concat Array.prototype.findเราสามารถทำอะไรกับพวกเขา

ฟังก์ชั่น

concat()ให้เราสร้างอาร์เรย์เป็นครั้งแรก [[]].concat([[]])เป็นและหล่อที่เป็นสตริงที่เราได้รับ[[], []] ","(สิ่งนี้ไม่ได้ช่วยให้เราค้นหาคุณสมบัติใหม่) แต่.concatไม่ได้ปรับเปลี่ยนค่าของเราและจะไม่สามารถส่งคืนnullหรืออะไรทำนองนั้นได้

การโทรfind()ไม่ได้ช่วยเราเช่นกัน: เอกสาร MDNบอกว่า

find()วิธีการส่งกลับค่าในอาร์เรย์ถ้าเป็นองค์ประกอบในการสร้างความพึงพอใจอาร์เรย์ทดสอบฟังก์ชั่นที่จัดไว้ให้ มิฉะนั้นundefinedจะถูกส่งกลับ

ทั้งสองอย่างที่เราสามารถทำได้โดยใช้การจัดทำดัชนี


และจากที่นี่ไม่มีที่ไหนอีกแล้วที่จะไป หากคุณสงสัยในสิ่งที่ฉันเขียนให้ฉันทราบในความคิดเห็น


1
วิธีการส่วนตัวของฉันฉันได้ทำงานกับในชั่วโมงที่ผ่านมาเพียงอย่างเดียวมีผลทั้งหมดที่เป็นไปได้nullฟังก์ชั่นที่กลับมา: String.prototype.match, และRegExp.exec Array.prototype.includesการค้นหาสิ่งเหล่านี้เป็นไปไม่ได้ที่จะก่อตัวเว้นแต่จะมีวิธีแปลก ๆ ในการสร้าง regex ที่ฉันไม่รู้ฉันยังได้ข้อสรุปว่าไม่มีวิธีที่เป็นไปได้ที่จะทำเช่นนี้
Conor O'Brien

การวิเคราะห์ที่ดี! นี้น่าจะเป็นคำตอบที่ถูกต้อง แต่ฉันยังคงหวังว่าเคล็ดลับบางอย่าง ... ความหวังอาจเท็จแม้ว่า :)
Jens Renders

หากเราได้รับจดหมายจากการจับและโยนเราจะได้รับจดหมายของข้อผิดพลาดหรือไม่? นั่นคือ 'hwr'
Rɪᴋᴇʀ

3
แม้ว่าเราจะสร้างสตริง"catch"และ"throw"ที่เราไม่สามารถทำได้ แต่เราต้องการบางสิ่งบางอย่างevalเพื่อใช้เป็นคำหลักซึ่งเป็นเป้าหมายของเราในตอนแรก
Lynn

ตัวเลขที่เป็นลบนั้นเป็นไปได้โดยใช้-และการคำนวณตัวเลข แต่ก็ไม่ค่อยมีประโยชน์
CalculatorFeline

15

3 ฟังก์ชั่นในคำตอบของ Lynnนั้นไม่ได้ไร้ประโยชน์ แต่โหมดที่เข้มงวดใน ECMAScript 5 ได้ทำลายแผนของฉัน

มีการเล่นโวหารใน JavaScript / ECMAScript เวอร์ชันเก่ากว่า หากวิธีการถูกเรียกโดยไม่มีวัตถุวัตถุทั่วโลกwindowจะถือว่า ดังนั้นเราสามารถทำสิ่งนี้:

a = {f:function(){return this}};
a.f();                            // Returns a.
g = a.f;
g();                              // Returns window.
window.g();                       // Also returns window.

สิ่งนี้ยังคงเป็นจริงสำหรับเบราว์เซอร์รุ่นใหม่ แต่ถ้าฟังก์ชั่นไม่ได้ถูกกำหนดในโหมดเข้มงวด และฟังก์ชั่นในตัวทั้งหมด (ที่มีรหัสเนทีฟ) ดูเหมือนจะอยู่ในโหมดเข้มงวด ในเบราว์เซอร์รุ่นเก่าเมื่อยังไม่มีโหมดที่เข้มงวดโหมดนี้ยังใช้งานได้กับฟังก์ชั่นในตัว

สมมติว่าเรากำลังใช้เบราว์เซอร์รุ่นเก่า แล้วถ้าเราต้องการเราต้องไปหาในตัวฟังก์ชั่นที่มีผลตอบแทนบางสิ่งบางอย่างwindow thisภายในตัวเลือกเดียวที่เรามีมีฟังก์ชั่นที่Array.prototype.concatทำสิ่งนั้นอย่างแน่นอน เราสามารถทดสอบได้ดังนี้:

Number.prototype.concat = Array.prototype.concat;
1..concat(2);                     // Returns [1, 2]
concat = Array.prototype.concat;
window.concat(2);                 // Returns [window, 2]
concat(2)                         // TypeError in modern browsers while
                                  //   returning the same thing in older ones.
concat.bind(window)(2)            // A workaround in modern browsers.

ดังนั้นโดยทั่วไปแล้วมันไม่สนใจว่าวัตถุที่ถูกเรียกนั้นเป็นอาร์เรย์หรือไม่ (แต่ต้องเป็นวัตถุสำหรับอย่างน้อยที่สุด) มันแค่ล้อมมันไว้ในอาร์เรย์ถ้าไม่

ถ้าเรามีwindowก่อนอื่นเราสามารถรับสาย[object Window]โดยการคัดเลือกสตริง ด้วยตัวละครใหม่bเราสามารถรับrและsใช้สองบรรทัดต่อไปนี้ตามลำดับและตัวละครทุกตัวที่เราไม่ได้มีconstructor:

window["atob"]("cuaa")[0]
window["atob"]("cyaa")[0]

แต่ปัญหาอื่น ๆ [].concatคือการเอาวัตถุอ้างอิงจาก ห่อไว้ในอาร์เรย์และการสกัดไม่ทำงานเพราะหมายถึงอยู่แล้ว[].concat []["concat"]วิธีเดียวที่ฉันรู้ว่าสิ่งใดที่สามารถสร้างได้โดยใช้+[]()คือการส่งคืนจากฟังก์ชัน Array.prototype.findดูเหมือนว่าจะสามารถทำเช่นนั้นได้:

[[]["concat"]]["find"](x=>1)      // Returns Array.prototype.concat, where x=>1 can
                                  //   be replaced with any always truthy function.

เรามีฟังก์ชั่นความจริงเสมอ Array.prototype.concatและString.prototype.concatทั้งสองกลับมา truthy windowถ้าวัตถุนั้น หากเราใช้ในภายหลังเราจะใช้ฟังก์ชั่นทั้งสามที่มีให้

แต่น่าเสียดายที่Array.prototype.findไม่มีอยู่ในเบราว์เซอร์เก่าที่เราใช้อยู่ อย่างน้อยฉันก็ไม่พบสิ่งที่ใช้ได้ และฉันไม่พบวิธีอื่นในการลบการอ้างอิงวัตถุ

รหัสที่สมบูรณ์ที่สามารถทดสอบได้ในเบราว์เซอร์สมัยใหม่ที่ส่งคืนrและsด้วย.bind(window)วิธีแก้ปัญหา:

[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cuaa")[0];
[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cyaa")[0]

ข้อมูลยอดเยี่ยม คุณลองใช้เบราว์เซอร์ใดบ้าง
Lynn

@ ลินน์ไม่มาก Firefox 3.6.0 และ 25.0 เป็นส่วนใหญ่ ฉันอ่านจากที่นี่และที่นี่ซึ่งfindช้ากว่าโหมดเข้มงวดมาก ฉันถามเกี่ยวกับ Edge เพราะฉันคิดว่ามันอาจมีโอกาสที่จะชอบความเข้ากันได้แบบย้อนหลังกับการทำตามมาตรฐาน ฉันลองใช้ Konqueror ด้วยเหตุผลเดียวกัน และเบราว์เซอร์บรรทัดคำสั่งบางตัว แต่ไม่มีแม้แต่สนับสนุน JavaScript
jimmy23013

ฉันลองใช้ Safari 7.1 และ 8 และสุ่มเบราว์เซอร์เริ่มต้นตามสมควรบนโทรศัพท์ในเว็บไซต์ภาพหน้าจอของเบราว์เซอร์ ยังไม่มีใครทำงานได้
jimmy23013

@ jimmy23013 ลองใช้ Safari 5.0 หรือ 5.1 ตามที่ฉันสามารถใช้ , การสนับสนุนบางส่วนใน Safari เก่าหมายถึงโหมดที่เข้มงวดยังคงยอมรับมากของ JS ที่ควรจะถือว่าไม่ถูกต้อง แม้ว่าจะfindยังไม่ถูกนำมาใช้อาจเป็นบางส่วนหรือไม่ ... ถ้ามีอยู่ในรายการ ...
mbomb007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.