2014-09-06 3 views
1
var PgrtiJr = { 
    "TWfbR": +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![])) 
}; 
PgrtiJr.TWfbR -= +((+!![] + []) + (+!![])); 
console.log(parseInt(PgrtiJr.TWfbR, 10)); 

I выше вышеупомянутый js код. Я выполнил этот код на http://math.chapman.edu/~jipsen/js/. Может ли кто-нибудь объяснить мне, как он равен 32?понимание js код выражение

и вы можете рекомендовать какую-либо библиотеку питона, который может оценить это выражение в питоне

пытавшихся execjs, но не повезло

ответ

1

Вы должны понять несколько важных вещей о свободной типизации в JavaScript. Давайте начнем с более простых вещей, специфичных для вашего вопроса.

  1. Пустой массив буквальный считаются truthy, но при применении унарного оператора +, массив будет преобразован в строку и которые затем будут преобразованы в число. Таким образом, внутренне +[] имеет значение 0.

    console.log(+[]); 
    // 0 
    
  2. С [] является truthy, двойное отрицание его логического оператора не даст вам true, который при использовании в арифметическом выражении, оценки 1, так как 1 неплотно равна до true.

    console.log(!![], 3 + !![]); 
    // true 4 
    
  3. Помимо всего этого, когда мы используем литерал массива с + оператором, массив будет преобразован в строку и так как одна часть выражения является строка, другая часть выражения также будет преобразование в строку и конкатенацию строк. Таким образом, результирующий объект будет иметь строку типа.

    console.log(typeof 1, typeof [], typeof (1 + []), 1 + []); 
    // number object string 1 
    

С этим основным пониманием, позволяет анализировать первое выражение.

+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])) 

Давайте сначала взять,

(!+[]+!![]+!![]+!![]+[]) 

Здесь +[] вычисляет 0 и логична, не делает его как true. Поскольку мы используем его в выражении с числовым операндом, true рассматривается как 1. И согласно нашей точке 2, приведенной выше, !![] оценивает 1. Таким образом, выражение становится 1 + 1 + 1 + 1 + [], которое на самом деле 4 + []. И в соответствии с пунктом 3, число 4 будет строка 4.

Точно так же, другая часть выражения, (!+[]+!![]+!![]) становится 1 + 1 + 1 и что на самом деле 3. Итак, когда вы делаете '4' + 3, вы получите '43', который это строка. Теперь у нас есть унарный + оператор, который преобразует эту строку в число. Итак, результатом оценки этого выражения становится 43, что является числом.

Другая часть выражения,

PgrtiJr.TWfbR -= +((+!![]+[])+(+!![])) 

будут оценены как этот

+((1 + []) + 1) 

, а затем

+('1' + 1) 

, а затем

+'11' 

, который затем оценивается как 11. Поскольку PgrtiJr.TWfbR на самом деле 43, 43 - 11 становится 32. Вот почему вы получаете 32 в качестве ответа.

0
[] is an object that is equal to null. 

!![] is a "boolean" that equals to true. (twice ! of null (= false)) 

!+[] is a "boolean" that equals to true. 

, и если мы добавим [] после этих выражений, они будут преобразованы в строку.

так (!+[]+!![]+!![]+!![]+[]) будет строка, которая равна 4

(!+[]+!![]+!![]) будет строка, которая равна 3

следовательно (!+[]+!![]+!![]+!![]+[]) + (!+[]+!![]+!![]) будет строка, которая равна 43

и +(!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]) будет число, что опять равняется 43

таким же образом +((+!![]+[])+(+!![])) будет равно 11

поэтому итоговое выражение будет равно 43 - 11 = 32

Смежные вопросы