cuốn sách gpt4 ai đã làm

Javascript 真/假函数

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 22:32:31 29 4
mua khóa gpt4 Nike

Tôi mới làm quen với JavaScript và tôi vừa phát hiện ra hành vi kỳ lạ mà tôi không thể hiểu được:

var magicVar = Math.sin;
magicVar == true; // nó trả về sai
magicVar === đúng; // nó trả về sai
if (magicVar) console.log("???"); // nó in ra "???"

Chuyện gì đã xảy ra thế?

Cảm ơn.

câu trả lời hay nhất

var magicVar = Math.sin;

Từ đây trở đi,ma thuậtVar Đúng Math.sin Một tham chiếu đến một hàm, thực chất là một Object(Xem MDN Chức năng )

Hàm tạo Hàm tạo một đối tượng Hàm mới. Trong JavaScript, mọi hàm thực sự là một đối tượng Hàm.


magicVar == true; // nó trả về sai 

Đây là SAI:từ So sánh bình đẳng và giống nhauTrên MDN, nếu bạn sử dụng == so sánh toán tử Object Các toán hạng thuộc loại Boolean toán hạng thuộc loại bạn luôn nhận được SAI(Kiểm traSử dụng == sự bình đẳng lỏng lẻo của bảng).

[Chỉnh sửa] Như Bergi đã chỉ ra trong phần nhận xét, trong một số trường hợp, bạn thực sự có thể có các đối tượng được so sánh một cách lỏng lẻo với các giá trị bool trả về giá trị đúng.

Những gì thực sự xảy ra đằng sau hậu trường là ES6 §7.2.12 Thuật toán so sánh được mô tả trong . Đã áp dụng.

7.2.12 So sánh bình đẳng trừu tượng

Phép so sánh x == y, trong đó x và y là các giá trị, cho kết quả đúng hoặc sai. Việc so sánh như vậy được thực hiện như sau:

  1. Trả về nếu đột ngột(x).
  2. Trả về nếu đột ngột (y).
  3. Nếu Loại(x) giống với Loại(y), thì Trả về kết quả thực hiện So sánh đẳng thức nghiêm ngặt x === y.
  4. Nếu x là null và y không được xác định, trả về true.
  5. Nếu x không được xác định và y là null, trả về true.
  6. Nếu Loại(x) là Số và Loại(y) là Chuỗi, trả về kết quả so sánh x == ToNumber(y).
  7. Nếu Loại(x) là Chuỗi và Loại(y) là Số, trả về kết quả so sánh ToNumber(x) == y.
  8. Nếu Loại(x) là Boolean, trả về kết quả so sánh ToNumber(x) == y.
  9. Nếu Loại(y) là Boolean, trả về kết quả so sánh x == ToNumber(y).
  10. Nếu Loại(x) là Chuỗi, Số hoặc Ký hiệu và Loại(y) là Đối tượng thì trả về kết quả so sánh x == ToPrimitive(y).
  11. Nếu Loại(x) là Đối tượng và Loại(y) là Chuỗi, Số hoặc Ký hiệu thì trả về kết quả so sánh ToPrimitive(x) == y.
  12. Trả về sai.

Điều gì xảy ra trong trường hợp của bạn:

magicVar == đúng
magicVar == Number(true) // Bước 9. x == ToNumber(y).
phép thuậtVar == 1
toPrimitive(magicVar) == 1 // Bước 11. ToPrimitive(x) == y.
magicVar.toString() == 1
"hàm sin() { [mã gốc] }" == 1
Number("function sin() { [mã gốc] }") == 1 // Bước 7. ToNumber(x) == y.
NaN === 1 // Bước 3. x === y.
SAI

Nhưng ví dụ so sánh với một đối tượng như thế này:

{
valueOf: hàm(){
return 1;
}
}

Bạn sẽ nhận được:

true == {valueOf(){return 1;}} // nó trả về true

magicVar === đúng; // nó trả về sai

Đây thường là SAI, các loại toán hạng là khác nhau,=== Toán tử kiểm tra xem các toán hạng có cùng loại và giá trị hay không.


if (magicVar) console.log("???"); // nó in ra "???"

Như tất cả các câu trả lời khác nói,ma thuậtVar 是在 Boolean bối cảnh và buộc phải ĐÚNG VẬY

Về các hàm đúng/sai của Javascript, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/31606348/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress