javascript - function(){} == true || function(){} != true;function(){}不为true?
PHP中文网
PHP中文网 2017-04-10 17:52:34
0
4
1156

1 描述:

今天看到看到红宝书第27页有写到: 任何对象转换为true;那么实验了一下:

好像没错, function(){} 为 true!

2 后来:

呵呵,好像并不是这样,闲的蛋疼的我又来了一波:

3 问题:

那么问题是
function(){} 为什么用双等判断的时候 为false!

PHP中文网
PHP中文网

认证0级讲师

全員に返信(4)
Ty80

懂了:

在if语句中:

ECMAScript 会自动调用Boolean() 转换函数将这个表达式转换为一个布尔值(强转);
如果此值的结果为true,则执行语句,如果为false则。。。。

在==操作符中:

如果有一个操作数为对象,另一个不是,则调用对象的valueOf()方法,得到后进行比较;
如果2个都为对象,则比较它们是不是同一个对象,如果为同一个对象,则返回true,否则返回false

赞! 感谢指导

いいねを押す +0
洪涛

值等于是比较值的。
所以浏览器会先将运算符两边的变量/表达式的值先算出来,并转换成同类型(基本类型)的形式进行比较。
(function(){})表达式的值通过valueOf()/toString()来计算,
你可以看一下这两个返回的值是什么,并且看一下返回值可否转换成为true。
抱歉打脸,今天有的别的事情。
-----------------update-----------------
更新:
@Starch
像这种比较运算符或者一些基本概念问题,我有一个推荐:
JavaScript 5
http://ecma-international.org...
JavaScript 6
http://ecma-international.org...
你可以到对应版本的JavaScript中寻找你需要的解释。
回到本题,先来看一下 == 运算符它的原理吧:


这个就是浏览器在遇到 == 时采取的操作步骤,我来翻译一下是什么意思:

==运算符是这样被计算的:
1 让左引用(lref: left reference)成为正在计算的表达式左侧的值。
2 将左值(lval:left value)赋值为 GetValue(lval)。
3 让右引用(rref: right reference)成为正在计算的表达式右侧的值。
4 将右值(rval:left value)赋值为 GetValue(rval)。
5 返回执行rval == lval 抽象值比较的结果(参见 11.9.3)

那么在11.9.3,又是怎么规定abstract equality comparison 的呢?


这就比较长了,但是也很详细。这就不一条一条的解释了。
直接看第七条就好了:
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
那么结果就变成了:
function() {} == 1
然后再看第9条:
If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.
最后参考我一开始写的就好了。

答案就是false。

いいねを押す +0
Peter_Zhu

当 JavaScript 需要一个布尔值时(例如:if 语句),任何值都可以被使用。
最终这些值将被转换为 true 或 false
比如使用Boolean(function(){})返回true,在if语句中也会这样判断,因为它需要的是布尔值。

而==是判断类型返回布尔

いいねを押す +0
伊谢尔伦

并不是说function(){}为true, 你看看你的if判断里面只要不为null空 undefined 程序都能走通,所以这里并不能说明 function(){}==true;

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!