
正文
javascript等,JavaScript等待三秒
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JavaScript里面三个等号和两个等号的区别
== equality 等同,=== identity 恒等。
==, 两边值类型不同的时候,要先进行类型转换,再比较。
==,不做类型转换,类型不同的一定不等。
下面分别说明:
先说 ===,这个比较简单。下面的规则用来判断两个值是否===相等:
1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同一个值,那么[相等];(!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
6、如果两个值都是null,或者都是undefined,那么[相等]。
再说 ==,根据以下规则:
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
a、如果一个是null、一个是undefined,那么[相等]。
b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
d、如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。非js核心的对象,令说(比较麻 烦,我也不大懂)
e、任何其他组合,都[不相等]。
举例:
"1" == true
类型不等,true会先转换成数值 1,现在变成 "1" == 1,再把"1"转换成 1,比较 1 == 1, 相等。
= 赋值运算符
== 等于
=== 严格等于
例:
var a = 3;
var b = "3";
a==b 返回 true
a===b 返回 false
因为a,b的类型不一样
===用来进行严格的比较判断
相关问答
Q1: javascript等对于普通使用者来说?
在技术普及的前提下,javascript 在用户端变的非常重要,你会发现几乎所有的游览器都默认是启用javascript的,web2.0技术中javascript占了支撑作用,可以得知只要是新网站都需要javascript的支持.如果你禁用你会发现qq主页无法正常显示,163,yahoo,gmail等邮箱都无法使用.baidu知道无法登陆.几乎所有的页面都无法得到正常显示.
这不是危言耸听. 您可以在ie中的高级菜单中禁止javascript的使用 然后再看网页.
关于病毒,主要是你没有及时更新系统补丁(ie用户,所有核心是ie的,遨游也是ie核心).所以前提是你更新的足够,并不进一写带色等级的网站一般就没事了.
Q2: 你不知道的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来转成基本类型,再比较。







