在JS中,"==="叫做严格运算符,"=="叫做相等运算符。

它们的区别是相等运算符(==)比较两个值是否相等,严格相等运算符(===)比较它们是否为“同一个值”。

如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转化成同一个类型,再用严格相等运算符进行比较。

严格运算符的运算规则如下:

(1)不同类型值 如果两个值的类型不同,直接返回false。

18 === "18";// false
"true"=== true; // false
1===1; //true

(2)同一类的原始类型值 同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。

NaN === NaN;  // false
//NaN与任何值都不相等;(包括自身)
+0 === -0; // true

(3)同一类的复合类型值  两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。

{} === {}; // false
[] === []; // false
(function (){} === function (){}); // false
var v1 = {};
var v2 = v1;
v1 === v2; // true
//两个变量引用同一个对象,则它们相等

(4)undefined和null  undefined 和 null 与自身严格相等。

undefined === undefined; // true
null === null; // true
var v1;
var v2;
v1 === v2; // true
//变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。

相等运算符在比较相同类型的数据时,与严格相等运算符完全一样。

在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:

(1)原始类型的值  原始类型的数据会转换成数值类型再进行比较。字符串和布尔值都会转换成数值.

1 == true; // true
// 等同于 1 === 1 0 == false; // true
// 等同于 0 === 0 2 == true; // false
// 等同于 2 === 1 2 == false; // false
// 等同于 2 === 0 'true' == true; // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1 '' == 0; // true
// 等同于 Number('') === 0
// 等同于 0 === 0 '' == false; // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0 '1' == true; // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1 '\n 123 \t' == 123; // true
// 因为字符串转为数字时,省略前置和后置的空格

(2)对象与原始类型值比较  对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。

(3)undefined和null  undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。

false == null; // false
false == undefined; // false 0 == null; // false
0 == undefined; // false undefined == null; // true

特别提醒:相等运算符的缺点

1.相等运算符隐藏的类型转换,会带来一些违反直觉的结果。

'' == '0'  ;         // false
0 == ''; // true
0 == '0' ; // true 2 == true ; // false
2 == false; // false false == 'false' ; // false
false == '0' ; // true false == undefined; // false
false == null; // false
null == undefined ; // true ' \t\r\n ' == 0; // true

2.使用相等运算符可能会对后续代码造成意外影响.

var a = undefined;
if(a == null){
console.log("1"); //
}
var a = undefined;
if(a === null){
console.log("1"); //无输出
}//使用不当,执行意图发生改变.

总结:建议尽量使用严格相等运算符。

推荐一下阮一峰的文章:http://javascript.ruanyifeng.com/grammar/operator.html#toc9

Javascript 中 ==(相等运算符) 和 ===(严格相等运算符) 区别的更多相关文章

  1. javascript中apply、call和bind的区别,容量理解,值得转!

    a)  javascript中apply.call和bind的区别:http://www.cnblogs.com/cosiray/p/4512969.html b)  深入浅出 妙用Javascrip ...

  2. javascript中三目运算符和if else有什么区别

    javascript中三目运算符和if else有什么区别今天写了一个图片轮播的小demo,用到了判断先试了一下if else,代码如下:if(n >= count-1){n =0;}else{ ...

  3. JavaScript中var和this定义变量的区别

    JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...

  4. javascript中back(-1)和go(-1)的区别

    javascript中back(-1)和go(-1)的区别 一.总结 一句话总结: 数据 history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1 ...

  5. JavaScript中基本数据类型和引用数据类型的区别(栈——堆)

    JavaScript中基本数据类型和引用数据类型的区别 1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据 ...

  6. Javascript 中 null、NaN和undefined的区别

    1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码 var a1; var a2 = tr ...

  7. javascript 中加’var‘和不加'var'的区别,你真的懂吗?

    没看之前千万别说我是标题党,这个问题真的有好多淫都不懂!!! 大家都看了很多文章,都说避免隐式声明全局变量,就是说声明变量前必须加'var',那加了'var'和不加'var'到底有啥区别呢? 先来看一 ...

  8. Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...

  9. javascript中加var和不加var的区别

    Javascript是遵循ECMAScript标准下的一个产物,自然ECMAScript的标准其要遵循. 先来看下var关键字的定义和用法 var 语句用于声明变量. JavaScript 变量的创建 ...

  10. javascript中函数声明与函数表达式的区别

    javascript中声明函数的方法有两种:函数声明式和函数表达式.究竟他们用起来有什么区别呢? 区别如下: (1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. (2) ...

随机推荐

  1. 关于RequestDispatcher的原理

    RequestDispatcher简介 RequestDispatcher 代表请求的派发者.它有2个动作:forward 和 include .客户端对于任何一个请求,可以根据业务逻辑需要,选择不同 ...

  2. SVN 通过IIS设置反向代理访问

    原因 一个字,穷,没办法,只有一台机器 要当测试服务器还要做源码管理. 解决办法 通过IIS配置反向代理访问SVN,给SVN访问的HTTPS绑定上域名,就可以正常访问了. 1.修改SVN配置 把SVN ...

  3. CAP和BASE理论

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt370 1. CAP理论 2000年7月,加州大学伯克利分校的Eric Bre ...

  4. IOS学习[Swift中跳转与传值]

    Swift中页面跳转与传值: 1.简单方式 首先,Swift的跳转可分为利用xib文件跳转与storyboard跳转两种方法,我这里选择使用storyboard的界面跳转方法. 1.通过在storyb ...

  5. PHP初入--添加内容到框框里并删除

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  6. js模拟点击事件实现代码

    js模拟点击事件实现代码 类型:转载 时间:2012-11-06 在实际的应用开发中,我们会常常用到JS的模事件,比如说点击事件,举个简单的例子,点击表单外的"提交"按钮来提交表单 ...

  7. OSX 10.8+下开启Web 共享 的方法

    MENU Home Archives About SUBSCRIBE ☰MENU OSX 10.8+ Mountain Lion 下开启 Web Sharing(Web 共享)的方法 JUL 28, ...

  8. 转:【Java并发编程】之二:线程中断(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17091267 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应 ...

  9. java aio nio bio

    转自:http://blog.csdn.NET/liuxiao723846/article/details/45066095 Java中的IO主要源自于网络和本地文件 IO的方式通常分为几种,同步阻塞 ...

  10. 团队作业8——第二次项目冲刺(Beta阶段)5.18

    1.当天站立式会议照片 会议内容: 本次会议为第一次会议 本次会议在陆大楼2楼召开,本次会议内容: ①:部署第二次敏捷冲刺的计划 ②:做第一天任务的详细分工 ③:规定完成时间是在第二天之前 ④:遇到困 ...