你不知道的Javascript等号运算符

如题所述

JavaScript中共有2个个判断相等的运算符== 和 ===。

这2个运算符的差别在于==在判断相等的时候会进行类型的转换,而===则不会进行类型转换。

一、===运算符

===一般称之为严格相等。用来判断两个操作数是否严格相等。

判断规则:

首先判断两个操作数的类型是否一致,如果不一致就直接认为不等。

如果两个操作数的类型一致,则再判断内容是否相等。

"true"===true// 类型不一致, false

"0"===0//类型不一致 false

"1"==="1"//类型一致,并且内容也一致。 true

注意:

如果使用===判断2个对象类型的数据,则直接判断这 2 个对象是否为同一个对象。

如果一边是对象类型,一边是基本类型则一定不等。

{} === {} // 两边都是对象,但是不是同一个对象,所以 false

[] === [] // 两边都是对象,但是不是同一个对象,所以 false

[] ===""// 一变是对象类型,一边是基本类型,所以false

二、==运算符

==运算符判断相等,由于涉及到类型的强制转换,所以最为复杂。

需要从4个方面来进行分析:

两边都是基本类型,且类型相同

两边都是对象

两边都是基本类型,但是类型不同

一边是基本类型,一边是对象


2.1 两边都是基本类型,且类型相同

这个最简单,就看内容是否相等即可。

2.2 两边都是对象

这个也简单,规则和===一样,也是判断两个对象是否为同一个对象。

2.3 两边都是基本类型,但是类型不同

这个规则比较复杂,很多人也记不住那么多的规则。

经过我的分析和总结,其实这个规则只有一条:

2.4 一边是基本类型,一边是对象

这个规则也比较复杂,需要以2.3的规则为基础。

经过我的分析和总结,其实规则只有 2 条:

这种情况比较的时候,都是先把对象转换成基本类型再去比较!

先调用对象的valueOf方法,如果返回值值是基本类型的数据,就用这个返回的基本类型的数据去比较。

如果valueOf方法的返回值不是基本类型的数据,则调用toString方法,然后使用toString的返回值进行比较。

注意:关于valueOf和toString方法的说明:

这个两个方法是在Object.prototype对象中定义的,所以所有的对象都会继承这两个方法。

默认情况下valueOf是返回的这个对象的本身(内部其实是返回的this)。

默认情况下toString返回的是字符串: [object Object]

但是有些内置对象 覆写 了这2个方法。

console.log([1,2].toString()); // "1,2" 返回的是数组的元素用,连接起来的字符串

console.log(/a/gi.toString()); // "/a/gi" 正则表达式的字面量字符串

