我的编程空间,编程开发者的网络收藏夹
学习永远不晚

js为什么[]==![]是成立的吗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

js为什么[]==![]是成立的吗

前言

js是一门弱类型的语言,它的强制类型转换的迷惑性也被人诟病,例如标题提到的一个小例子,我想可能很难再找到其他的语言,允许我们觉到一个值似乎既为真也为假。

其实现在规范更推荐js开发者们避免使用 == 这种会产生强制类型转换的语法,大家尽可能会用 === 来代替,我在工作中也确实如此。

这里涉及到强制类型转换的问题,由于js的类型设计如此,它并不是难用,而是容易出现让人难以理解的内容,所以被很多人诟病。其实遇到任何问题,第一时间不应该是回避,而是应该试着去了解它,理解了也就不会迷惑了。

我想你也想解除一下自己的迷惑吧?本文就来给介绍一下关于==的类型转换问题。

== 与 === 的区别

这时候,如果你有经验,你肯定会说:这个我知道,== 只判断值,=== 会同时判断值和类型

这么理解也许可以,但是严格来说,这句话不够准确,真正的区别应该是:== 在比较两个不同类型的值时会发生强制类型转换,而 === 不会

强制类型转换

然后怎么转换呢?记一下以下几点就完了。

前置条件是两者类型不同,

  1. 两者如果是表达式,先计算表达式。
  2. 两者中有一个是对象类型,则该对象类型执行ToPrimitive后再进行比较。
  3. 两者都是基本类型,判断类型是否相同,不同,则同时执行ToNumber后再比较。
  4. 特殊情况,null == underfined,两者在 == 比较中只与对方和自己本身相等。

ToPimitive:执行该对象的valueOf函数,如果结果为基本类型则直接返回,否则返回该对象的toString函数的执行结果。

ToNumber:转化为数字类型。

例子

ok,知道了以上的内容,我们来看看[]==![]发生了什么。

[] == ![] // 右边是表达式,先进行计算,[]的boolean值为true,所以![]则为false

// ⬇⬇⬇

[] == false // 右边是基本类型,左边则是数组(对象类型),因此对左侧执行ToPrimitive

// ⬇⬇⬇

// ToPrimitive执行过程
[].valueOf() // 结果为[],valueOf返回的仍然是原数组对象,非基本类型,执行ToString
[].toString() // 结果为空字符串'',为字符串基本类型,返回

'' == false // 两边都为基本类型,类型仍然不同,两边同时执行ToNumber

// ⬇⬇⬇

// 两边同时ToNumber转化为数字类型
Number('') // 0
Number(false) // 0

0 == 0 // true

哈哈哈,虽然很扯淡,但是结果就是这样的。

练习

试试,根据上方学习到的知识,能不能尝试让自己理解以下的等式为什么是true呢?

console.log('0' == false) // true
console.log(0 == false) // true
console.log('' == false) // true
console.log([] == false) // true
console.log('' == 0) // true
console.log('' == []) // true
console.log(0 == []) // true

特殊情况undefined==null

虽然两者都是基本类型,可是遇到它们时要特殊处理,不可以使用Number进行转换,两者在==中只与彼此和自身相等,因此进行上方步骤判断时,不要忘了遇到null和undefined,不要再继续转换了。

而且根据这个特殊性质,当我们需要判断一个值为undefined或者null时,完全可以简化判断,这不是很好吗?

if (res === undefined || res === null) {
    // ...
}

// 等同于
if (res == null) {
    // ...
}

尾言

本文介绍了==的强制类型转换,虽然我知道这在工作中实用性不大,哈哈哈,不过就当是满足一下自己的求知欲吧。更多相关js []==![]内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

js为什么[]==![]是成立的吗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

js为什么[]==![]是成立的吗

本文主要介绍了js为什么[]==![]是成立的吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-31

独立IP是什么?为什么要使用独立IP?

编程学习网:在进行网站建设的时候是使用独立IP还是公用多个IP地址?这个问题困扰着许多人。
独立IP是什么?为什么要使用独立IP?
2024-04-23

独立显卡和集成显卡的区别是什么

独立显卡和集成显卡的区别是:1、独立显卡是一块独立的硬件设备,而集成显卡则是集成在计算机主板上的一部分;2、独立显卡通常比集成显卡具有更强的图形处理能力和性能;3、独立显卡需要额外的电源供应,而集成显卡则相对较小且功耗较低;4、独立显卡是插
2023-08-17

MySQL为数据表建立索引的原则是什么

这篇文章给大家分享的是有关MySQL为数据表建立索引的原则是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。面试题:索引是什么?索引的优点?索引的缺点?在建立索引的时候都有哪些需要考虑的因素呢?为数据表建立索引
2023-06-29

JavaScript之JS的组成与基本语法是什么

今天小编给大家分享一下JavaScript之JS的组成与基本语法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Java
2023-07-05

云服务器虚拟化是一种成本结构吗为什么

云服务器虚拟化是指将传统物理服务器虚拟成多个虚拟服务器,以便在同一个云平台上支持负载均衡和容错。这样可以降低服务器的采购、维护成本,同时提高资源的利用率,从而提高云服务器的可用性和可扩展性。云服务器虚拟化技术可以分为以下几个方面:服务器虚拟化:将多个不同品牌、不同类型的服务器(例如:Linux、Windows、MacOS等)虚拟成一个个独立的、可扩展的虚拟机,以便支持负载均衡和备份。数据库虚拟化:将传统的物理数据库虚拟...
2023-10-27

建立成功的Python环境的4个基本工具是什么

本篇内容介绍了“建立成功的Python环境的4个基本工具是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 是一门出色的通用
2023-06-16

建立ssl的过程是什么

建立SSL(Secure Socket Layer)的过程如下:1. 客户端向服务器发送一个HTTPS请求。2. 服务器使用公钥加密算法生成一对公私钥,并将公钥发送给客户端。3. 客户端收到服务器的公钥后,使用该公钥对一个随机生成的对称密钥
2023-08-25

云服务器虚拟化是一种成本结构对吗为什么

云服务器虚拟化是将计算资源(存储、网络和其他资源)分布在多个云计算服务提供商的平台上,以提供更高的性能和更好的安全性。与传统的服务器虚拟化技术不同,云服务器虚拟化通过将多台物理服务器虚拟成一台虚拟服务器,从而实现高性能和高可靠性,并且能够降低总体拥有成本。同时,云服务器虚拟化通过在云计算服务提供商的服务器上安装软件和配置硬件,从而实现更加安全和高效的资源利用。因此,云服务器虚拟化是一种成本结构对称的技术,它...
2023-10-27

php时间戳转成js时间戳的方法是什么

这篇文章主要讲解了“php时间戳转成js时间戳的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php时间戳转成js时间戳的方法是什么”吧!一、PHP中时间戳转换成时间格式在PHP中
2023-07-05

php时间戳转为js时间戳的方法是什么

本文小编为大家详细介绍“php时间戳转为js时间戳的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“php时间戳转为js时间戳的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。PHP 时间戳在
2023-07-05

js split的语法是什么

JavaScript中split()方法的语法如下:string.split(separator, limit)其中,string表示要分割的字符串,separator表示用于指定分隔符的字符串或正则表达式,limit表示可选参数,用于
2023-10-24

js的深拷贝是什么

这篇文章主要为大家展示了“js的深拷贝是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js的深拷贝是什么”这篇文章吧。js深拷贝在讲正题之前我们要先了解数据存储的方式数据存储方式在讲之前我们
2023-06-25

编程热搜

目录