资讯专栏INFORMATION COLUMN

《javascript高级程序设计》笔记:关系运算符与相等运算符

Blackjun / 785人阅读

摘要:要比较相等性之前,不能将和转换成其他任何值。如果有一个操作数是,则相等操作符返回,而不相等操作符返回。重要提示即使两个操作数都是,相等操作符也返回因为按照规则,不等于。

关系运算符

关系运算符有小于(<)、大于(>)、小于等于(<=)和大于等于(>=)四种,它们都返回一个布尔值

《javascript高级程序设计》书中的规则是这样描述运算规则:

(1)如果两个操作数都是数值,则执行数值比较;
(2)如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
(3)如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;
(4)如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面> 的规则执行比较,如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面的规则执行比较;
(5)如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

关系运算图谱:

==> 图谱分析:
(1)undefined本质是NaN,任何操作数与 NaN 进行关系比较,结果都是 false
(2)null本质是0,boolean本质是0或1
(3)如果两个操作数都是字符串,则比较两个字符串对应的字符编码值(a-97,A-65, 0-48);
(4)object可能隐式转换成numbe或者string,视情况而定

"Brick" < "alphabet"; // true
"23" < "3"; // true
"23" < 3; //false
"a" < 3; // false,因为"a"被转换成了 NaN

undefined < 1; // false,因为undefined会被转换成NaN
undefined > 1; // false
null < 1; // true,因为undefined会被转换成0
相等操作符

相等操作符有两组:相等和不相等—先转换再比较,全等和不全等—仅比较而不转换

== 和 != 两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性

《javascript高级程序设计》书中的规则是这样描述运算规则:

(1)如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值—false 转换为 0,而true 转换为 1;
(2)如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
(3)如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

这两个操作符在进行比较时则要遵循下列规则。
(4)null 和 undefined 是相等的。
(5)要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
(6)如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则,NaN 不等于 NaN。
(7)如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false。

相等运算图谱:

==> 图谱分析:
(1)null 和 undefined 是相等且不能将 null 和 undefined 转换成其他任何值
(2)对象是否相等由其指向决定
(3)boolean的本质依然是0和1,字符串和数值的比较要转成数值

null == undefined; // true
"NaN" == NaN; // false
5 == NaN; // false
NaN == NaN; // false
NaN != NaN; // true
false == 0; // true
true == 1; // true
true == 2; // false
undefined == 0; // false
null == 0; // false
"5" == 5; //true

=== 和 !== 两个操作符不会进行类型转换直接比较相等性

建议:在知晓变量类型的情况下使用全等和不全等进行判别

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87143.html

相关文章

  • JavaScript高级程序设计笔记:基本概念

    摘要:一写在前面最近重读高级程序设计,总结下来,查漏补缺。但这种影响是单向的修改命名参数不会改变中对应的值。这是因为对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。实际改变会同步,改变也会同步 一、写在前面 最近重读《JavaScript高级程序设计》,总结下来,查漏补缺。 二、JS简介 2.1 JS组成 ECMAscript:以ECMA-262为基础的语言,由...

    ygyooo 评论0 收藏0
  • JavaScript高级程序设计》(第3版)读书笔记 第3章

    摘要:本质上是由一组无序名值对组成的。浮点数值的最高精度是位小数,但在进行计算时其精度远远不如证书。例如这是使用基于数值的浮点计算的通病,并非独此一家数值范围。 函数名不能使用关键字(typeof不行但typeOf可以,区分大小写) 标识符就是指变量、函数、属性的名字,或者函数的参数。 第一个字符必须是一个字母、下划线(_)或者一个美元符号($) 其他字符可以是字母、下划线、美元符号或...

    renweihub 评论0 收藏0
  • 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    摘要:写在开头本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了。可移步笔者的文章中替换方式参考文档高级程序设计作者以乐之名本文原创,有不当的地方欢迎指出。 showImg(https://segmentfault.com/img/bVblGMc?w=600&h=400); 写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了。...

    iOS122 评论0 收藏0
  • Effective JavaScript读书笔记(一)

    摘要:如果为假值,不传或者传入,函数都会返回但是,传入这个值是完全有可能的,所以这种判断形势是不正确的或者使用来判断也可以原始类型优于封装类型对象拥有六个原始值基本类型布尔值,数字,字符串,,和对象。 作为一个前端新人,多读书读好书,夯实基础是十分重要的,正如盖楼房一样,底层稳固了,才能越垒越高。从开始学习到现在,基础的读了红宝书《JavaScript高级程序设计》,犀牛书《JavaScri...

    zhoutao 评论0 收藏0
  • JavaScript高级程序设计笔记:基本概念(三)

    摘要:数据类型中有种简单数据类型也称为基本数据类型和。因为特殊值被认为是一个空的对象引用。尽管和有这样的关系,但它们的用途完全不同。这样做不仅可以体现作为空对象指针的惯例,而且也有助于进一步区分和。 数据类型 ECMAScript中有5种简单数据类型(也称为基本数据类型):undefined,null,boolean,number和string。 typeof typeof null会返回o...

    jas0n 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<