[]==![] 为什么等于true?

最近碰到这样一个问题:

[]==![]  为什么等于true?

首先分析  !的优先级较==高,先运算==两侧的操作数:

typeof [];   //"object"
typeof ![];   //"boolean"

执行类型转换的规则如下:
如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则:
值 null 和 undefined 相等。
在检查相等性时,不能把 null 和 undefined 转换成其他值。
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

回到最开始的题目

== 的左操作数是[],数组(对象处了日期对象,都是对象到数字的转换),碰到==要先调用自己的valueOf()方法=>[](还是本身),然后调用自己的toString()方法=>空字符串=>false (或者空字符串转成0,然后再转成false,但是终归会是false)

==右侧侧的操作数 ![]:[]是对象,会转换成true,然后再转成false(加!的一定是转换成boolean)

所以,最后 flase==false //true

时间: 2024-10-11 13:53:41

[]==![] 为什么等于true?的相关文章

js中a + 1 < a等于true,(a ==1 && a== 2 && a==3) 等于 true如何实现

先说a + 1 < a 1 const a = { 2 i: 1, 3 valueOf: () => { 4 if (a.i === 1) { 5 return a.i++; 6 } 7 return a.i+2; 8 } 9 } 10 console.log(a + 1 < a); // true 原理:valueOf第一次返回一个值,取过一次之后返回另一个值,这里用个变量判断也行,如下: 1 let flag = true; 2 const a = { 3 i: 1, 4 value

cxgrid GridMode 等于 True 时的一些问题。

When using grid mode, the data controller loads a fixed number of dataset records into memory. The number of records to be loaded depends on the GridModeBufferCount property value. A user is permitted to perform data-related operations on the loaded

php 等于不等于 一个感叹号两个等于号

$a == $b 等于 TRUE,如果 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同.(PHP 4 引进) $a != $b 不等 TRUE,如果 $a 不等于 $b. $a <> $b 不等 TRUE,如果 $a 不等于 $b. $a !== $b 非全等 TRUE,如果 $a 不等于 $b,或者它们的类型不同.(PHP 4 引进) $a < $b 小与 TRUE,如果 $a 严格小于 $b. $a > $b 大于 TRUE

为什么in_array(0, [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;])返回true

为什么in_array(0, ['a', 'b', 'c'])返回true 目录 1 类型转换 2 严格比较 3 false和null 4 数组中有true 在PHP中,数据会自动转换类型后进行比较. 所以会发现一个奇怪的现象,就是: in_array(0, ['a', 'b', 'c']) // 返回bool(true),也就相当于数组中有0 array_search(0, ['a', 'b', 'c']) // 返回int(0),也就是第一个值的下标 0 == 'abc' // 返回bool

Python dict 以 1和True 作为键值的比较

运行环境: 操作系统:Win7 64位 Python版本: 2.7.12 IDE:pycharm 2017.2 测试代码: 测试Python dict 1 和 True 作为键值 测试 demo 如下: #!/usr/bin/env python# -*- coding:utf-8 -*- __author__ = "liukang" dict_test = {}print dict_testdict_test[1] = 1print dict_testdict_test[True]

【转】ConcurrentHashMap完全解析(JDK6/7、JDK8)

转自http://my.oschina.net/hosee/blog/675884 并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O).ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS

用js判断时间的先后顺序

我们在用户注册信息的时候,有时根据需要往往要加入一些时间上的判断,今天我在这里给大家推荐一款比较实用的时间先后顺序判断的代码,希望对大家有所有帮助. 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 <title>last.html</title> 6 <style> 7 </style> 8 <scrip

php == 操作符带来的安全问题

1 比较操作符 php的比较操作符有==(等于)松散比较,===(完全等于)严格比较,这里面就会引入很多有意思的问题.在松散比较的时候,php会将他们的类型统一,比如说字符到数字,非bool类型转换成bool类型,为了避免意想不到的运行效果,应该使用严格比较.如下是php manual上的比较运算符表: 例子 名称 结果 $a == $b 等于 TRUE,如果类型转换后 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同. $a != $b 不等

nodejs学习资料

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS