[]==![]为true

  1. !的优先级比==要高,所以会先执行![]。也就是先把[]转为布尔类型再取反。[]转布尔值是true,为什么呢?因为在JavaScript里除了false自身以外只有5个假值,分别是“”,undefined, null, 0, NaN。除了这5个假值以外,其他所有值转布尔类型都是true。一切对象都是真值,包括new Boolean(false)。于是问题就成了 [] == false了
  2. 当"=="号两边其中一个是布尔值的话,先把它转换为数字(ECMAScript的规范)。于是就变成了求[] == 0。
  3. 当"=="的一边是字符串或数字,另一边是对象的时候(数组也是对象),先把对象值转换为原始值再判断相等。对象值到原始值是怎么转换的呢?.对于所有非日期雷对象来说,对象到原始值的转换基本上就是对象到数字的转换。有3个步骤:1.所有对象先调用valueOf()方法,如果此方法返回的是原始值,则对象转为这个原始值。 2.如果valueOf方法返回的不是原始值,则调用toString方法,如果toString方法返回的是原始值吗,则对象转换为这个原始值。 3.如果valueOf和toString方法均没有返回原始值,则抛出TypeError异常. 请看笔记"关于 valueOf() 和 toString()"
  4. []到原始值的转换是怎么样的?首先调用[].valueOf()方法,返回值是对象自身,即[],这不是一个原始值。所以继续调用[].toString()方法,返回的是空字符串"",这是一个原始值,所以此值就作为对象转换为原始值的输出。于是问题就变成了求"" == 0.
  5. 当"=="两边一个是字符串一个是数字的时候,先把字符串转为数字,再进行比较。“”转成数字为0,所以最后得出[] == false为true。

来自 http://my.oschina.net/u/1274710/blog/293733

时间: 2024-08-04 07:15:11

[]==![]为true的相关文章

jQuery $.ajax传递数组的traditional参数传递必须true

出自:http://blog.csdn.net/ojackhao/article/details/24580437 起初我认为traditional:true,可有可无,但是后来不用traditional的时候,发现后台无法获取selectUsers的值,那么可以肯定的是traditional默认值是false.当提交的参数是数组( {selectUsers:[value,value,value]} ),如果是false的话,则提交时会是"selectUsers[]=value&sele

Hibernate学习(五)lazy属性学习(true和extra区别)

Lazy(懒加载)在hibernate何处使用:1.<class>标签上,可以取值:true/false,(默认值是:true)2.<property>标签上,可以取值:true/false,需要类增强工具3.<set>,<list>集合上,可以取值:true/false/extra,(默认值为:true)4.<one-to-one>,<many-to-one>单端关联上,可以取值:false/proxy/noproxy 在在set集

&lt;compilation debug=&quot;true&quot; targetFramework=&quot;4.5&quot;&gt; 报错解决方案

在 VS2013 下开发的 MVC4 网站,基于 .net 4.5,服务器是一台 Windows 2008 R2,运行的时候就报错了 The 'targetFramework' attribute in the <compilation> element of the Web.config file is used only to target version 4.0 and later of the .NET Framework (for example, '<compilation 

js中return;、return true、return false;区别

一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  二.返回控制, 无函数结果,语法为:return;  在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转到该元素href属性指定的页.    Return False 就相当于终止符,Return True 就相当于执行符.    在js中return false的作用一般是用来取消默认动作的.比如你单击一

$.extend(true,{},a,b),深入理解,小心陷阱

$.extend一般情景下,使用深度拓展两个对象时,我们想要的效果是,b对象覆盖掉a对象中存在的所有属性,没有则新增到a对象中:下面我们看一下我所遇到的问题:我希望通过深度拓展将tmp中的editoption覆盖掉ret中的editoption;所以采用了深度拓展方法  ret = $.extend(true,{},ret,tmp);但结果并没有达到我想要的效果:对象属性中的数组长度依然没有发生变化.通过样例比较发现,数组长度虽然没有发生变化,但是数组前排列在前8位的值发生了改变,也就是是说,变

JDBCTemplate在AutoCommit为True时手动控制事务

这是工作中遇到的一个真实问题的处理过程,如果对分析过程不感兴趣,可以直接跳到最后看最终方案. 我们在持久化这一层,并没有用任何的ORM框架(无论是Hibernate还是MyBatis,亦或是DBUtils),而是采用了在JDBCTemplate基础上进行了简单的包装,同时我们也决定将AutoCommit设置为True,在sql语句执行完成后立即提交.这样做相比于@Transactional注解或者通过AOP来控制事务性能更好,也更方便. 在评估了优劣之后,便开始使用这种方式,随之我们也遇到了一个

关于死循环while(true){}或for(;;){}的总结

1.基本用法: while(true){     语句体; } for(;;){     语句体; } 以上情况,语句体会一直执行. 2.跳出死循环 情形一:while(true){     swtich(n){         case 1:           Syso....           break;         case 2:           syso...           break;     }     break } 由于break只跳出离自己最近的循环体,所以

为什么 var_dump(&quot;1&quot; == &quot;1e0&quot;); 的结果为true

今天,同学问我一个问题,如下:var_dump("1" == "1e0"); 的结果是什么. 我的第一反应,答案是false.因为很明显的要比较的是两个字符串,而字符串比较时,只需比较其内容即可.很明显, 两个字符串的内容并不一样,当然是false了. 然而,我又注意到要比较的字符串中存在一个纯数字字符串"1",那根据规则,当要比较的是两个纯数字字符串时要转换成数值型来比较.这里只有一个.所以仍应该安字符串来比较,结果仍为false. 但实际运行

jsp include flush true

设置flush为true,就是说,如果你的缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误服务器端页面缓冲,大致的意思是,在将生成的HTML代码送到客户端前,先在服务器端内存中保留,因为解释JSP或Servlet变成HTML是一步步进行的,可以在服务器端生成完HTML或生成一部分HTML(所占用字节数已达到指定的缓冲字节数)后再送到客户如果不缓冲,就会解释生成一句HTML就向客户端送一句在<jsp:include语句中,必须设置flush="true">

[ jquery 过滤器 hasClass(class) ] 此方法用于在选择器的基础之上检查当前的元素是否含有某个特定的类,如果有,则返回true

此方法用于在选择器的基础之上检查当前的元素是否含有某个特定的类,如果有,则返回true 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my page'> <meta http-equiv='keywords' content