Toán tử bằng nào (== so với ===) nên được sử dụng trong so sánh JavaScript?

5662
bcasp 2008-12-12 04:19.

Tôi đang sử dụng JSLint để duyệt qua JavaScript và nó trả về nhiều đề xuất để thay thế ==(hai dấu bằng) bằng ===(ba dấu bằng) khi thực hiện những việc như so sánh idSele_UNVEHtype.value.length == 0bên trong một ifcâu lệnh.

Có lợi ích về hiệu suất khi thay thế ==bằng ===không?

Mọi cải tiến về hiệu suất sẽ được hoan nghênh vì có nhiều toán tử so sánh tồn tại.

Nếu không có chuyển đổi loại diễn ra, liệu có tăng hiệu suất ==không?

30 answers

6660
Bill the Lizard 2008-12-12 04:25.

Toán tử bình đẳng nghiêm ngặt ( ===) hoạt động giống hệt với toán tử bình đẳng trừu tượng ( ==) ngoại trừ không có chuyển đổi kiểu nào được thực hiện và các kiểu phải giống nhau để được coi là bình đẳng.

Tham khảo: Hướng dẫn sử dụng Javascript: Các toán tử so sánh

Nhà ==điều hành sẽ so sánh để có sự bình đẳng sau khi thực hiện bất kỳ chuyển đổi kiểu cần thiết nào . Các ===nhà điều hành sẽ không làm việc chuyển đổi, vì vậy nếu hai giá trị không phải là cùng loại ===sẽ chỉ đơn giản là trở lại false. Cả hai đều nhanh như nhau.

Để trích dẫn đoạn JavaScript tuyệt vời của Douglas Crockford : The Good Parts ,

JavaScript có hai tập hợp các toán tử bình đẳng: ===!==, và cặp song sinh độc ác của chúng ==!=. Những cái tốt hoạt động theo cách bạn mong đợi. Nếu hai toán hạng cùng kiểu và có cùng giá trị thì ===tạo ra true!==tạo ra false. Cặp song sinh độc ác làm điều đúng đắn khi các toán hạng cùng loại, nhưng nếu chúng khác loại, chúng cố gắng ép buộc các giá trị. các quy tắc mà họ thực hiện rất phức tạp và không thể thay đổi được. Đây là một số trường hợp thú vị:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

Tình trạng thiếu độ nhạy là đáng báo động. Lời khuyên của tôi là đừng bao giờ sử dụng cặp song sinh độc ác. Thay vào đó, hãy luôn sử dụng ===!==. Tất cả các so sánh vừa được hiển thị sản xuất falsevới ===nhà điều hành.


Cập nhật:

Một điểm tốt được nuôi dưỡng bởi @Casebash trong các ý kiến và trong @Phillipe Laybaert của câu trả lời đối tượng liên quan. Đối với các đối tượng, =====hành động nhất quán với nhau (trừ trường hợp đặc biệt).

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

Trường hợp đặc biệt là khi bạn so sánh một đối tượng nguyên thủy với một đối tượng được đánh giá là nguyên thủy giống nhau, do toStringhoặc valueOfphương thức của nó . Ví dụ, hãy xem xét sự so sánh của một chuỗi nguyên thủy với một đối tượng chuỗi được tạo bằng cách sử dụng hàm Stringtạo.

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

Ở đây ==toán tử đang kiểm tra các giá trị của hai đối tượng và trả về true, nhưng toán tử ===thấy rằng chúng không cùng loại và trả về false. Cái nào đúng? Điều đó thực sự phụ thuộc vào những gì bạn đang cố gắng so sánh. Lời khuyên của tôi là bỏ qua hoàn toàn câu hỏi và chỉ không sử dụng hàm Stringtạo để tạo các đối tượng chuỗi từ các ký tự chuỗi.

Tài liệu tham khảo
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1168
Kalpesh Rajai 2008-12-12 04:33.

Sử dụng ==toán tử ( Bình đẳng )

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

Sử dụng ===toán tử ( Identity )

true === 1; //false
"2" === 2;  //false

