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

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
nó luôn false là khi nó so sánh với mọi giá trị khác thì đều không bằng và trả về false, fen hiểu thế cho đơn giản đi
và trả phải học thuộc mấy cái dấy làm gì đâu fen, cần thì gg search thôi :D thực tế khi làm cũng ít có mấy case điên rồ này lắm, mấy cái này đa phần câu hỏi đánh đố nhau ấy mà
 
Viết if (x) là giá trị mặc định là x == true rồi đó. Kiểu viết khác ý mà
giải thích sai. if (x) thì nếu x là các giá trị truthy thì các câu lệnh trong block if sẽ được thực thi.
nếu viết v1 == true thì nó sẽ khác. lúc này sẽ áp dụng theo quy tắc convert như link MDN mọi người đã gửi ở trên đã đưa (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality)
 
Xem tệp đính kèm 561606

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


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
có ai giải thích được đoạn này ko @tuantiepnb09 @OneAboveAll
 
à 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:
0n là số 0 trong bigInt. Tương tự số 0 của int thôi.

NaN thì hơi đặc biệt, nó là property đại diện cho một số ko hiển thị được. Nó thuộc Number.
 
có ai giải thích được đoạn này ko @tuantiepnb09 @OneAboveAll

- console.log(cat == "{weight: 100}") //6
khác kiểu nên nó convert cat => "[object Object]",
"[object Object]" == "{weight: 100}" => falses


- console.log(cat == {weight: 100})
cùng là object nên nó không convert mà so sánh địa chỉ,
cat == {weight: 100} => false
{weight: 100} == {weight: 100} => false

let b = cat;
b == cat => true
 
- console.log(cat == "{weight: 100}") //6
khác kiểu nên nó convert cat => "[object Object]",
"[object Object]" == "{weight: 100}" => falses


- console.log(cat == {weight: 100})
cùng là object nên nó không convert mà so sánh địa chỉ,
cat == {weight: 100} => false
{weight: 100} == {weight: 100} => false

let b = cat;
b == cat => true
nhưng mà
b = cat.valueOf()
thì cat == b => true

thì đang muốn hỏi chỗ b đang là dạng gì

- tui console.log(type of b) thì nó ra b là dạng object.

Nếu b là dạng object thì b và cat là cùng một dạng, vậy thì không phải convert, vậy thì nó chỉ bằng nhau khi mà cùng địa chỉ, tức là phải gán b=cat mới ra được true
nhưng ở đây lại ra kết quả true. Vậy hàm valueOf đang làm gì :too_sad:

Nếu không phải cùng một dạng thì tức là cat là [object Object], còn b là [??? Object]
 
javascript không định nghĩa trong việc so sánh 2 object với nhau, thím phải tự định nghĩa trong từng trường hợp cụ thể của mình.
Nếu muốn so sánh 2 object bằng nhau theo nghĩa đen, thì chuyển thành dạng string
Mã:
const cat = {
    weight: 100
}

