thắc mắc Khó hiểu về khối if trong ngôn ngữ javascript

JavaScript:
var x = 'voz'

if (x) {
    console.log('dòng 1!')
}

if (x == true) {
    console.log('dòng 2!')
}

Tại sao kết quả chỉ in ra 'dòng 1!', còn không in ra 'dòng 2!', rõ ràng hai cách viết này là như nhau, vì mình nghĩ là cái dấu ngoặc đơn của câu lệnh if, bên trong kiểm tra xem là true hay là false, thì cái đầu là true, tức là x== true (#) rồi mình đem cái suy luận (#) này vào khối if thứ 2 thì sao cái thứ 2 lại là false nhỉ, mình có thử kiểm tra
JavaScript:
console.log(x == true)
thì đúng là kết quả trả về false. Vậy thì cái

JavaScript:
if (x) {
 
}

có bản chất như nào vậy mn:sad:
 
Khổ thân anh linh vật, nghĩ mãi mới ra topic để đăng hả. Mấy hôm nay ko được tạo topic nhảm chắc ngứa ngáy lắm
qZV215Z.png


Btw, trong if (x), là vì ko có điều kiện so sánh nào nên, js sẽ tự động convert x ra boolean. Anh gõ
Mã:
Boolean('voz')
vào trình duyệt là thấy.

Và tại sao Boolean('voz') lại bằng true thì là do quy định nó như vậy, cứ thế mà follow thôi.
 
Khổ thân anh linh vật, nghĩ mãi mới ra topic để đăng hả. Mấy hôm nay ko được tạo topic nhảm chắc ngứa ngáy lắm
qZV215Z.png


Btw, trong if (x), là vì ko có điều kiện so sánh nào nên, js sẽ tự động convert x ra boolean. Anh gõ
Mã:
Boolean('voz')
vào trình duyệt là thấy.

Và tại sao Boolean('voz') lại bằng true thì là do quy định nó như vậy, cứ thế mà follow thôi.
nhưng như này làm sao có đủ thông tin mà follow vậy, fen nói mỗi từ 'voz' thui mà, còn các cái khác, tui mới học được ở trong Js có nhiều kiểu lắm
primitive: string, number, boolean
object: array, function
undefined
null

thì fen phải chỉ rõ chứ sao tui follow được, tui thử vài cái string rồi thì thấy đúng là nó sang true trong if(x) @@

à mà tui hỏi cái

var x = {
value: 100
}

cái này là dict trong python, thì trong javascript nó gọi là object và được xếp vào mục object à, ở trên tui chưa xêp cái này vào vì thấy 2 chữ object trùng quá không biết có đúng không
 
nhưng như này làm sao có đủ thông tin mà follow vậy, fen nói mỗi từ 'voz' thui mà, còn các cái khác, tui mới học được ở trong Js có nhiều kiểu lắm
troll ghẻ hả, ngoài câu trả lời của tui thì còn 2 câu trả lời nữa cũng nói rõ rồi đó cha nội... phải biết tập hợp thông tin chứ, cứ cắt cúp vào một reply thì làm ăn gì
nmvIYHe.png
 
Ngôn ngữ nó đặt tả vậy:
In JavaScript, a truthy value is a value that is considered true when encountered in a Boolean context. All values are truthy unless they are defined as falsy (i.e., except for false, 0, -0, 0n, "", null, undefined, and NaN).
à vậy thì

JavaScript:
console.log(Boolean(false))
console.log(Boolean(0))
console.log(Boolean(-0))
console.log(Boolean(0n))
console.log(Boolean(""))
console.log(Boolean(null))
console.log(Boolean(undefined))
console.log(Boolean(NaN))

Như vậy là tất cả các cái này là ra false, còn các cái khác đều ra true nhỉ, như này thì dễ hiểu hơn. mà cái kí tự 0n là gì gì???


xong 0nNaN thì xếp vào primitive hay object vậy fen :sad:
 
giải thích cho trường hợp 2 cho fen hiểu

vậy lên x==true sẽ được hiểu là 'voz' == '1', hiển nhiên làkhông bằng nhau rồi
nhưng nếu x=1 hoặc x='1' thì sẽ là true
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality
Ví dụ mà x = '1' rồi tui console.log(x==true)

như fen nói ở kia, trong cái x==true thì toán hạng bên phải true là dạng Boolean thì convert thành số 1, tức là '1' == 1. Đến đoạn này thì convert tiếp như nào fen, thấy vẫn là 2 kiểu khác nhau mà :sweat:

à kia chỗ in đậm fen convert hình như nhầm, đáng ra là 'voz'=1
 
Ví dụ mà x = '1' rồi tui console.log(x==true)

như fen nói ở kia, trong cái x==true thì toán hạng bên phải true là dạng Boolean thì convert thành số 1, tức là '1' == 1. Đến đoạn này thì convert tiếp như nào fen, thấy vẫn là 2 kiểu khác nhau mà :sweat:

à kia chỗ in đậm fen convert hình như nhầm, đáng ra là 'voz'=1
When comparing a string with a number, JavaScript will convert the string to a number when doing the comparison. An empty string converts to 0. A non-numeric string converts to NaN which is always false.
nên '1'==1 sẽ thành 1==1 hiển nhiên là true rồi
 
When comparing a string with a number, JavaScript will convert the string to a number when doing the comparison. An empty string converts to 0. A non-numeric string converts to NaN which is always false.
Loằng ngoằng với đau đầu quá, để tui ngẫm lại

ban đầu là so sánh với một cái là Boolean (quy tắc 1)

'voz' == true

thì một bên true kia sẽ biến thành số 1

'voz'==1 (bước 1)

sau đó thành so sánh stringnumber thì string không phải dạng số sẽ chuyển thành NaN:

NaN==1 (bước 2)

Đến chỗ này thì tui lại chưa hiểu lắm câu cuối : NaN which is always false.

chả lẽ lại biến NaN thành false:

false ==1 rồi áp dụng (quy tắc 1):

+0==1

rồi mới ra false. Hay là ở (bước 2) đã khẳng định được rồi, tui nghĩ là chưa vì nó NaN với 1 đã cùng kiểu đâu nhỉ:too_sad:


@OneAboveAll vậy các quy tắc này mình phải học thuộc lòng hết trong mozilla à chứ không có cách nào nhớ được hả fen, như kiểu number và string thì phải convert string sang number trước. À hình như tất cả sang hết kiểu number nhỉ, (quy tắc 1) cũng là true sang 1 và false sang +0 mà

 
nan luôn luôn false, nó không bằng cái gì cả kể cả chính nó NaN==NaN cũng false mà
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN
Nhưng câu này không đúng và tối nghĩa quá, NaN là giá trị đại diện cho "Không phải Số", chứ nó có phải là Boolean đâu mà nói nó luôn là false vậy fen :too_sad:, các sự so sánh 2 dấu bằng và 3 dấu bằng thì là sự so sánh mới ra true false chứ đâu phải nan luôn luôn false

@OneAboveAll Nhưng tui có thể sử dụng câu đầu tiên của trang web ý: NaN compares unequal (via ==, !=, ===, and !==) to any other value -- including to another NaN
nếu tự công nhận và không thèm quan tâm đến các convert thêm nữa thì ok
 
2021-05-23_18-24.png


Tui đang test thử cái dòng cuối này, với trường hợp 2 kiểu khác nhau

JavaScript:
cat = {
    weight: 100
}
console.log(typeof cat) //0

a = cat.toString()
b = cat.valueOf()


console.log(cat == a) //1
console.log(a) //2
console.log(cat == "[object Object]") //3

console.log(cat == b) //4
console.log(b) //5
console.log(cat == "{weight: 100}") //6
console.log(cat == {weight: 100}) //7
console.log(typeof b) //8
Và được out put là
Mã:
object //0
true //1
[object Object] //2
true //3
true //4
{ weight: 100 } //5
false //6
false //7
object //8

Fen xem cái số 6 và 7 khá mâu thuẫn, sao nó vẫn ra false được nhỉ?? :pudency::too_sad:

à bổ sung chút, cái chỗ số 6 tui nghĩ ra false là do trong Javascript không thể so sánh 2 object vì nó sẽ convert sang con trỏ.
Nhưng nếu sai ở đấy thì số b đang nằm ở dạng nào, object ko phải, string cũng không phải mà rõ ràng số 5 console log ra { weight: 100 } //5
 
Sửa lần cuối:
Ngôn ngữ nó đặt tả vậy:
In JavaScript, a truthy value is a value that is considered true when encountered in a Boolean context. All values are truthy unless they are defined as falsy (i.e., except for false, 0, -0, 0n, "", null, undefined, and NaN).
Viết if (x) là giá trị mặc định là x == true rồi đó. Kiểu viết khác ý mà
sai rùi fen, fen bảo cách viết khác thì code thử if("0") , thành "0" == true??? nhưng nó vẫn chạy ngon đấy fen, phải như ông trên mới là chuẩn nhé fen, bỏ cái suy nghĩ cách viết khác được rùi
 

Thống kê chủ đề

Ngày tạo
Chief Technology Officer,
Người trả lời cuối
Hàn Quá Nhanh,
Trả lời
70
Lượt xem
5.179
Quay lại
Lên đầu trang