console.log((function(){//注释}).toString()); // "function(){//注释}" 返回函数源码

console.log(newNumber(10).toString()); // "10" 返回对应的基本类型的字面量形式

console.log(({}).toString()); // "[object Object]"

看下面的代码:

varobj1 = {

name :"李四"

}

/*

true:

解析: 一边是对象,一边是字符串。则会把对象转换成基本类型。

先看valueOf ,默认返回的是 对象,所以再看toString 默认返回的是 "[object Object]" 所以是true

*/

console.log(obj1 =="[object Object]"); // true

varobj1 = {

name :"李四",

valueOf :function(){

return1;

}

}

/*

true:

解析: 一边是对象,一边是number。则会把对象转换成基本类型。 先看valueOf ,返回的是 number类型 1,所以用这个返回值去比较。

*/

console.log(obj1 ==1); // true

varobj1 = {

name :"李四",

valueOf :function(){ //覆写

return{};

},

toString :function(){// 覆写

returnthis.name;

}

}

/*

true:

解析: 一边是对象,一边是String。则会把对象转换成基本类型。 先看valueOf ,返回的是 对象,所以调用toString,返回的是字符串 "李四"。

*/

console.log(obj1 =="李四"); // true

vararr = [1,2];

/*

true:

解析: 一边是对象,一边是字符串。则会把对象转换成基本类型。 先看valueOf ,默认返回的是 对象,所以调用toString,返回的是字符串 "1,2"。

*/

console.log(arr =="1,2"); // true

vararr = [1,2];

arr.valueOf =function(){

returntrue;

}

/*

true:

解析: 一边是对象,一边是字符串。则会把对象转换成基本类型。 先看valueOf ,默认返回的是 布尔值 true,然后把true转换成number 1,

右边是字符串,然后把字符串转换number 1

所以true

*/

console.log(arr =="1");

三、总结

===一句话总结:先看类型,类型相同再比较内容。类型不同,直接false

==一句话总结:不同基本类型,则都向numbe方向转,然后比较。 一边对象一边基本类型,则对象先调用valueOf,再调用toString来转成基本类型,再比较。

温馨提示:内容为网友见解,仅供参考
无其他回答

你不知道的Javascript等号运算符
JavaScript中共有2个个判断相等的运算符== 和 ===。这2个运算符的差别在于==在判断相等的时候会进行类型的转换,而===则不会进行类型转换。一、===运算符 ===一般称之为严格相等。用来判断两个操作数是否严格相等。判断规则:首先判断两个操作数的类型是否一致,如果不一致就直接认为不等。如果两...

请问js代码中等于或不等于如何表达呢???
相等运算符是==,不等于运算符是!= 你那个问题中为什么要indexOf(.)呢,你完全可以直接indexOf('abc.asp'),不是直接就可以知道是不是这个页了么 试试这样解决 function change(){ var loca = this.parent.document.getElementById("aa").contentWindow.location;if(loca.href.toLowerCase().index...

在javascript中==和===的区别
==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase。举例说明:"1" == true 类型不同,"=="将先做类型转换,把true转换为1,即为 "1" == 1;此时,类型仍不同,继续进行类型转换,把"1"转换为1,即为 1 == 1;此时,"...

javascript 中的? :语句 表示什么意思?
其中,var是javascript的保留字,表面接下来是变量说明,变量名表是用户自定义标识符,变量之间用逗号分开。和C++等程序不同,在javascript中,变量说明不需要给出变量的数据类型。此外,变量也可以不说明而直接使用。 3、作用域 变量的作用域由声明变量的位置决定,决定哪些脚本命令可访问该变量。在函数外部声明的变量称为全局...

你也太捞了吧!Java的五种运算符 还不知道?盘它!
逻辑运算符:&、|、!、^、&&、||。其中&表示逻辑与,|表示逻辑或,!表示逻辑非,^表示逻辑异或,&&和||表示逻辑与和或,具有短路操作特性。位运算符包括:&、|、~、^、>>、>>>、<<。这些运算符在二进制中进行操作,遵循特定规则,如位与、位或、位非、位异或等。总结,本文详细介绍了Java中...

Web前端工程师应该知道的提高JavaScript技能的技巧!
08、恒等运算符(===)与相等运算符(==)大家一定要知道JavaScript中的恒等运算符(===)和相等运算符(==)之间的区别!==运算符在比较值之前会进行类型转换,而===运算符在比较之前不会进行任何类型转换。console.log(0=='0');\/\/trueconsole.log(0==='0');\/\/false09、对象比较我看到JavaScript新手所犯的...

在js中,为什么!0是true,!!0是false,!1是false,!!1是true,!-1是false...
1、双等号==:(1)如果两个值类型相同,再进行三个等号(===)的比较。(2)如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:如果一个是null,一个是undefined,那么相等。如果一个是字符串,一个是数值,把字符串转换成数值之后再进行比较。2、 三等号===:(1)如果类型...

javascript 的 "!function" 是什么意思?
(function(){do something...})()\/\/或 (function(){do something...}())而匿名函数后面的小括号()是为了让匿名函数立即执行,其实就是一个函数调用。这样写会报错:function(){alert(1)}()因为function前面没有(或者! ~之类的运算符,js解析器会试图将关键字function解析成函数声明语句,而不是...

请问这段javascript 代码是什么意思?为什么能输出汉字。
运算符用红色标出,有一点可能大家会意识不到,其实中括号[]也是一个运算符,用来通过索引访问数组项,另外也可以访问字符串的子字符,有点类似charAt方法,如:'abcd'[1] \/\/ 返回'b'。而且中括号的优先级还是最高的哦。预处理结束,接下来需要运用的就是javascript的类型转化知识了。我们先说说什么...

JavaScript里面1%4是不是等于3?
不是, 是 1 .1 % 4 = 1 2 % 4 = 2 3 % 4 = 3 4 % 4 = 0 基本上所有程序语言对 % 操作符的处理都是这样的 当要处理 X % Y时, 如果, X < Y 的话, 回传值就是 X 自己 意思... 简单来说, 就是因为当一次都除不到, 就只能剩下 "自己" 了....

相似回答