簡體   English   中英

了解js代碼表達

[英]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的松散類型的一些重要知識。 讓我們從特定於您問題的簡單事物開始。

  1. 空數組文字被認為是真實的,但是當您應用一元+運算符時,該數組將被轉換為字符串,然后將其轉換為數字。 因此,內部+[]值為0。

     console.log(+[]); // 0 
  2. 由於[]是真實的,因此使用邏輯非運算符對其進行兩次否定會得到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,所以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM