Javascript数组到布尔类型强制没有意义
Javascript array to boolean type coercion not making sense
当我运行以下代码行时:
var x = []; console.log(!x); console.log(x == false);
> false
> true
我假设使用!将正确地强制类型,类似于它在PHP中的工作方式,并且这两个控制台日志将返回相同的输出。有人能向我解释一下这里发生了什么事吗?
tl;dr: 将值转换为布尔值与将值比较为布尔值非常不同,因为JavaScript具有隐式类型转换。
有人能向我解释一下这里发生了什么事吗?
!x
与!Boolean(x)
相同,即x
显式转换为布尔值。
通过松散的比较,事情有点演变:
如果两个操作数不属于相同的数据类型,JS会将它们转换为相同的类型。但是,如果任何操作数是布尔值,则该值将转换为数字,而与其他操作数的值无关。这反过来意味着另一个操作数也被转换为数字
所以[] == false
和Number([]) == Number(false)
是一样的。
松散比较的算法可以在ECMAScript规范中找到
另请参阅为什么{}==false求值为false,而[]==false的求值为true?,其中列出了转换步骤。
我假设使用!将正确地强制该类型,类似于它在PHP中的工作方式。
虽然肯定有一些相似之处,但类型转换规则是完全独立的。
Opinionated建议:这是一个很好的例子,说明了为什么在可能的情况下应该避免隐式类型转换。
实际上,我认为它确实按照你的想法工作:
var x = [];
document.writeln(!x);
document.writeln(x == false);
好的,所以我想我发现了问题:
var x=[];
alert(x==false);// true;
x=[1];
alert(x==false);// false;
即使定义了x,它也不会返回true,除非它有内容。
相关文章:
- 在前端javascript应用程序中使用DI容器有意义吗
- Node.js时使用async是有意义的
- Angular $q.reject().success(),这有意义吗?
- 在JavaScript中使用===进行字符串比较有意义吗
- 传递给IIFE包装器有多少全局变量是有意义的
- 将Epoch日期转换为有意义的Javascript日期
- 在标准ES6类中添加getter方法有意义吗
- 为给定数量的空格查找可能数量的有意义的英语单词
- 使用 html 选择和日期的依赖日期选择器有意义
- 三个中是否有容器类型对象.js来转换一组子对象
- 在这个jQuery插件中,哪种策略更有意义
- 拥有基本服务是否有意义,如果是这样,这是一种好方法
- JS:如何在保持n个有意义的数字的同时简化列表的过度精确数字
- 在Lua VM上运行JavaScript是否有意义
- 在Java 8 Nashorn JavaScript引擎中同时加载脚本是否有意义
- 新手:在MDN上有意义的Javascript闭包示例
- 只使用twitter引导程序中的插件有意义吗
- 将angular服务与es6模块一起使用有意义吗
- 有不同类型的转义序列吗
- 这个JavaScript函数有什么作用?有意义吗