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але я не зміг отримати це значення за допомогою цих 5 символів. Наприклад, він може бути використаний для отримання булів, якщо у нас вже є "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: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ]) + (++ [[]] [+ []])]

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

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

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

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

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

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

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

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

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

Це дуже тісно пов'язане з codegolf.stackexchange.com/q/11690/194 , і якби на це запитання була відповідь JS, я би проголосував за закриття. Насправді, відповідь на це питання, ймовірно, перетворюється безпосередньо на відповідь на попереднє запитання, але різниця робить це досить межевим, що я не хочу закривати в односторонньому порядку.
Пітер Тейлор

29
Дуже приємне запитання. Я абсолютно прихильний до питання про езотеричне програмування та нетрадиційні обчислювальні моделі , але будьте готові до того, що деякі люди закривають голосування, тому що в даний час це не зовсім відповідає обсягу, по якому люди домовляються про мета. Я хотів би, щоб це створило прецедент для таких питань. :)
Мартін Ендер

1
Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Алекс А.

4
Питання на кшталт цього змушують мене бачити, що є особливість дарувати щедру запитання.
xnor

1
Я отримав eval2453 символи з windowдозволеними.
CalculatorFeline

Відповіді:


23

Після мозкового штурму результатом здається, що в сучасних браузерах принаймні цього немає.

Я спробую узагальнити весь процес, додавши деякі міркування про те, чому ми вичерпали наші варіанти в будь-якому даному домені, перш ніж продовжувати. Тоді, заборонивши якесь дивовижне нове розуміння (наприклад, кутовий випадок синтаксису JavaScript, про який всі забувають), буде цілком зрозуміло, що немає жодного способу отримати інші букви.

Літерали

Єдиний безпосередні літералами ви можете зробити з +()[]є вкладеними порожніми масивами [], [[]], [[[]]]і т.д. Звідти, ми можемо почати лиття значення з допомогою +:

  • +[]отримує нуль, що хитрість Йенса розширюється на довільні додатні цілі числа, використовуючи ++.

  • []+[]є "". Фактично, []+xотримує нам рядкове представлення xзагалом.

[]Наступне використання - індексація. Індексація об'єкта поза межами ( [][[]]) отримує вас undefined. Передаючи це на рядок та індексуючи результат, ви отримуєте букви d e f i n u; відкидання його до цілого числа, яке спочатку використовується, +отримує вас NaN, звідки a Nвипливають літери .

Використання ++трюку на будь-якому нецілому значенні, досягнутому поки що, або дає NaNабо помилку. Крім того, жоден із об'єктів, які ми можемо створити, не може дзвонити (поки що), тому ()не допомагає (крім групування).

Залишилися трюки, що залишилися, - це кастинг та індексація. Отже, питання полягає в тому, які рядки ми можемо створити, використовуючи символи, 0123456789adefinuNякі будь-які

  • - це літеральні цифри, які ми можемо обернути на цілі числа, щоб отримати нові рядки, або
  • - це назви властивостей об'єктів, до яких ми вже можемо досягти?

Число літералів

В якості прикладу другого варіанту, то ми можемо зробити рядок "1e1000", а потім отримати Infinityвід +"1e1000"і виливок , що назад в рядок отримує нам лист yі I.

Крім того, ми можемо зробити "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, що вже знайшов Єнс. Давайте прикинемо це до рядка, пожнемо всі його букви та спробуємо ще раз. Представлення рядків дещо відрізняється в браузерах. На 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. Виявивши все це неможливо сформувати, якщо не існує незвичайного способу формування регулярного вираження, про який я не знаю, я також дійшов висновку, що це неможливо зробити.
Conor O'Brien

Приємний аналіз! Це, мабуть, правильна відповідь, але я все ще сподіваюся на якусь хитрість ... напевно, хибна надія, хоча :)
Єнс надає

Якби ми могли дістати літери для лову та кидання, чи могли б ми отримати листи помилки? Це - hwr.
Rɪᴋᴇʀ

3
Навіть якщо ми побудуємо рядки "catch"і "throw", що ми зараз не можемо, нам знадобиться щось подібне eval, щоб використовувати їх як ключові слова, що в першу чергу наша мета.
Лін

Можливі негативні цифри з використанням -і переливання чисел, але це не дуже корисно.
CalculatorFeline

15

3 функції у відповіді Лінн не були такими марними. Але суворий режим в 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обидва повертають правду, якщо об'єкт є 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.