if(JSON.stringify(cat) == JSON.stringify({ weight: 100 })) // true
2 biến nếu đều trỏ tới kiểu dữ liệu object thì sẽ compare theo reference. tức là kiếm tra xem 2 biến đó có trỏ tới cùng một vùng nhớ không. nên trong trường hợp hai object khác nhau thì không bao giờ bằng nhau, dù có dùng == hay ===. 2 biến kiểu object chỉ bằng nhau khi và chỉ khi chúng trỏ tới cùng một vùng nhớ.
so sánh 2 object mà dùng kiểu chuyển sang string thì có 2 vấn đề. có những property không thể convert sang được (function, non-enumerable https://developer.mozilla.org/en-US...eference/Global_Objects/Object/defineProperty). hoặc khi dính vào cấu trúc không thể serialize được (ví dụ: tree vòng tròn chẳng hạn).
 
nhưng mà
b = cat.valueOf()
thì cat == b => true

thì đang muốn hỏi chỗ b đang là dạng gì

- tui console.log(type of b) thì nó ra b là dạng object.

Nếu b là dạng object thì b và cat là cùng một dạng, vậy thì không phải convert, vậy thì nó chỉ bằng nhau khi mà cùng địa chỉ, tức là phải gán b=cat mới ra được true
nhưng ở đây lại ra kết quả true. Vậy hàm valueOf đang làm gì :too_sad:

Nếu không phải cùng một dạng thì tức là cat là [object Object], còn b là [??? Object]
class to nhất là class Object nó có định nghĩa sẵn một số method như valueOf, toString, ...
default thì valueOf sẽ return chính cái this. còn các class kế thừa thích thì override lại những cái trên.
trong trường hợp code ở trên
Mã:
b = cat.valueOf();

thì bản chất vẫn là b và cat cùng trỏ tới 1 vùng nhớ.

trường hợp compare:

Mã:
if(cat == {weight: 100}) {}
thì nó không bao giờ xảy ra, vì mỗi lần chạy đoạn kiểm tra sẽ tạo ra 1 object mới, khác hoàn toàn với cat

1621774713423.png
 
vậy mới nói từng trường hợp cụ thể, như object cat ở trên thì chuyển string là được rồi
việc so sánh string tui thấy nó không khả thi lắm với object

JavaScript:
cat = {

    weight: 100

}

dog = {

    weight: 200

}

console.log(cat.toString() == dog.toString())

ra true vì cả 2 đều cho ra [object Object] mà
 
việc so sánh string tui thấy nó không khả thi lắm với object

JavaScript:
cat = {

    weight: 100

}

dog = {

    weight: 200

}

console.log(cat.toString() == dog.toString())

ra true vì cả 2 đều cho ra [object Object] mà
Ý bác trên là sài JSON.stringify,
Mà cũng chưa đúng lắm cho trường hợp property nó khác vị trí, phải so từng property với nhau thì mới được
 
việc so sánh string tui thấy nó không khả thi lắm với object

JavaScript:
cat = {

    weight: 100

}

dog = {

    weight: 200

}

console.log(cat.toString() == dog.toString())

ra true vì cả 2 đều cho ra [object Object] mà
hiểu sai ý rồi: bên trên hướng đến dùng JSON.stringify để convert về string.
nhưng cách này thường thì không phải là cách toàn diện. hơn nữa câu trả lời của bạn kia khá mập mờ nên có thể khiến người khác hiểu nhầm. và có thể dùng cách đó cho rất nhiều trường hợp khác nhau mà không để ý đến những vấn đề sẽ gặp phải.
mình thì thích dùng lodash isEqual hơn cho mấy task vụ compare object như này.
 
bác này thấy quảng cáo khóa học của jonas mà quên bài rồi, trong bài truthy and falsy value ông j.s có nói hết những vấn đề này ấy

Sent from Xiaomi MI 8 Lite via nextVOZ
chắc chỉ quảng cáo thôi chứ chưa học =))). hầu như mấy cái này có trên MDN hết rồi. có học mà không thử nghiệm thì dễ quên lắm.
 
bác này thấy quảng cáo khóa học của jonas mà quên bài rồi, trong bài truthy and falsy value ông j.s có nói hết những vấn đề này ấy

Sent from Xiaomi MI 8 Lite via nextVOZ
học một, thậm chí là 2 3 lần nhớ không nổi đâu. Làm, gặp vấn đề rồi quay lại, học 1 lần nhớ hết có mà thiên tài.
 
riêng phần hoisting của arrow function và closure tôi học 2 lần, research đủ loại doc mà gặp lại vẫn ko nhận ra, cay vl, chắc do tiếp thu chậm

Sent from Xiaomi MI 8 Lite via nextVOZ
học đi học lại, không gì là dễ dàng cả. tài liệu bây giờ vô vàn tài liệu hay. nhiều cái còn miễn phí nên cứ chịu khó xào lại thì sẽ lên thôi.
ví dụ: You don't know JS, hay như ông này có rất nhiều sách hay mà free https://exploringjs.com/
 

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