javascript - []? 1: 0的结果为1
大家讲道理
大家讲道理 2017-04-11 10:37:36
[JavaScript讨论组]

如图

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(9)
ringa_lee

第一个是这样的:当进行相等判断,如果有一边是布尔值,另一边不是,则布尔值变为数值,true变为1,而一边是对象,一边不是对象,则调用对象的valueOf()方法转换为基本类型再进行比较,如果valueOf()...总之,得让类型一致才能比,所以第一个肯定是返回false,因为[]不可能转换为1或者'1'

第二个是这样的:[]还是一个object(长度为0的数组),但是任何Object在需要转换为布尔值时都是转换为true的,除非你这么写null?1:0,这样是返回0的

综上所述,第一个里面,是转化为字符串在比较,一个是空字符串,一个是字符串“1”,所以不等,第二个是将object转化为true的布尔值

大家讲道理

根据ECMAScript Language Specification Edition 3 8-Mar-14规范,从语法上来说:

  1. [] == true 属于对比语法 (EqualsOperator)

  2. []?1:0 属于条件判断语法(ConditionalOperator)

两者的执行方式是有所区别的。

EqualsOperator(E262-3#11.9.1)

因为一边是Object类型,一边是Boolean类型,则执行:


if Type(y) isBoolean, return the result of the comparison x==ToNumber(y)

所以实际执行的语句为[] == 1

If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x)==y.

那么toPrimitive([]) 获取到的数据为:

那么会调用对象的[[DefaultValue]]方法:

那么这个问题,就很简单了:

[] == true => [] == 1 => [].toString() == 1 => ""== 1 ====> false

实验截图:


ConditionalOperator(E262-3#11.12)

[]?1:0执行的流程如图:

关于 GetValue 涉及到Reference类型(虚拟机内部类型,这里为返回[]对象)

ToBoolean:

参考:

  • E262-3.pdf:ECMAScript Language Specification Edition 3 8-Mar-14

黄舟
[]?1:0 相当于 !![]?1:0 所以1.
[]不直接等于true.但他是一个对象。所以不是false
阿神
console.info([] ? 1 : 0) // 1
console.info(Boolean([]) ? 1 : 0) // 1
console.info(!![] ? 1 : 0) // 1

// 对象放在比较运算符的地方会转成 bool 类型进行比较
// =。=不对,纠正一下 不是比较运算符 是条件表达式0.0
console.info(!![] === true) // true
console.info(Boolean([]) === true) // true
PHPz

"==" 非严格相等,如果两边类型不一致会进行类型装换,
如果其中一个是tru则转为1再进行比较,false转0;
如果一边是数值一边是字符串,将字符串转数值;
如果一边是对象一边是数值,将对象转为数值,首先尝试调用对象的valueOf()方法,再尝试toString()方法,
如果一边是对象一边是字符串,将对象转为字符串,首先尝试toString()方法,再尝试调用对象的valueOf()方法;

PHP中文网

巴扎黑
> []==false
<· true
> ![]==false
<· true
> !![]==false
<· false

> []==true
<· false
> ![]==true
<· false
> !![]==true
<· true

> []?1:0
<· 1
> ![]?1:0
<· 0
> !![]?1:0
<· 1
阿神
[]?1:0

[]?相当于!![],?前面必须是个布尔,所以强制转换[]为布尔,而==不会
说到强制转化,下面这段代码岂不是更有趣

(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
大家讲道理

三元程式,第一段,自动作表达式处理,Boolean([]) ? 1 : 0;

Boolean([]) => true

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号