JS中“==”和“===”的区别(未完成)

1、为什么讨论这个问题?

- 有个说法,尽量不用==,而使用===,是这样吗?

2、分析问题,原理是什么?

  下面说说ECMAScript 5 language specification里的说明:

  1)两种比较方法

    全等号===只考虑类型相同的值的比较,不同类型使用===进行比较,返回false

    双等号==会先将不同类型的值转为相同类型,然后使用全等号进行比较。

    使用双等号会有两个问题:

    ● 转换规则可能不是你期望的那样

    ● 由于双等号是宽容的,类型错误可能会被忽略掉。

  2)全等号===(严格等号)

    比较两个值,

    如果类型不同,一定返回false;

    如果类型相同,则按照如下的规则进行比较:

      ① 两个都是undefined类型,返回true;(undefined === undefined)

      ② 两个都是null类型,返回true;(null === null)

      ③ 两个都是number类型

        如果有一个是NaN,则为false;(Nan !== *//any value including NaN)

        如果两个值相同,返回true;(x==x)

        一个是+0,一个是-0(+0===-0)

      ④ 两个都是boolean类型或者两个都是string类型(基础数据类型,不是String对象),答案很明显。

        "111" === "111"//true

        true === true//true

      ⑤ 两个对象(包括array和function),除非是同一个对象(即同一个引用),否则都是false

        var a = NaN;

        a === a;//false(NaN无法用来比较)

        

        var b = {}, c = {};

        b === c;//false

        b === b;//true

        "abc" = new String("abc");//false(左边是基本数据类型string,后边是object类型)

        注:ECMAScript中有5种基本数据类型(Undefined、Null、Boolean、Number、String)

          还有1种复杂数据类型Object。

  3)双等号==

     比较两个值,如果两个值类型相同,则使用===进行对比;

     如果两个值类型不同,则按照一下规则进行比较:

      ① undefined == null

      ② 一个number,一个string,将string转换成number类型再做比较;

      ③ 一个boolean,一个非boolean,将boolean转换成number类型再做比较;

      ④ 一个string或者number,跟一个object,将object转换成基本数据类型再做比较;

     第三条规则会导致大于1的number值不等于true,比如:

      0 == false//true

      1 == true//true

      2 == true//false(true -- > 1 ; 2 != 1)

      2 ? true : false//true

        "" == 0;//true

      "123" == 123;//true

      "" == false//true(false-->0;""-->0;0==0)

      "1" == true//true

      "2" == true//false(true-->1;"2"-->2;2!=1)

      "true" == true//false(true-->1;"true"-->NaN;1!=NaN)

      "2" ? true : false//true(because string is non-empty)
      "abc" == new String("abc")//true(object->string)

3、得出结论和建议?

    鉴于==的对比规则会出现一些意想不到的结果,建议尽量多使用===,而非==。

参考文章:

http://www.2ality.com/2011/06/javascript-equality.html

时间: 2024-10-12 02:57:24

JS中“==”和“===”的区别(未完成)的相关文章

js中==和===的区别

前两天遇到一道面试题,甚为不解,于是学习了下. 题目: <script> var x=5 ; var y='5' ; alert(x == y) ; alert(x !== y) ; alert(x === y) ; </script> 结果输入为:true true false 为什么呢? 首先要理解: == ,===区别 ==两边值类型不同的时候,要先进行类型转换,再比较. ===不做类型转换,类型不同的一定不等. ==和===的规则如下: 先说===,这个比较简单,具体比较规

js中!和!!的区别及用法

js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,1.!可将变量转换成boolean类型,null.undefined和空字符串取反都为false,其余都为true. 1 !null=true 2 3 !undefined=true 4 5 !''=true 6 7 !100=false 8 9 !'abc'=false 2.!!常常用来做类型判断,在第一步!(变量)之后再做逻辑取反运算,在js中新手常常会写这样臃肿的代码:判断变量a为非空,未定

js中null &quot; &quot;的区别

var val=text.value; if(val=="") alert("请输入内容哦!"); var val=text.value; if(val==null) alert("请输入内容哦!"); var val=text.value; if(!val) alert("请输入内容哦!"); 这些意味着"空"的语句之前一直困扰着我,,分不清啊!!在一番了解后,写下他们的区别: val== ''   &q

在js中==和===的区别

“==”:叫相等运算符 “===”:叫严格运算符 它们两有什么区别呢? == :表示值相等则都为true ===:表示 不仅要值相等,双方类型也要相等才为true 例子如下: js代码如下: // “==”比较测试,只要内容相同 console.log(1 == 1);//两个参数都是数字1作比较,打印结果为true console.log(1 == '1');//两个参数一个是数字1,一个是字符1,打印结果也为true // "==="比较测试,不仅要类型相同,类型也要相同 cons

Js 中 == 与 === 的区别

1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直接进行“值”比较,两者结果一样 2.对于Array,Object等高级类型,==和===是没有区别的 进行“指针地址”比较 3.基础类型与高级类型,==和===是有区别的 1)对于==,将高级转化为基础类型,进行“值”比较 2)因为类型不同,===结果为false

js中const,var,let区别

今天面试,被问了个问题,const, var, let的区别,当时就懵圈了,var 知道,const.let 是什么鬼??? 回来一百度,找到一篇通俗易懂的介绍,先取之收藏,以备忘.主要内容是:js中三种定义变量的方式const, var, let的区别. 摘自:http://www.cnblogs.com/ksl666/p/5944718.html 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 c

JS中NULL和undifined区别及NULL的作用

1.博客地址:http://www.cnblogs.com/eastday/archive/2010/03/03/1677324.html 2.参考地址2:https://www.zhihu.com/question/35677602/answer/63984217 JS中Null与Undefined的区别 在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined?

js中callback.call()和callback()的区别

js中callback.call()和callback()的区别在js中callback.call()和callback() 有什么区别,举个例子:function a(){alert('hello!');}function b(callback){callback();}function c(callback){callback.call();}function test(){b(a);c(a);}在test函数中,b和c的效果是一样的,都执行了回调函数a.这两种用法有什么区别呢? -----

js中return、return true、return false的区别

js中return.return true.return false;区别 一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  二.返回控制, 无函数结果,语法为:return;  在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转到该元素href属性指定的页.    Return False 就相当于终止符,Return True 就相当于执行符.