生鲜微信小程序开发_JavaScript中三个等号和两个等号你了解多少

  • 栏目:行业动态 时间:2021-01-11 16:32 分享新闻到:
<返回列表

JavaScript中三个等号和两个等号你了解多少       本篇文章主要介绍了js里面的==和===,== 判断如果两边变量的类型不同,而 === 则不做类型转换,有兴趣的可以了解一下

众所周知,用在if条件判断语句中,js有六种假值:false, null, undefined, '', NAN, 0。先来看几个例子:

[] === []
NaN === NaN
NaN == NaN
0 == []
'' == []
'' == {}
[] == undefined
{} == []
null == undefined

以上这些判断结果是什么,大家能否一看就知道结果呢?笔者以前对==和===都只有大概的印象,相信大家也都知道,== 判断如果两边变量的类型不同,会将其先做类型转换再作判断,而 === 则不做类型转换,如果类型不同,就一定返回 false。但是笔者最近看到了一个题目,感觉很有意思,贴出来给大家看看:

var x = 1;
var obj = {
 valueOf: function(){ 
 x = 2; 
 return 0 
console.log(obj == 0, x)

恩,这段代码输出的结果是 true, 2,是不是不可思议?还有~

var x = 1;
var obj = {
 valueOf: function(){ 
 return {} 
 toString: function(){ 
 return {}
 console.log(obj == 0)

这段代码直接抛出了异常: Uncaught TypeError: Cannot convert object to primitive value。

如果你和我一样觉得很奇怪,那就继续往下看吧~

=== 的规则

这个比较简单,我把规则罗列一下

如果类型不同,就不相等 如果两个都是数值,并且是同一个值,那么相等,例外的是,如果其中至少一个是NaN,那么不相等。(判断一个值是否是 NaN,只能用isNaN() 来判断) 如果两个都是字符串,每个位置的字符都一样,那么相等;否则不相等。 如果两个值都是true,或者都是false,那么相等。 如果两个值都引用同一个对象或函数,那么相等;否则不相等。 如果两个值都是null,或者都是undefined,那么相等。

这里不难发现,复合类型的数据(比如对象、数组、函数等)之间的比较不是比较他们的值是否相等,而是比较他们引用的对象是否一样,因此也不难明白,为什么 [] === [] 判断为false了。

比如:

== 探究

看下 == 的规则

如果两个值类型相同,进行 === 比较。 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较: 如果一个是null、一个是undefined,那么相等。 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString。例外的是Date,Date利用的是toString转换。非js核心的对象,会比较麻烦,有兴趣的同学可以研究一下 任何其他组合,都不相等。

看到这里,第六条,我们就可以明白,为什么上面的代码会输出意想不到的结果甚至抛出错误了。

再来看一题:

if (x == 10) 
 x += 5

根据上面的规则,试想一下,如果我们输入的x是字符串20,那么x的结果会变成什么样?没错,就是205,而往往这种情况我们的目的是想计算20+5的值。

综合上面的例子,不难看出,== 的比较看似会比较方便,比如 1 == '1' ,但是会埋下隐患,比如可能对类型做出错误的假设。因此大多数人建议我们少用== 而尽量使用 ===,事实上我也推荐如果明确知道类型,还是最好用===。

再举个简单的例子:团队协作中你肯定需要读别人的代码。而当你看到==时,要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,还是不应该转型但是写错了……所花费的脑力和时间比明确的===(加上可能需要的明确转型)要多得多。这样一想,===不要好太多。

明白了==的机制,那么判断这6个假值,就变得容易了。

简单看看几个例子,大家看看是真是假~

false == ''
false == []
0 == []
'' == []
[] == []
[] == {}
null == undefined
false == undefined

总结

可以用一张图来表达 == 返回true的几个假值:

一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。

二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)

三、接着看双等号前后有没有字符串, 有三种情况:

对方是对象,对象使用toString()或者valueOf()进行转换; 对方是数字,字符串转数字; 对方是字符串,直接比较; 其他返回false 如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false null, undefined不会进行类型转换, 但它们俩相等

后记

我的建议是:如果你的的确确知道你在做什么(了解类型转换的结果),可以用==;否则还是用===吧。

在网上无意中看到的图,大家可以参考看看:

==号

===号


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。


分享新闻到:

更多阅读

生鲜微信小程序开发_JavaScript中三个等号

行业动态 2021-01-11
JavaScript中三个百分号和2个百分号你呢解是多少 大家都知道,用在if标准分辨句子中,...
查看全文

广州凡科互联网科技股份有限公司招聘助

行业动态 2021-01-11
招聘人数:26职位信息职责描述:1、按客户项目需求,独立带领团队发展并执行项目(如新品...
查看全文

广州凡科互联网科技股份有限公司招聘阿

行业动态 2021-01-11
招聘人数:4职位信息【岗位职责】:1、负责通过电话、上门拜访、网络等形式进行新客户开发...
查看全文
返回全部新闻


区域站点: 南丰县如何创建网站   南宫市建站公司   囊谦县建网站   南和县一键建站   南华县如何创建网站   南江县建站公司   南京市建网站   南靖县一键建站   南康市如何创建网站   南乐县建站公司   南陵县建网站   南宁市一键建站   南平市如何创建网站   南皮县建站公司   南市区建网站   南通市一键建站   南投县如何创建网站   南雄市建站公司   南溪县建网站   南阳市一键建站   南漳县如何创建网站   南召县建站公司   南郑县建网站   那坡县一键建站   那曲县如何创建网站   纳雍县建站公司   讷河市建网站   内黄县一键建站   内江市如何创建网站   内丘县建站公司   内乡县建网站   嫩江市一键建站   聂荣县如何创建网站   尼玛县建站公司   尼木县建网站   宁安市一键建站   宁波市如何创建网站   宁城县建站公司   宁德市建网站   宁都县一键建站   宁国市如何创建网站   宁海县建站公司   宁化县建网站   宁晋县一键建站   宁陵县如何创建网站   宁明县建站公司   宁南县建网站   宁强县一键建站   宁陕县如何创建网站   宁武县建站公司   宁乡市建网站   宁阳县一键建站   宁远县如何创建网站   农安县建站公司   磐安县建网站   盘锦市一键建站   盘山县如何创建网站   磐石市建站公司   盘州市建网站   蓬安县一键建站   澎湖县如何创建网站   蓬莱市建站公司   彭山县建网站   蓬溪县一键建站   彭阳县如何创建网站   彭泽县建站公司   彭州市建网站   偏关县一键建站   平安县如何创建网站   平昌县建站公司   平定县建网站   屏东县一键建站   平度市如何创建网站   平果县建站公司   平和县建网站   平湖市一键建站   平江县如何创建网站   平乐县建站公司   平凉市建网站   平利县一键建站   平罗县如何创建网站   平陆县建站公司   屏南县建网站   平泉市一键建站   屏山县如何创建网站   平顺县建站公司   平塘县建网站   平潭县一键建站   平武县如何创建网站   萍乡市建站公司   平乡县建网站   平阳县一键建站   平遥县如何创建网站   平阴县建站公司   平邑县建网站   平远县一键建站   平舆县如何创建网站   皮山县建站公司   普安县建网站   浦北县一键建站   浦城县如何创建网站   普洱市建站公司   普格县建网站   浦江县一键建站   普兰县如何创建网站   普宁市建站公司   莆田市建网站   迁安市一键建站   乾安县如何创建网站   潜江市建站公司   潜山市建网站  

友情链接: 自助建站 怎么自己建网站 免费网站建设 外包建站公司 手机版

Copyright © 2002-2020 建网站_一键建站_如何创建网站_建站公司_个人博客免费建站平台 版权所有 (网站地图) 备案号:粤ICP备10235580号