最近一直在笔试面试,经常碰到例如 123=='123'、'abc'==true等问题,其中有答对的,也有答错的,主要原因还是对ECMAScript的规范没有理解清楚,很多题目没有具体分析所导致。现查阅资料后对此进行一些总结。

等性操作符(==)

1、比较的类型是String、Number、Boolean这几个基本类型时

当是这几中类型进行比较时,会先将两边转换成数字,在进行比较。

1 console.log(1 == true); // true转换成数字为1,因此结果为true
2
3 console.log('123' == 123); //true
4
5 console.log('abc' == true); //'abc'转换成数字为NaN,结果为false,ECMAScript规定,NaN与任何值比较都是false,包括NaN==NaN
6

2、上述基本类型与引用类型比较时

首先会调用对象的valueOf()方法,期待返回一个基本类型的值(测试为若返回Boolean、Number、String、null、undefined或没有返回值,则将不会继续调用toString方法),若返回的仍然是一个复合对象的话,则调用其toString()方法,若仍然没有返回上述基本类型的话,则直接判为不相等。

1 var obj = {};
2 console.log(obj == '1') //obj.valueOf()返回这个对象,因此接着调用obj.toString()返回'[object Object]'字符串,按基本类型的比较方式,都转换成数字,发现不相等,因此结果是false
3 //重写obj的toString方法
4 obj.toString() = function(){
5 return 1;
6 }
7 console.log(obj == '1'); //结果就为true了
8 console.log(obj == true); //结果也为true
 1 var obj = {
2 valueOf : function(){
3 console.log('first');
4 },
5 toString : function(){
6 console.log('second');
7 }
8 }
9 console.log(obj == 1); //结果为 first false
10
11 var obj = {
12 valueOf : function(){
13 console.log('first');
14 return null; //或者return undefined
15 },
16 toString : function(){
17 console.log('second');
18 }
19 }
20 console.log(obj == 1); //结果为 first false
21
22 var obj = {
23 valueOf : function(){
24 console.log('first');
25 return {}; //或者return其他复合对象
26 },
27 toString : function(){
28 console.log('second');
29 }
30 }
31 console.log(obj == 1); //结果为 first second false

对于undefined和null,ECMAScript规定null==undefined结果为true;在比较等性之前,不能将null和undefined转换成其他值。

1 console.log(null == undefined); //true
2 console.log(null == 0); //false
3 console.log(0 == undefined); //false

3、两个对象比较

若两个操作数指向同一个对象,则返回true,否则返回false。

关系操作符(<,>)

1、两边都是字符串

都是字符串时,按字符串对应的字符编码比较

1 console.log('abc'<'adc') //true

2、有一个操作数是数值

若有一个操作数是数值,则将另一个转换为数值进行比较

1 console.log('a' > 5); //‘a'转换为数值为NaN,结果为false
2 console.log('2.3' > 1); // true

3、有一个操作数是对象

调用该对象的valueOf方法,用返回的结果用前面的规则比较,若没有valueOf方法,则调用toString方法

 1 var obj = {};
2 console.log(obj < 5); //false
3 var obj = {
4 valueOf: function() {
5 console.log('first');
6 return 2;
7 },
8 toString: function() {
9 console.log('second');
10 }
11 }
12 console.log(obj < 5); //first true

4、有一个操作数是布尔值

将此布尔值转换成数值,再进行比较

1 console.log('3' > true); //true

与NaN比较的都将返回false

布尔操作符(!)

1、操作数是对象

任何对象都返回false

1 var obj = {};
2 console.log(!obj); //false

2、操作数是字符串

空字符串返回true,非空返回false

1 var a = 'OK';
2 var b = ' ';
3 var c = '';
4 console.log(!a); //false
5 console.log(!b); //false
6 console.log(!c); //true

3、操作数是数值

0返回true,非0(包括Infinity)返回false

4、操作数是null,undefined,NaN

返回true

1 console.log(!null); //true
2 console.log(!NaN); //true
3 console.log(!undefined); //true

