Tooán tử so sánh trong js

Có người vẫn nói vui rằng JavaScript là “The World’s Most Misunderstood Programming Language”, bởi có rất nhiều lập trình viên Web vẫn đang làm việc, thậm chí là làm việc rất nhiều, và rất tốt với JavaScript nhưng lại không thể hiểu rõ căn bản của nó.

JavaScript quả thật tuy là gần gũi, quen thuộc thật đấy nhưng đôi khi lại rất xa lạ với chúng ta ở vài mặt nào đó. Bài viết này xin được giới thiệu về một trong những mặt có phần “xa lạ” đó của JavaScript.

Trước tiên, mình xin có một vài câu đố nhỏ cho các bạn. Câu hỏi rất đơn giản thôi: “Các phép toán dưới đây trả về true hay

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

0“.

Bạn có thể kiểm tra câu trả lời một cách dễ dàng bằng cách mở console của trình duyệt lên và gõ câu lệnh vào đó, hoặc xem ở cuối bài viết này.

`false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined null == false undefined == false NaN == NaN NaN == false NaN == true 63 == false 63 == true 0 == false "63" == true "63" == false "0" == true "0" == false !"0" == !false "" == false [] == "" [] == false [] == "0" [] == 0 [] == ![] "0" == !"0" 0 == {} [1] < 2 // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b a > b a == b a <= b a >= b `Code language: JavaScript (javascript)

Nếu bạn có thể trả lời đúng hết, và hiểu được bản chất tại sao nó lại như vậy thì có lẽ bạn cũng đã nắm rõ hết được những gì mà bài viết này đề sẽ cập đến rồi.

Còn ngược lại, hãy dành chút thời gian để đọc và tìm hiểu về những điều sẽ được giới thiệu dưới đây, và bạn sẽ tự tìm được lời giải thích cho từng đáp án.

Let’s start! (honho)

Variable Types

Để trả lời được những câu hỏi trên thì trước hết ta cần phải tìm hiểu và nắm rõ được về những kiểu giá trị có trong Javascipt.

Các kiểu giá trị trong JavaScript

Trong Javascript phiên bản ES5.1, phiên bản mới nhất tính đến thời điểm thực hiện bài viết này 5/2015, có những kiểu giá trị sau:

  • boolean
  • null
  • undefined
  • string
  • number
  • object

(Ngoài ra còn một kiểu giá trị nữa, sẽ được đưa vào phiên bản tiếp theo của Javascript (ES6), đó là symbol)

Tất các các kiểu dữ liệu khác Object được gọi là giá trị “nguyên thủy”, Primitive.

Một số điều cần lưu ý:

  • Kiểu Boolean gồm 2 giá trị là true và `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0.
  • Kiểu Null chỉ gồm duy nhất một giá trị là `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 3.
  • Kiểu Undefined chỉ gồm duy nhất một giá trị là `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 4.

Như đã biết thì để so sánh “bằng” trong Javascript, ta có thể dùng

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

5 và

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

6.

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

6, Strict Comparison hay Strict Equal, sẽ so sánh cả kiểu giá trị của 2 bên. Nếu 2 bên có kiểu giá trị khác nhau thì phép toán sẽ trả về giá trị

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

0. Phép toán

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

6 là rất minh bạch và dễ sử dụng, ít gây hiểu nhầm hay khó khăn gì cho lập trình viên.

Còn phép so sánh

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

5, Loose Comparison hay Loose Equal, thì sẽ tìm cách đưa một trong 2 bên về cùng kiểu giá trị với bên kia rồi thực hiện phép so sánh.

Có rất nhiều cách để ép một giá trị từ kiểu này về kiểu kia, một trong những cách đơn giản nhất là sử dụng các hàm có sẵn của Javascript là Boolean, String, Number, Object …

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

Những giá trị được coi là

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

0

Đó là những giá trị khi được ép về kiểu Boolean sẽ cho giá trị là

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

0. Bao gồm:

  • `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0
  • `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 4
  • `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 3
  • `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 6 (Gồm cả `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 7 và `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 8)
  • `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 9 (Not A Number)
  • `if ("0") {
    // It WILL reach here  
    
    } if ("0" == true) {
    // It will NOT reach here  
    
    } `Code language: PHP (php) 0 (Empty String)

