在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. 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)

    之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...

  2. Jmeter遇到的坑

    一.分布式获取不到结果需要改配置文件   在jmeter.properties文件找到mode=Standard去掉# 二.有一个请求要循环查询进度,当进度为100为,跳出循环.这个要怎么操作? ${ ...

  3. jmeter系列-------脚本编写格式

    1.通常会将用户和服务器的一次交互(页面访问或者提交)请求放在一个简单控制器或者事务控制器,例如微课首页里面包含4个接口都放到简单控制器里 或者一个提交可能,会触发3个接口,那么这3个接口放到一个简单 ...

  4. C# 单例模式(Singleton Pattern)(转SuagrMatl)

    单例模式的定义: 确保一个类只有一个实例,并提供一个全局访问点. 首先实例大家应该都明白就是类生成对象的过程简单的就是String s=new String(),则s就是个实例. Q:如何只生成一个实 ...

  5. Intellij Idea 13 快捷键(与Eclipse比对)以及基本的设置

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt404 刚到新公司,用的台式机配置不给力,Eclipse很不给力,几个项目一起 ...

  6. Jquery的入门学习

    jQuery API中文文档地址 http://www.jquery123.com/ Jquery w3school教程 http://www.w3school.com.cn/jquery/index ...

  7. 移动端图片放大滑动查看-插件photoswipe的使用

    最近在开发项目的时候,遇到一个需求,需要移动端实现放大查看图片的功能,然后我就在网上搜索了一下资料,看到了photoswipe这个插件,后来试了试,确实挺好用的,它可以实现手势放大缩小查看图片,左右滑 ...

  8. jQuery插件——ajax

    一.ajax请求 1.load(url, [data], [callback]) 概述:加载远程的HTML文件代码,并插入到指定的DOM节点中. 参数:url:待装入 HTML 网页网址. data: ...

  9. 交换机的Ethernet Channel

    端口聚合也叫做以太通道(ethernet channel),主要用于交换机之间连接.由于两个交换机之间有多条冗余链路的时候,STP会将其中的几条链路关闭,只保留一条,这样可以避免二层的环 路产生.但是 ...

  10. 控制结构(9) 管道(pipeline)

    // 上一篇:线性化(linearization) // 下一篇:指令序列(opcode) 最近阅读了酷壳上的一篇深度好文:LINUX PID 1 和 SYSTEMD.这篇文章介绍了systemd干掉 ...