Trong JavaScript, trong trường hợp nào các câu sau đây sẽ không bằng nhau về mặt logic?JavaScript nếu (x) so với if (x == true)
if(x){}
và
if(x==true){}
Cảm ơn
Trong JavaScript, trong trường hợp nào các câu sau đây sẽ không bằng nhau về mặt logic?JavaScript nếu (x) so với if (x == true)
if(x){}
và
if(x==true){}
Cảm ơn
Họ không phải là ở tất cả như nhau.
if (x)
kiểm tra nếu x
là Truthy nơi như kiểm tra sau này nếu giá trị Boolean của x
là true
.
Ví dụ,
var x = {};
if (x) {
console.log("Truthy");
}
if (x == true) {
console.log("Equal to true");
}
Không chỉ một đối tượng, bất kỳ chuỗi (trừ một chuỗi rỗng), bất kỳ số (trừ 0
(vì 0
là Falsy) và 1
) sẽ được coi là Truthy, nhưng họ sẽ không bằng true.
Theo ECMA 5.1 Standards, trong if (x)
, truthiness của x
sẽ được quyết định, theo bảng sau
+-----------------------------------------------------------------------+
| Argument Type | Result |
|:--------------|------------------------------------------------------:|
| Undefined | false |
|---------------|-------------------------------------------------------|
| Null | false |
|---------------|-------------------------------------------------------|
| Boolean | The result equals the input argument (no conversion). |
|---------------|-------------------------------------------------------|
| Number | The result is false if the argument is +0, −0, or NaN;|
| | otherwise the result is true. |
|---------------|-------------------------------------------------------|
| String | The result is false if the argument is the empty |
| | String (its length is zero); otherwise the result is |
| | true. |
|---------------|-------------------------------------------------------|
| Object | true |
+-----------------------------------------------------------------------+
Lưu ý: Dòng cuối cùng object
, trong đó bao gồm cả các đối tượng và Mảng.
Nhưng trong trường hợp sau, khi mỗi The Abstract Equality Comparison Algorithm,
If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
giá trị của x
sẽ được chuyển đổi thành số và con số đó sẽ được đối chiếu true
.
Lưu ý:
Trong JavaScript, true
là 1
và false
là 0
.
console.log(1 == true);
# true
console.log(0 == false);
# true
Có nghĩa là chuỗi sau có thể sử dụng chuỗi, int khác của boolean? –
'var x = 'a'; if (x) alert ("X"); if (x == true) alert ("X true"); 'Điều này sẽ chỉ cảnh báo' "X" 'và không' "X true" ' – peirix
1 được coi là trung thực (từ ECMA 5.1: Kết quả là false nếu đối số là +0, −0 hoặc NaN; nếu không kết quả là đúng) –
Một số trường hợp được đánh giá sai ở dạng đầu tiên, chẳng hạn như chuỗi rỗng, 0, không xác định, null.
Nếu bạn muốn được ngữ nghĩa về nó nhiều hơn một chút, hãy thử các bang bang ở phía trước của biểu thức:
if(!!x){...}
này sẽ chuyển đổi các kết quả biểu thức để một truthy đại diện cho cùng một ngữ nghĩa. Đây là gần gũi hơn với một chất tương tự để biểu hiện bạn mô tả (x == true)
Cũng lưu ý rằng ==
là comparions giá trị với kiểu ép buộc, ví dụ: "3" == 3
, trong khi ===
khẳng định gõ bằng quá.
Vì vậy, chúng không giống nhau, nhưng thường đại diện cho cùng một thử nghiệm, nhờ vào ngữ nghĩa của ngôn ngữ và !!bạn có thể sử dụng
Cảm ơn. "if (!! x)" luôn bằng "if (x)" không? – TheZver
Không, hãy tưởng tượng trường hợp này nếu (!! "hello") và nếu ("hello" == true), biểu thức đầu tiên sẽ được đánh giá là true vì "hello" không phải là chuỗi rỗng, undefined hoặc null vv. sự thật, là sự thật. Trong khi biểu thức thứ hai sẽ sai, bởi vì "hello" không thể bị ép buộc bằng giá trị đúng. http://jsfiddle.net/CEtN5/ – ComethTheNerd
Xin lỗi tôi đã nhầm lẫn trong câu hỏi. Tôi có nghĩa là so sánh với nếu (x) – TheZver
Thử 'x = 'test'', làm ví dụ. – VisioN
'x = ''', 'x = []', 'x = '\ n'',' x =' false'' ... – nderscore