ทำไมถึง==
เดาไม่ได้?
คุณได้อะไรเมื่อคุณเปรียบเทียบสตริงที่ว่างเปล่า""
กับศูนย์จำนวน0
?
true
ใช่นั่นถูกต้องตาม==
สตริงว่างเปล่าและเลขศูนย์เป็นเวลาเดียวกัน
และยังไม่จบตรงนี้อีกอัน:
'0' == false // true
สิ่งต่าง ๆ แปลก ๆ กับอาร์เรย์
[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true
จากนั้นก็แปลกด้วยเชือก
[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!
มันแย่ลง:
เมื่อเท่ากับไม่เท่ากัน
let A = '' // empty string
let B = 0 // zero
let C = '0' // zero string
A == B // true - ok...
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!
ให้ฉันพูดอีกครั้ง:
(A == B) && (B == C) // true
(A == C) // **FALSE**
และนี่เป็นเพียงสิ่งที่บ้าคลั่งที่คุณได้รับจากสิ่งดั้งเดิม
มันเป็นระดับใหม่ของความบ้าคลั่งเมื่อคุณใช้==
กับวัตถุ
ณ จุดนี้คุณอาจสงสัยว่า ...
ทำไมสิ่งนี้ถึงเกิดขึ้น
ก็เพราะต่างจาก "สามเท่า" ( ===
) ซึ่งเพิ่งตรวจสอบว่าสองค่าเหมือนกันหรือไม่
==
ทำสิ่งอื่นทั้งหมด
มันมีการจัดการพิเศษสำหรับฟังก์ชั่นการจัดการพิเศษสำหรับโมฆะไม่ได้กำหนดสตริงคุณชื่อมัน
มันค่อนข้างแปลกประหลาด
ในความเป็นจริงถ้าคุณพยายามที่จะเขียนฟังก์ชั่นที่ทำในสิ่งที่==
มันจะมีลักษณะเช่นนี้:
function isEqual(x, y) { // if `==` were a function
if(typeof y === typeof x) return y === x;
// treat null and undefined the same
var xIsNothing = (y === undefined) || (y === null);
var yIsNothing = (x === undefined) || (x === null);
if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);
if(typeof y === "function" || typeof x === "function") {
// if either value is a string
// convert the function into a string and compare
if(typeof x === "string") {
return x === y.toString();
} else if(typeof y === "string") {
return x.toString() === y;
}
return false;
}
if(typeof x === "object") x = toPrimitive(x);
if(typeof y === "object") y = toPrimitive(y);
if(typeof y === typeof x) return y === x;
// convert x and y into numbers if they are not already use the "+" trick
if(typeof x !== "number") x = +x;
if(typeof y !== "number") y = +y;
// actually the real `==` is even more complicated than this, especially in ES6
return x === y;
}
function toPrimitive(obj) {
var value = obj.valueOf();
if(obj !== value) return value;
return obj.toString();
}
ดังนั้นสิ่งนี้หมายความว่าอย่างไร
มันหมายถึง==
ซับซ้อน
เพราะมันซับซ้อนมันยากที่จะรู้ว่าจะเกิดอะไรขึ้นเมื่อคุณใช้งาน
ซึ่งหมายความว่าคุณสามารถจบลงด้วยข้อบกพร่อง
ดังนั้นคุณธรรมของเรื่องราวคือ ...
ทำให้ชีวิตของคุณซับซ้อนน้อยลง
ใช้แทน===
==
ตอนจบ.
=== vs ==
แต่ใน PHP สามารถอ่านได้ที่นี่: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…