Vậy những giá trị nào khi ép về kiểu Boolean sẽ cho giá trị là true ?

Câu trả lời rất đơn giản: những giá trị không nằm trong list các giá trị đã kể ở phía trên (tức là ngoài

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

0,

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

4,

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

3,

`if (null) {

// It will not reach here
} else if (0) {
// It will not reach here
} else if ("") {
// It will not reach here
} else if (1) {
// REACH here
} `Code language: JavaScript (javascript)

6,

`if (null) {

// It will not reach here
} else if (0) {
// It will not reach here
} else if ("") {
// It will not reach here
} else if (1) {
// REACH here
} `Code language: JavaScript (javascript)

9 và

`if ("0") {

// It WILL reach here
} if ("0" == true) {
// It will NOT reach here
} `Code language: PHP (php)

0 ra).

true or not true?

Trong các phép toán điều kiện như

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

0,

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

1,

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

2 … , nếu không sử dụng các toán tử so sánh, mà chỉ có biến số hay giá trị ở trong đó thì nó sẽ được ép về kiểu

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

3, ví dụ:

`if (null) {

// It will not reach here
} else if (0) {
// It will not reach here
} else if ("") {
// It will not reach here
} else if (1) {
// REACH here
} `Code language: JavaScript (javascript)

Đến đây, hãy nhìn lại list các câu hỏi được đưa ra ở đầu bài một chút. Ta có phép toán

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

4 chẳng hạn.

Hãy so sánh 2 trường hợp sau nhé:

`if ("0") {

// It WILL reach here
} if ("0" == true) {
// It will NOT reach here
} `Code language: PHP (php)

Vâng, một cái bẫy mà Javascript đã giăng ra dành cho các lập trình viên mà không phải ai cũng biết, và có thể đã mắc phải mà không hề hay.

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

5 cho giá trị Boolean là true, nhưng lại trả về

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

0 trong phép so sánh

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

5 với true.

Vậy đâu là nguyên nhân, hãy tìm hiểu các quy tắc trong phép so sánh ở phần dưới đây.

Loose Comparisons

Một số quy tắc

Khi thực hiện so sánh bằng phép toán

`Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)

5, trong trường hợp 2 vế có giá trị thuộc những kiểu khác nhau thì sẽ có một số các quy tắc sau được áp dụng.

Việc suy nghĩ cả 2 vế đều được ép về kiểu Boolean và so sánh 2 giá trị Boolean là một sai lầm.

  • Boolean(1) // true

    String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 3 chỉ `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 5 chính nó hoặc `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 4 và ngược lại. Từ quy tắc này ta thấy được phép toán

    [1] == [1] // false

    {a: 1} == {a: 1} // false var x = [1]; var y = [1]; x == y // false var x = y = [1]; x == y // true var x = {a: 1}; var y = x; x == y // true

    Code language: JavaScript (javascript)

    4 hay

    [1] == [1] // false {a: 1} == {a: 1} // false var x = [1]; var y = [1]; x == y // false var x = y = [1]; x == y // true var x = {a: 1}; var y = x; x == y // true `Code language: JavaScript (javascript) 5 sẽ trả về `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0!
  • Khi so sánh một String với một Number thì giá trị String sẽ bị ép về kiểu Number để so sánh.
  • Khi so sánh một giá trị thuộc kiểu Boolean với một giá trị thuộc kiểu khác thì giá trị thuộc kiểu Boolean sẽ được ép về kiểu Number để so sánh.
  • Giá trị true sẽ được ép thành `[1] == [1] // false {a: 1} == {a: 1} // false var x = [1]; var y = [1]; x == y // false var x = y = [1]; x == y // true var x = {a: 1}; var y = x; x == y // true `Code language: JavaScript (javascript) 8, giá trị `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0 sẽ được ép thành `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 6.
  • Trở lại với ví dụ là phép toán [63] == "63" // true [3, 10] == "3,10" // true var num = {
    valueOf: function () {  
        return 1;  
    },  
    toString: function () {  
        return "2";  
    }  
    
    }; num == "1" // true num == 2 // false var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return 2;  
    }  
    
    }; num == "1" // false num == 2 // true var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return [2];  
    }  
    
    }; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript) 4. Đầu tiên `true
    sẽ được chuyển thành `[1] == [1] // false {a: 1} == {a: 1} // false var x = [1]; var y = [1]; x == y // false var x = y = [1]; x == y // true var x = {a: 1}; var y = x; x == y // true `Code language: JavaScript (javascript) 8, phép toán trở thành `String(null) // "null" String([null]) // "" [null, undefined] == "," // true [null] == 0 // true [undefined] == 0 // true `Code language: JavaScript (javascript) 4.
  • Tiếp đến String `[63] == "63" // true [3, 10] == "3,10" // true var num = {
    valueOf: function () {  
        return 1;  
    },  
    toString: function () {  
        return "2";  
    }  
    
    }; num == "1" // true num == 2 // false var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return 2;  
    }  
    
    }; num == "1" // false num == 2 // true var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return [2];  
    }  
    
    }; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript) 5 được ép về kiểu Number thành `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 6 để ta có được phép toán `String(null) // "null" String([null]) // "" [null, undefined] == "," // true [null] == 0 // true [undefined] == 0 // true `Code language: JavaScript (javascript) 7. Rõ ràng nó sẽ trả về `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript)
  • Vậy

    [63] == "63" // true [3, 10] == "3,10" // true var num = {
    valueOf: function () {  
        return 1;  
    },  
    toString: function () {  
        return "2";  
    }  
    
    }; num == "1" // true num == 2 // false var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return 2;  
    }  
    
    }; num == "1" // false num == 2 // true var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return [2];  
    }  
    
    }; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript) 5 có giá trị Boolean là `true
    , nhưng phép toán `[63] == "63" // true [3, 10] == "3,10" // true var num = {
    valueOf: function () {  
        return 1;  
    },  
    toString: function () {  
        return "2";  
    }  
    
    }; num == "1" // true num == 2 // false var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return 2;  
    }  
    
    }; num == "1" // false num == 2 // true var num = {
    valueOf: function () {  
        return [1];  
    },  
    toString: function () {  
        return [2];  
    }  
    
    }; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript) 4 sẽ trả về `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0.
  • Khi so sánh một biến có kiểu Object với một biến không phải là Object (tức một giá trị thuộc nhóm Primitive: boolean, number, string, null, undefined) thì giá trị của Object sẽ là giá trị trả về của hàm `!!0 //false !!"0" // true !![] // true !!{} // true `Code language: JavaScript (javascript) 3, nếu nó là Primitive.
  • Ngược lại, nếu hàm !!0 //false

    !!"0" // true !![] // true !!{} // true `Code language: JavaScript (javascript) 3 không được định nghĩa, hoặc nó trả về giá trị không phải là Primitive, thì giá trị của Object sẽ là giá trị trả về từ hàm

    !!0 //false !!"0" // true !![] // true !!{} // true `Code language: JavaScript (javascript) 5.
  • Nếu hàm !!0 //false

    !!"0" // true !![] // true !!{} // true `Code language: JavaScript (javascript) 5 cũng trả về một giá trị không phải là Primitive thì sẽ xảy ra lỗi

    !!0 //false !!"0" // true !![] // true !!{} // true `Code language: JavaScript (javascript) 7

`[63] == "63" // true [3, 10] == "3,10" // true var num = {

valueOf: function () {
    return 1;
},
toString: function () {
    return "2";
}
}; num == "1" // true num == 2 // false var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return 2;
}
}; num == "1" // false num == 2 // true var num = {
valueOf: function () {
    return [1];
},
toString: function () {
    return [2];
}
}; num == "1" // TypeError: Cannot convert object to primitive value `Code language: JavaScript (javascript)

  • Hai biến cùng thuộc loại Object chỉ bằng nhau nếu chúng cùng trỏ đến một Object.