Điều này là do toán tử bình đẳng ==thực hiện cưỡng chế kiểu , có nghĩa là trình thông dịch ngầm cố gắng chuyển đổi các giá trị trước khi so sánh.

Mặt khác, toán tử nhận dạng ===không thực hiện cưỡng chế nhập và do đó không chuyển đổi các giá trị khi so sánh, và do đó nhanh hơn (theo kiểm tra điểm chuẩn JS này ) khi nó bỏ qua một bước.

758
SNag 2014-05-05 19:21.

Một đại diện bằng hình ảnh thú vị về sự so sánh bình đẳng giữa =====.

Nguồn: http://dorey.github.io/JavaScript-Equality-Table/


var1 === var2

Khi sử dụng ===để kiểm tra bình đẳng JavaScript, mọi thứ đều như vậy. Không có gì được chuyển đổi trước khi được đánh giá.


var1 == var2

Khi sử dụng ==để kiểm tra bình đẳng JavaScript, một số chuyển đổi thú vị sẽ diễn ra.

Đạo đức của câu chuyện:

Sử dụng ===trừ khi bạn hiểu đầy đủ về các chuyển đổi diễn ra với ==.

627
Philippe Leybaert 2009-06-06 09:11.

Trong các câu trả lời ở đây, tôi không đọc bất cứ điều gì về nghĩa bình đẳng . Một số người sẽ nói điều đó ===có nghĩa là ngang nhau và cùng loại , nhưng điều đó không thực sự đúng. Nó thực sự có nghĩa là cả hai toán hạng đều tham chiếu đến cùng một đối tượng , hoặc trong trường hợp các kiểu giá trị, có cùng giá trị .

Vì vậy, hãy lấy đoạn mã sau:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Ở đây cũng vậy:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Hoặc thậm chí:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Hành vi này không phải lúc nào cũng rõ ràng. Câu chuyện còn nhiều điều hơn là bình đẳng và cùng loại.

Quy tắc là:

Đối với kiểu giá trị (số):
a === b trả về true nếuabcó cùng giá trị và cùng kiểu

Đối với các kiểu tham chiếu:
a === b trả về true nếuabtham chiếu cùng một đối tượng

Đối với chuỗi:
a === b trả về true nếuablà cả hai chuỗi và chứa các ký tự giống hệt nhau


Chuỗi: trường hợp đặc biệt ...

Các chuỗi không phải là kiểu giá trị, nhưng trong Javascript chúng hoạt động giống như kiểu giá trị, vì vậy chúng sẽ "bằng nhau" khi các ký tự trong chuỗi giống nhau và khi chúng có cùng độ dài (như được giải thích trong quy tắc thứ ba)

Bây giờ nó trở nên thú vị:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

Nhưng làm thế nào về điều này ?:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Tôi nghĩ rằng các chuỗi hoạt động giống như các loại giá trị? À, tùy bạn hỏi ai ... Trong trường hợp này a và b không cùng loại. alà loại Object, trong khi blà loại string. Chỉ cần nhớ rằng việc tạo một đối tượng chuỗi bằng cách sử dụng hàm Stringtạo sẽ tạo ra một thứ gì đó có kiểu Objecthoạt động như một chuỗi hầu hết thời gian .

274
nalply 2009-11-29 08:18.

Hãy để tôi thêm lời khuyên này:

Nếu nghi ngờ, hãy đọc thông số kỹ thuật !

ECMA-262 là đặc điểm kỹ thuật cho ngôn ngữ kịch bản mà JavaScript là phương ngữ. Tất nhiên trong thực tế, điều quan trọng hơn là cách các trình duyệt quan trọng nhất hoạt động hơn là một định nghĩa bí truyền về cách một thứ gì đó được cho là được xử lý. Nhưng sẽ rất hữu ích khi hiểu tại sao mới String ("a")! == "a" .

Vui lòng cho tôi biết cách đọc thông số kỹ thuật để làm rõ câu hỏi này. Tôi thấy rằng trong chủ đề rất cũ này không ai có câu trả lời cho hiệu ứng rất kỳ lạ. Vì vậy, nếu bạn có thể đọc một thông số kỹ thuật, điều này sẽ giúp bạn rất nhiều trong nghề nghiệp của mình. Đó là một kỹ năng có được. Vì vậy, chúng ta hãy tiếp tục.

