[英]understanding js code expression
var PgrtiJr = {
"TWfbR": +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![]))
};
PgrtiJr.TWfbR -= +((+!![] + []) + (+!![]));
console.log(parseInt(PgrtiJr.TWfbR, 10));
我上面提到了js代碼。 我在http://math.chapman.edu/~jipsen/js/上執行了此代碼。 有人可以解釋一下它等於32
嗎?
並且您可以推薦任何可以在python中評估此表達式的python庫
嘗試過execjs但沒有運氣
您需要了解有關JavaScript的松散類型的一些重要知識。 讓我們從特定於您問題的簡單事物開始。
空數組文字被認為是真實的,但是當您應用一元+運算符時,該數組將被轉換為字符串,然后將其轉換為數字。 因此,內部+[]
值為0。
console.log(+[]); // 0
由於[]
是真實的,因此使用邏輯非運算符對其進行兩次否定會得到true
,當在算術表達式中使用時,其值為1,因為1大致等於true
。
console.log(!![], 3 + !![]); // true 4
除了所有這些以外,當我們使用帶有+
運算符的數組文字時,該數組將轉換為字符串,並且由於表達式的一部分是字符串,因此表達式的另一部分也將轉換為字符串,並且發生字符串連接。 因此,生成的對象將是字符串類型。
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,所以PgrtiJr.TWfbR
變為32。這就是為什么得到32作為答案的原因。
[] 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.