`[1] == [1] // false {a: 1} == {a: 1} // false var x = [1]; var y = [1]; x == y // false var x = y = [1]; x == y // true var x = {a: 1}; var y = x; x == y // true `Code language: JavaScript (javascript)

Một số chú ý

  • if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    }

    `Code language: JavaScript (javascript) 9 không bằng chính nó. Phép toán

    !!0 //false

    !!"0" // true !![] // true !!{} // true

    Code language: JavaScript (javascript) 9 hay `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 0 đều trả về false. `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 9 được thiết kế để mọi phép so sánh `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 5, `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 3, `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 4, `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 5, `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 6, với `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 9 đều trả về `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0. Chỉ có phép so sánh `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 9 là trả về `true
    mà thôi.
  • Trong phép toán ép kiểu về String thì Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 3 sẽ thành `true`2, `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 4 sẽ thành `true`4, `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0 sẽ thành `true`6 còn `true sẽ thành `true`8.
  • Tuy nhiên, nếu `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 4 hay `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 3 nằm trong một mảng thì chúng sẽ được chuyển về thành xâu rỗng. (facepalm)

`String(null) // "null" String([null]) // "" [null, undefined] == "," // true [null] == 0 // true [undefined] == 0 // true `Code language: JavaScript (javascript)

  • Trong phép toán ép kiểu về Number thì `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 3 sẽ thành `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 6, `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 4 sẽ thành `if (null) {
    // It will not reach here  
    
    } else if (0) {
    // It will not reach here  
    
    } else if ("") {
    // It will not reach here  
    
    } else if (1) {
    // REACH here  
    
    } `Code language: JavaScript (javascript) 9.
  • Phép phủ định Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 05 của một biến, hay một giá trị sẽ ép kiểu biến hay giá trị đó về Boolean trước, sau đó sẽ lấy phủ định. Từ đó ta có `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 06 sẽ là `true, còn Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 08 sẽ là `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0. Dựa vào tính chất này, ta có thêm một cách đơn giản để check xem một giá trị có Boolean là `true hay `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 0, đó là dùng phép `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 05 2 lần. Ví dụ:

`!!0 //false !!"0" // true !![] // true !!{} // true `Code language: JavaScript (javascript)

  • Phép toán `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 5 thực sự là một cái bẫy nữa. Như trong tiếng Việt thì ta sẽ gọi đó là phép toán lớn hơn hoặc bằng, tuy nhiên thực tế Javascript lại không dịch như vậy, nó hiểu `false == false // It will return true. Too easy, right ? :D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined // true null == false // false undefined == false // false NaN == NaN // false NaN == false // false NaN == true // false 63 == false // false 63 == true // false 0 == false // true "63" == true // false "63" == false // false "0" == true // false "0" == false // true !"0" == !false // false "" == false // true [] == "" // true [] == false // true [] == "0" // false [] == 0 // true [] == ![] // true "0" == !"0" // true 0 == {} // false [1] < 2 // true // Initialize variables - Khởi tạo biến a = {} b = {} // TRUE or FALSE ? Các phép so sánh sau trả về TRUE hay FALSE ? a < b // false a > b // false a == b // false a <= b // true a >= b // true`Code language: JavaScript (javascript) 5 là phép toán không nhỏ hơn.
  • Tức phép toán `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 15 không phải tương đương với `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 16, mà nó tương đương với `Boolean(1) // true String(null) // "null" Number("10.3") // 10.3 Number("1string") // NaN String([1, 2, "string"]) // "1,2,string" `Code language: JavaScript (javascript) 17

The Answers

Dưới đây là đáp án cho những câu hỏi được đưa ra ở đầu bài viết.

Nếu bạn đã đọc hết phần phía trên rồi thì chắc có thể hiểu được tại sao nó lại ra được đáp án như dưới đây. Còn nếu có câu nào mà bạn vẫn chưa hiểu được nguyên nhân thì điều đó có nghĩa là bạn đã bỏ sót điều gì đó rồi đấy, kéo lên đọc lại thôi (honho)