Tìm kiếm tệp PDF cho === đưa tôi đến trang 56 của thông số kỹ thuật: 11.9.4. Toán tử công bằng nghiêm ngặt (===) và sau khi tìm hiểu về toán tử cụ thể, tôi thấy:

11.9.6 Thuật toán so sánh bình đẳng nghiêm ngặt
Phép so sánh x === y, trong đó x và y là các giá trị, tạo ra true hoặc false . So sánh như vậy được thực hiện như sau:
  1. Nếu Kiểu (x) khác với Kiểu (y), trả về false .
  2. Nếu Kiểu (x) là Không xác định, trả về true .
  3. Nếu Kiểu (x) là Null, trả về true .
  4. Nếu Loại (x) không phải là Số, hãy chuyển sang bước 11.
  5. Nếu x là NaN , trả về false .
  6. Nếu y là NaN , trả về false .
  7. Nếu x là cùng một giá trị số với y, trả về true .
  8. Nếu x là +0 và y là −0, trả về true .
  9. Nếu x là −0 và y là +0, trả về true .
  10. Trả về false .
  11. Nếu Kiểu (x) là Chuỗi, thì trả về true nếu x và y là chính xác cùng một dãy ký tự (cùng độ dài và các ký tự giống nhau ở các vị trí tương ứng); nếu không, trả về false .
  12. Nếu Kiểu (x) là Boolean, trả về true nếu x và y đều đúng hoặc cả hai sai ; nếu không, trả về false .
  13. Trả về true nếu x và y tham chiếu đến cùng một đối tượng hoặc nếu chúng tham chiếu đến các đối tượng được nối với nhau (xem 13.1.2). Nếu không, trả về false .

Điều thú vị là bước 11. Đúng, các chuỗi được coi là các kiểu giá trị. Nhưng điều này không giải thích tại sao mới String ("a")! == "a" . Chúng tôi có một trình duyệt không phù hợp với ECMA-262?

Không quá nhanh!

Hãy kiểm tra các loại toán hạng. Hãy thử nó cho chính mình bằng cách gói chúng trong typeof () . Tôi thấy rằng String mới ("a") là một đối tượng và bước 1 được sử dụng: trả về false nếu các kiểu khác nhau.

If you wonder why new String("a") does not return a string, how about some exercise reading a specification? Have fun!


Aidiakapi wrote this in a comment below:

From the specification

11.2.2 The new Operator:

If Type(constructor) is not Object, throw a TypeError exception.

With other words, if String wouldn't be of type Object it couldn't be used with the new operator.

new always returns an Object, even for String constructors, too. And alas! The value semantics for strings (see step 11) is lost.

And this finally means: new String("a") !== "a".

106
Simon Scarfe 2008-12-26 01:17.

I tested this in Firefox with Firebug using code like this:

console.time("testEquality");
var n = 0;
while (true) {
  n++;
  if (n == 100000)
    break;
}
console.timeEnd("testEquality");

and

console.time("testTypeEquality");
var n = 0;
while (true) {
  n++;
  if (n === 100000)
    break;
}
console.timeEnd("testTypeEquality");

My results (tested five times each and averaged):

==: 115.2
===: 114.4

