- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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:
- Trả về nếu đột ngột(x).
- Trả về nếu đột ngột (y).
- 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.
- Nếu x là null và y không được xác định, trả về true.
- Nếu x không được xác định và y là null, trả về true.
- 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).
- 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.
- Nếu Loại(x) là Boolean, trả về kết quả so sánh ToNumber(x) == y.
- Nếu Loại(y) là Boolean, trả về kết quả so sánh x == ToNumber(y).
- 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).
- 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.
- 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/
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Why can't Python handle true/false values as I expect?
我是不是遗漏了什么或者这是 ruby 中的错误? a = %w(foo bar baz) a.include? "foo" # => true a.size == 3
从 Modelica 文档来看,注释 Evaluate 似乎只对参数有影响: https://build.openmodelica.org/Documentation/ModelicaReferenc
为了避免嵌套的 if 语句并提高可读性,我想创建一个switch(true){ ... } Coldfusion 中的声明。我在 php 中经常使用这个,但是当我在 Coldfusion 中尝试这个时
Xin chào, tôi đang cố gắng xử lý phản hồi ajax json, đây là mã của tôi thành công: function (j) { switch(true) { case (j.cho
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
这个问题在这里已经有了答案: How can I return pivot table output in MySQL? (10 个答案) 关闭 5 年前。 我正在尝试构建一个以唯一列值作为列名的表
我制作了一个简单的 JDialog,其中包含一个标签和一个按钮,它基本上相当于信息对话框。所以在对话框中,有一个方法 display() 我在其中调用了 setVisible(true) 五次。 据我
在 bash 4.2.8(1)-release (x86_64-pc-linux-gnu) 在 Ubuntu 11.04 上这个命令 [ $(wc -l /var/www/some.log|cut -
我正在使用 c 语言进行并发处理,我有一个进程池。为此,我让每个 child 都在一个 While (True) 循环中。为了杀死 child ,我正在使用一个全局变量和一个信号处理程序来修改它来打破
我正在尝试选择填写了字段的数据库条目。数据库有两种插入数据的方式,一种输入评论,一种不输入,我希望只选择填写了评论的行。 $requete = "SELECT * FROM daysoff WHER
如何在 JavaMail session 中setDebug(true) 捕获流并在我的日志记录框架中使用它? (缺少下载源代码,更改接受流作为参数的方法,重新编译它,...) 更一般地说,Java
我是 JavaScript 的新手,我刚刚发现了我无法理解的奇怪行为: var magicVar = Math.sin; magicVar == true; // it returns false m
对此感到困惑。 在两台服务器上运行相同版本的 MySQL。 (从完全相同的 rpm 构建)- 沿线的某个地方,一些开发人员改变了一些东西...... 服务器 1: mysql> select ( no
我在查看 OpenSSL 中使用的一些预处理器宏时,从 crypto/stack/safestack.h 中发现了以下内容: #define CHECKED_STACK_OF(type, p) \
所以我遇到了一个问题,我的正则表达式看起来像这样:/true|false/。 当我检查单词 falsee 时,我从这个正则表达式中得到一个 true,有没有办法将它限制为确切的 true 或 fals
我正在对这个恶意 JavaScript 行进行一些试验:var undefined = true; JavaScript 中每个未初始化的变量都有 undefined 的值,这只是一个保存特殊值 'u
我想将 PHP 的微时间存储为我在 MySQL 中的时间戳。 我去过told最好用 DECIMAL 存储它,但我找不到理想的大小。 有谁知道 microtime(true) 返回的最大大小是多少,所以
在 PHP 中,当您在 URL 中包含诸如“var=true”之类的内容时,URL 中的“true”和“false”是否被转换为 boolean 变量,或者它们是否等于文本“true”还是“假”?例如
Tôi là một lập trình viên xuất sắc, rất giỏi!