DEV Community

Cover image for ++[[]][+[]]+[+[]] = "10"
Nantipat
Nantipat

Posted on • Updated on • Originally published at dev.to

++[[]][+[]]+[+[]] = "10"

บันทึกความเข้าใจ Why does ++[[]][+[]]+[+[]] return the string “10”?

แยกมันออกก่อน

++[[]][+[]]
+
[+[]]
Enter fullscreen mode Exit fullscreen mode

In JavaScript, เป็น true +[] === 0

+ จะแปลงบางอย่างเป็น number (เช่น 1+"2")

ในกรณี +[] จะเป็น +"" or 0
ได้เป็น

++[[]][0]
+
[0]
Enter fullscreen mode Exit fullscreen mode

[[]][0] หมายถึง first element จาก [[]]

[[]][0] return ภายใน array ([])

ลอง console.log([[]][0]); ดู

ได้เป็น

(+[] + 1) // +A + 1  +A = number
+
[0]
Enter fullscreen mode Exit fullscreen mode

ก่อนที่ +[] จะบังคับ array ให้เป็นเลข 0 ได้จำเป็นต้องบังคับให้ array เป็น string ก่อน ก็คือ ""

  • (+[] + 1) === (+"" + 1)
  • (+"" + 1) === (0 + 1)
  • (0 + 1) === 1
1
+
[0]
Enter fullscreen mode Exit fullscreen mode

JavaScript: [0] == "0"

0 == "0" is true

"1" + "0" === "10" // Yay!

b60b490bf6b5a5c239d9a4ab3e705bc2

อธิบายเพิ่มเติม Why +[] or +“” equal to 0

เครื่องหมาย + (Unary + Operator) นั้นทำให้เราสามารถแปลงข้อมูลจากชนิดข้อมูลอื่นให้เป็นตัวเลขได้ เช่นเดียวกับที่ Number() ทำ

console.log(+[]);  // -> 0
console.log(typeof +[]); // -> number
Enter fullscreen mode Exit fullscreen mode

เพราะว่าการใช้ + นำหน้าเป็นการเรียก .valueOf().toString() ดังนั้น

+[] is equal to +[].valueOf().toString()


มาดูอีกตัวอย่างที่น่าสนใจ

(![] + [])[+[]] +
  (![] + [])[+!+[]] +
  ([![]] + [][[]])[+!+[] + [+[]]] +
  (![] + [])[!+[] + !+[]];
// -> 'fail'
Enter fullscreen mode Exit fullscreen mode

แก้บรรทัดแรกก่อน

(![] + [])[0] // +[] = +"" = 0
(false)[0] // -> ![]=false
"f"
Enter fullscreen mode Exit fullscreen mode

บรรทัดที่สอง

(![] + [])[+!+[]] 
(false+"")[+true] //->  !+[]=true
(false+"")[1] // -> +true=1
"a"
Enter fullscreen mode Exit fullscreen mode

บรรทัดที่สาม

([![]] + [][[]])[+!+[] + [+[]]] 
([false]+[][[]])[1+[0]]
"falseundefined"[10]
i
Enter fullscreen mode Exit fullscreen mode

บรรทัดที่สี่

(![] + [])[!+[] + !+[]];
(false+"")[2]
"false"[2]
l
Enter fullscreen mode Exit fullscreen mode

ผลลัพท์สุดท้ายคือ fail

expression simplifies

+[] 
+[].valueOf().toString()
+"" // ->  empty string is  Falsy Values
0  // -> 0 is false  (1 is true)
Enter fullscreen mode Exit fullscreen mode
![]  ->  [] is Truthy 
!true
false
Enter fullscreen mode Exit fullscreen mode
+!+[]
+true
1
Enter fullscreen mode Exit fullscreen mode

🦠Reference🦠:

Top comments (0)