js为什么[]==![]是成立的吗
作者:在下月亮有何贵干 发布时间:2024-04-10 16:10:34
前言
js是一门弱类型的语言,它的强制类型转换的迷惑性也被人诟病,例如标题提到的一个小例子,我想可能很难再找到其他的语言,允许我们觉到一个值似乎既为真也为假。
其实现在规范更推荐js开发者们避免使用 == 这种会产生强制类型转换的语法,大家尽可能会用 === 来代替,我在工作中也确实如此。
这里涉及到强制类型转换的问题,由于js的类型设计如此,它并不是难用,而是容易出现让人难以理解的内容,所以被很多人诟病。其实遇到任何问题,第一时间不应该是回避,而是应该试着去了解它,理解了也就不会迷惑了。
我想你也想解除一下自己的迷惑吧?本文就来给介绍一下关于==的类型转换问题。
== 与 === 的区别
这时候,如果你有经验,你肯定会说:这个我知道,== 只判断值,=== 会同时判断值和类型
这么理解也许可以,但是严格来说,这句话不够准确,真正的区别应该是:== 在比较两个不同类型的值时会发生强制类型转换,而 === 不会
强制类型转换
然后怎么转换呢?记一下以下几点就完了。
前置条件是两者类型不同,
两者如果是表达式,先计算表达式。
两者中有一个是对象类型,则该对象类型执行ToPrimitive后再进行比较。
两者都是基本类型,判断类型是否相同,不同,则同时执行ToNumber后再比较。
特殊情况,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 []==![]内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://blog.csdn.net/weixin_43877799/article/details/128787528


猜你喜欢
- java连接Access数据库的方法,分享给大家步骤:1.现在我们一般使用的编译环境是java SE 1.8,不支持odbc的连接方式,所以
- 一、背景:在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等w
- 本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下:MySQL 多表关联一对多查询取最新的
- 一、Vue.js简介1、Vue的主要特点: (1) 简洁 (2) 轻量 (3)快速 (4) 数据驱动 (5) 模块友好 (6) 组件化(1)
- 如何用Access加密页面?很简单哦,看看这个用用Access和ASP做的加密程序: <%userid =&nbs
- 编写tasks.pyfrom celery import Celeryfrom tornado.httpclient import HTTP
- python调用文件时找不到相对路径current_path = os.path.dirname(__file__)if current_p
- Pytest-sugar是一款用来改善控制台显示的插件,增加了进度条显示,使得在用例执行过程中可以看到进度条,而且进度条是根据用例是否通过标
- 远控终端的本质1、服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息2、客户端执行消
- 使用cpu和gpu的区别在Tensorflow中使用gpu和cpu是有很大的差别的。在小数据集的情况下,cpu和gpu的性能差别不大。不过在
- 一、多进程的实现方法一# 方法包装 多进程from multiprocessing import Processfrom ti
- 概要基于 golang Gin 框架开发 web 服务时, 需要时不时的 go build , 然后重启服务查看运行结果.go build
- 本文主要介绍如何对多个文本进行读取,并采用正则表达式对其中的信息进行筛选,将筛选出来的信息存写到一个新文本。文本基础操作打开文件:open(
- 最新版本的Python发布了!今年夏天,Python 3.8发布beta版本,在2019年10月14日,第一个正式版本已准备就绪。现在,我们
- <?php function CreateShtml() { ob_start(&quo
- 如何在生产上部署Django?Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。uwsgi介绍uW
- //定义编码header( 'Content-Type:text/html;charset=utf-8 ');//Atomh
- 前言为了避免代码泄露的风险,我们往往需要对代码进行加密,PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护
- 我就废话不多说了,大家还是直接看代码吧~import tensorflow as tfimport syswith tf.variable_
- 前言:md5解密,百度了一下发现教程不是很多也不详细。这个图都没一张。。。0x01windows环境,kali也可以啊burpsuitere