So I'd say that the miniscule difference (this is over 100000 iterations, remember) is negligible. Performance isn't a reason to do ===. Type safety (well, as safe as you're going to get in JavaScript), and code quality is.

103
Shiki 2010-05-13 02:58.

In PHP and JavaScript, it is a strict equality operator. Which means, it will compare both type and values.

99
Dimitar 2010-05-13 02:58.

In JavaScript it means of the same value and type.

For example,

4 == "4" // will return true

but

4 === "4" // will return false 
90
Doctor Jones 2008-12-12 04:58.

The === operator is called a strict comparison operator, it does differ from the == operator.

Lets take 2 vars a and b.

For "a == b" to evaluate to true a and b need to be the same value.

In the case of "a === b" a and b must be the same value and also the same type for it to evaluate to true.

Take the following example

var a = 1;
var b = "1";

if (a == b) //evaluates to true as a and b are both 1
{
    alert("a == b");
}

if (a === b) //evaluates to false as a is not the same type as b
{
    alert("a === b");
}

In summary; using the == operator might evaluate to true in situations where you do not want it to so using the === operator would be safer.

In the 90% usage scenario it won't matter which one you use, but it is handy to know the difference when you get some unexpected behaviour one day.

87
Luis Perez 2016-08-10 06:50.

Why == is so unpredictable?

What do you get when you compare an empty string "" with the number zero 0?

true

Yep, that's right according to == an empty string and the number zero are the same time.

And it doesn't end there, here's another one:

'0' == false // true

Things get really weird with arrays.

[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true

Then weirder with strings

[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!

It get's worse:

When is equal not equal?

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!

Let me say that again:

(A == B) && (B == C) // true
(A == C) // **FALSE**

And this is just the crazy stuff you get with primitives.

It's a whole new level of crazy when you use == with objects.

At this point your probably wondering...

Why does this happen?

Well it's because unlike "triple equals" (===) which just checks if two values are the same.

== does a whole bunch of other stuff.

It has special handling for functions, special handling for nulls, undefined, strings, you name it.

It get's pretty wacky.

In fact, if you tried to write a function that does what == does it would look something like this:

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();
}

So what does this mean?

It means == is complicated.

Because it's complicated it's hard to know what's going to happen when you use it.

Which means you could end up with bugs.

So the moral of the story is...

Make your life less complicated.

Use === instead of ==.

The End.

82
vsync 2010-05-13 02:58.

=== checks same sides are equal in type as well as value.


Example:

'1' === 1 // will return "false" because `string` is not a `number`

Common example:

0 == ''  // will be "true", but it's very common to want this check to be "false"

Another common example:

null == undefined // returns "true", but in most cases a distinction is necessary

Many times an untyped check would be handy because you do not care if the value is either undefined, null, 0 or ""

73
Samar Panda 2015-09-06 03:53.

Javascript execution flow diagram for strict equality / Comparison '==='

Javascript execution flow diagram for non strict equality / comparison '=='

55
Noname 2013-07-03 18:08.

JavaScript === vs == .

0==false   // true
0===false  // false, because they are of a different type
1=="1"     // true, auto type coercion
1==="1"    // false, because they are of a different type
54
Pop Catalin 2010-05-13 02:59.

It means equality without type coercion type coercion means JavaScript do not automatically convert any other data types to string data types

0==false   // true,although they are different types

0===false  // false,as they are different types

2=='2'    //true,different types,one is string and another is integer but 
            javaScript convert 2 to string by using == operator 

2==='2'  //false because by using === operator ,javaScript do not convert 
           integer to string 

2===2   //true because both have same value and same types 
48
Constantin 2008-12-17 04:29.

In a typical script there will be no performance difference. More important may be the fact that thousand "===" is 1 KB heavier than thousand "==" :) JavaScript profilers can tell you if there is a performance difference in your case.

But personally I would do what JSLint suggests. This recommendation is there not because of performance issues, but because type coercion means ('\t\r\n' == 0) is true.

46
CuongHuyTo 2011-09-17 04:25.

The equal comparison operator == is confusing and should be avoided.

If you HAVE TO live with it, then remember the following 3 things:

  1. It is not transitive: (a == b) and (b == c) does not lead to (a == c)
  2. It's mutually exclusive to its negation: (a == b) and (a != b) always hold opposite Boolean values, with all a and b.
  3. In case of doubt, learn by heart the following truth table:

EQUAL OPERATOR TRUTH TABLE IN JAVASCRIPT

  • Each row in the table is a set of 3 mutually "equal" values, meaning that any 2 values among them are equal using the equal == sign*

** STRANGE: note that any two values on the first column are not equal in that sense.**

''       == 0 == false   // Any two values among these 3 ones are equal with the == operator
'0'      == 0 == false   // Also a set of 3 equal values, note that only 0 and false are repeated
'\t'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\r'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\n'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\t\r\n' == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

null == undefined  // These two "default" values are not-equal to any of the listed values above
NaN                // NaN is not equal to any thing, even to itself.
40
Sean 2008-12-12 04:44.

There is unlikely to be any performance difference between the two operations in your usage. There is no type-conversion to be done because both parameters are already the same type. Both operations will have a type comparison followed by a value comparison.

38
Aniket Thakur 2014-11-14 20:02.

Yes! It does matter.

=== operator in javascript checks value as well as type where as == operator just checks the value (does type conversion if required).

You can easily test it. Paste following code in an HTML file and open it in browser

<script>

function onPageLoad()
{
    var x = "5";
    var y = 5;
    alert(x === 5);
};

</script>

</head>

<body onload='onPageLoad();'>

You will get 'false' in alert. Now modify the onPageLoad() method to alert(x == 5); you will get true.

33
Niraj CHoubey 2010-05-13 03:03.

=== operator checks the values as well as the types of the variables for equality.

== operator just checks the value of the variables for equality.

32
Daniel 2010-05-13 03:19.

It's a strict check test.

It's a good thing especially if you're checking between 0 and false and null.

For example, if you have:

$a = 0;

Then:

$a==0; 
$a==NULL; $a==false;

All returns true and you may not want this. Let's suppose you have a function that can return the 0th index of an array or false on failure. If you check with "==" false, you can get a confusing result.

So with the same thing as above, but a strict test:

$a = 0; $a===0; // returns true
$a===NULL; // returns false $a===false; // returns false
31
ashes 2012-06-05 21:53.

JSLint sometimes gives you unrealistic reasons to modify stuff. === has exactly the same performance as == if the types are already the same.

It is faster only when the types are not the same, in which case it does not try to convert types but directly returns a false.

So, IMHO, JSLint maybe used to write new code, but useless over-optimizing should be avoided at all costs.

Meaning, there is no reason to change == to === in a check like if (a == 'test') when you know it for a fact that a can only be a String.

Modifying a lot of code that way wastes developers' and reviewers' time and achieves nothing.

30
Amit 2015-03-20 19:05.

Simply

== means comparison between operands with type conversion

&

=== means comparison between operands without type conversion

Type conversion in javaScript means javaScript automatically convert any other data types to string data types.

For example:

123=='123'   //will return true, because JS convert integer 123 to string '123'
             //as we used '==' operator 

123==='123' //will return false, because JS do not convert integer 123 to string 
            //'123' as we used '===' operator 
26
Vikas 2015-05-15 04:45.

A simple example is

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.
25
mar10 2013-04-28 04:15.

As a rule of thumb, I would generally use === instead of == (and !== instead of !=).

Reasons are explained in in the answers above and also Douglas Crockford is pretty clear about it (JavaScript: The Good Parts).

However there is one single exception: == null is an efficient way to check for 'is null or undefined':

if( value == null ){
    // value is either null or undefined
}

For example jQuery 1.9.1 uses this pattern 43 times, and the JSHint syntax checker even provides the eqnull relaxing option for this reason.

From the jQuery style guide:

Strict equality checks (===) should be used in favor of ==. The only exception is when checking for undefined and null by way of null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;
25
Harry He 2013-09-09 22:31.

The top 2 answers both mentioned == means equality and === means identity. Unfortunately, this statement is incorrect.

If both operands of == are objects, then they are compared to see if they are the same object. If both operands point to the same object, then the equal operator returns true. Otherwise, the two are not equal.

var a = [1, 2, 3];  
var b = [1, 2, 3];  
console.log(a == b)  // false  
console.log(a === b) // false  

In the code above, both == and === get false because a and b are not the same objects.

That's to say: if both operands of == are objects, == behaves same as ===, which also means identity. The essential difference of this two operators is about type conversion. == has conversion before it checks equality, but === does not.

22
Thomas Hansen 2008-12-30 01:54.

The problem is that you might easily get into trouble since JavaScript have a lot of implicit conversions meaning...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

Which pretty soon becomes a problem. The best sample of why implicit conversion is "evil" can be taken from this code in MFC / C++ which actually will compile due to an implicit conversion from CString to HANDLE which is a pointer typedef type...

CString x;
delete x;

Which obviously during runtime does very undefined things...

Google for implicit conversions in C++ and STL to get some of the arguments against it...

22
Paul Butcher 2010-05-13 02:59.

From the core javascript reference

=== Returns true if the operands are strictly equal (see above) with no type conversion.

21
user2601995 2013-10-03 11:54.

Equality comparison:

Operator ==

Returns true, when both operands are equal. The operands are converted to the same type before being compared.

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

Equality and type comparison:

Operator ===

Returns true if both operands are equal and of the same type. It's generally better and safer if you compare this way, because there's no behind-the-scenes type conversions.

>>> 1 === '1'
false
>>> 1 === 1
true
20
Christian Hagelid 2014-03-27 14:18.

Here is a handy comparison table that shows the conversions that happen and the differences between == and ===.

As the conclusion states:

"Use three equals unless you fully understand the conversions that take place for two-equals."

http://dorey.github.io/JavaScript-Equality-Table/

20
vivek_nk 2014-04-14 23:28.

null and undefined are nothingness, that is,

var a;
var b = null;

Here a and b do not have values. Whereas, 0, false and '' are all values. One thing common beween all these are that they are all falsy values, which means they all satisfy falsy conditions.

So, the 0, false and '' together form a sub-group. And on other hand, null & undefined form the second sub-group. Check the comparisons in the below image. null and undefined would equal. The other three would equal to each other. But, they all are treated as falsy conditions in JavaScript.

This is same as any object (like {}, arrays, etc.), non-empty string & Boolean true are all truthy conditions. But, they are all not equal.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Tận dụng lợi thế của việc bán hàng nhân Ngày của Cha này

Tận dụng lợi thế của việc bán hàng nhân Ngày của Cha này

Màn hình Samsung Galaxy S9 Plus. Chủ nhật này là Ngày của Cha⁠ — trong trường hợp nó khiến bạn suy nghĩ — và thay vì mua cho anh ấy một chiếc cà vạt trong năm nay, có lẽ đã đến lúc bạn mua cho anh ấy thứ mà anh ấy sẽ thực sự sử dụng.

Assassin's Creed Snuck Into Monster Hunter: World Last Night

Assassin's Creed Snuck Into Monster Hunter: World Last Night

Monster Hunter: World yêu thích các sự kiện chéo. Dù có nghĩa là hóa trang thành Dante của Devil May Cry, giả dạng Horizon: Zero Dawn's Aloy, hay chiến đấu với quái vật Final Fantasy, các nhiệm vụ sự kiện khác nhau của Thế giới được nâng cấp tự do so với các trò chơi khác.

Ava DuVernay Có Quà Tặng Ngày Của Mẹ cho Tất Cả Chúng Ta: Nếp Nhăn Thời Gian Sẽ Được Viết Lại Vào Cuối Tuần Ngày Của Mẹ!

Ava DuVernay Có Quà Tặng Ngày Của Mẹ cho Tất Cả Chúng Ta: Nếp Nhăn Thời Gian Sẽ Được Viết Lại Vào Cuối Tuần Ngày Của Mẹ!

Storm Reid, Oprah Winfrey, Mindy Kaling, Reese Witherspoon và Ava DuVernay tại buổi chiếu đặc biệt của A Wrinkle in Time tại Nhà hát Walter Reade ở Thành phố New York vào ngày 7 tháng 3 năm 2018 “Ava rất mong được nói chuyện với bạn,” một trong những người của Array dư luận viên nói qua điện thoại. (Array là tập thể phân phối, nghệ thuật và vận động chính sách của Ava DuVernay tập trung vào các bộ phim của người da màu và phụ nữ.

Nhiệm vụ bất khả thi 5 sẽ khôi phục niềm tin của bạn trong phim hành động Tentpole

Nhiệm vụ bất khả thi 5 sẽ khôi phục niềm tin của bạn trong phim hành động Tentpole

Mission Impossible: Rogue Nation bắt đầu ở một cấp độ khác. Theo nghĩa đen.

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

McCain, người đang làm việc cho một album mới, lần đầu tiên bước vào vòng kết nối vào tối thứ Sáu ở Nashville

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Tôi viết như thế nào

Tôi viết như thế nào

Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Language