热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如果数组在JavaScript中是真实的,为什么不等于true?

如何解决《如果数组在JavaScript中是真实的,为什么不等于true?》经验,为你挑选了1个好方法。

我有以下代码片段:

if([]) {
  console.log("first is true");
}

console说,first is true该装置[]是真实的。现在我想知道为什么:

if([] == true) {
  console.log("second is true");
}

和这个:

if([] === true) {
  console.log("third is true");
}

不是true。如果控制台登录first is true了第一个代码段,那意味着[]应该为真,对吗?那么为什么后两个比较失败?这是小提琴。



1> Li357..:

这是根据规范。根据ECMAScript 2015语言规范,隐式强制转换为布尔值的任何对象均为true;这意味着物体是真实的。在if语句内部,条件一旦被评估并且如果不是布尔值,就被强制为布尔值。因此,请执行以下操作:

if([]) { 
  ... 
}

[] 强制为布尔值时为true,并且为true。

另一方面,当您尝试使用抽象比较比较不同类型的两个值时==,引擎必须在内部进行算法以将值减少为相似类型,最终将其简化为可以比较的整数。在规范的7.2.12节中,关于“抽象相等比较”的步骤x == y,指出:

7.2.12抽象平等比较

比较x == y(其中xy是值)产生truefalse。这样的比较执行如下:

[...]

    如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。

因此,y操作数(在这种情况下为true)通过强制转换为1,ToNumber因为它是布尔值,并且[] == 1是假的,因为:

    如果Type(x)是Object并且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x== y

这将x使用toString数组的方法将操作数转换为字符串,""在这种情况下,该方法适用于空数组。经过后ToPrimitive,将导致:

if("" == 1) {
  ...
}

最后:

    如果Type(x)是String且Type(y)是Number,则返回比较结果ToNumber(x== y

因此,ToNumber一个空字符串""为0,您将获得:

if(0 == 1) {
  ...
}

0不等于1,因此为假。请记住,仅仅因为某件事是真实的,并不等于真实。请尝试Symbol() == true({}) == true

最终比较with ===严格比较,并且不强制任何操作数,并且如果两个操作数不是同一类型,则将返回false。由于左操作数是一个对象(一个数组),而右操作数是一个数字,因此比较结果为false。


推荐阅读
  • Whyusingstringsaskeysofarray,consoleisshowingthatarraywithoutthesedeclaredvaluesand ... [详细]
  • [JavaScript] 多数前端工程师都没注意到的一个关于console.log()的坑
    [JavaScript]多数前端工程师都没注意到的一个关于console.log()的坑请阅读以下代码并猜测结果:functiontest(){le ... [详细]
  • javascript如何判断值是否为undefined
    这篇文章主要介绍“javascript如何判断值是否为undefined”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ja ... [详细]
  • JavaScript概述1.JavaScript定义JavaScript是Netscape公司开发的一种基于对象和事件驱动的脚本语言。它是弱类型语言,只能由浏览器解释执行。其中:脚本语言:解释运行( ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • IhaveawebapplicationthatusesanActiveXCOMcomponent,forexample:我有一个使用ActiveXCOM组件的Web应用程 ... [详细]
  • javascript函数中参数传递问题示例探讨-相信每一位刚接触javascript的同学在函数参数传递上都会很疑惑,原因无他,那就是它的语法太怪异了,你定义一个函数例如funct ... [详细]
author-avatar
mobiledu2502862177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有