js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则的更多相关文章

  1. JavaScript操作符(布尔操作符、乘性操作符和加性操作符)

    布尔操作符 布尔操作符用来测试两个值的关系,布尔操作符有三个,逻辑非(!).逻辑与(&&),逻辑或(||). 逻辑非由一个叹号(!)组成,可以应用于JavaScript任何值.逻辑非首 ...

  2. C# 使用布尔操作符

    布尔操作符(Boolean operator)是求值结果要么为true,要么为false的一种操作符.C#提供了几个非常有用的布尔操作符,其中最简单的是NOT(求反)操作符,它使用感叹号(!)来表示. ...

  3. JavaScript操作符(关系操作符、相等操作符和条件操作符)

    关系操作符用于对两个值进行比较,返回一个布尔值.关系操作符包括大于(>),小于(<),大于等于(>=),小于等于(<=).当关系操作符用于非数值时,也要先进行数值的转换.如 v ...

  4. Javascript 布尔操作符总结

    在一门编程语言中,布尔操作符的重要性堪比相等操作符.如果没有测试两个值关系的能力,那么诸如if...else和循环之类的语句就不会有用武之地了.在像javascript这样弱类型语言更有其妙用,让我们 ...

  5. ECMAScript布尔操作符

    在ECMAScript中提供了Boolean()转换函数以及三个布尔操作符,这三个布尔操作符分别为逻辑非.逻辑与.逻辑或,这三个操作符通常用作于某些值的求反,比较模式等.学好这一点知识也非常的重要,奠 ...

  6. RxJava2实战---第六章 条件操作符和布尔操作符

    RxJava2实战---第六章 条件操作符和布尔操作符 RxJava的条件操作符主要包括以下几个: amb():给定多个Observable,只让第一个发射数据的Obsrvable发射全部数据. de ...

  7. JavaScript布尔操作符

    布尔操作符 逻辑与 (&&) 逻辑与操作可以应用于任何类型的操作数,当有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值 如果第一个操作数是对象,则返回第二个操作数 如果第二 ...

  8. JS规则 我或你都可以 (逻辑或操作符)||逻辑或操作符,相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”

    我或你都可以 (逻辑或操作符) "||"逻辑或操作符,相当于生活中的"或者",当两个条件中有任一个条件满足,"逻辑或"的运算结果就为&quo ...

  9. Javascript赋值语句中的“&&”操作符和"||"操作符

    有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...

随机推荐

  1. windows下的文件到linux下乱码 iconv 修改文件编码

    conv [选项...] [文件...] 有如下选项可用: 输入/输出格式规范:-f, --from-code=名称 原始文本编码-t, --to-code=名称 输出编码 信息:-l, --list ...

  2. 《ASP.NET MVC4 WEB编程》学习笔记------.net mvc实现原理ActionResult/View

    ActionResult ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回 ...

  3. coco2dx加载网络图片并保存

    直接上代码 bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::i ...

  4. 4.python函数基础

    一.函数 1.函数简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...

  5. codeforces A. IQ Test 解题报告

    题目链接:http://codeforces.com/problemset/problem/328/A 一开始单纯地直接判断给出的序列是等差还是等比,连这一句“You should also prin ...

  6. 【python】继承时注意事项

    1. __init__ 注意事项 如果父类有__init__函数,子类没有,则子类自动调用父类__init__函数 如果父类有__init__函数,子类也有,则子类必须主动调用父类__init__函数 ...

  7. 【USACO】sprime

    有了前面的基础,做这道题真是so easy啊. 因为要分解后每个数都是素数,所以采用先生成短的素数,长的素数在短素数的基础上生成. 比如长度为1的素数只有 2 3 5 7, 那么符合要求的长度为2的素 ...

  8. [转]有关USES_CONVERSION

    转自:http://blog.csdn.net/p40614021/article/details/6778100 ATL:转换宏是各种字符编码之间进行转换的一种很方便的方式,在函数调用时,它们显得非 ...

  9. java基础知识回顾之javaIO类总结

    java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...

  10. Linux内核NAPI机制分析

    转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用 ...