if判断、==判断和===判断

<1>if判断语句

1.if判断的介绍

  • if语句是用来进行判断的,其使用格式如下:
if(判断条件):
    条件成立时,要执行的代码

对于括号内的判断条件,会被强制转化成Boolean来判断。
所以,判断条件如何转换,转换后的结果是哪个Boolean值,就需要我们去了解了。

2.if的判断条件转换

对于判断条件的转换,可以参考下面的表格:

数据类型 转换结果
undefined false
null false
Boolean 直接判断
number +0,-0,或NaN为false,其他为true
string 空字符串为false,其他为true
object true

下面是各个数据类型进行判断时的转换:
(1)undefined

if(a)
  console.log("yes")
else
  console.log("no") //返回no

因为a为声明的全局变量,由于变量声明后默认值是undefined,因此转化为false。当if判断条件成功,即为true时,返回yes,否则返回no

(2)null

if(document.getElementById('notExistElement'))
  console.log("yes")
else
  console.log("no") //返回no

因为我们尝试获取一个不存在的对象,所以用null代替,因此document.getElementById('notExistElement')转化为false。当if判断条件成功,即为true时,返回yes,否则返回no

(3)Boolean

if(true)
  console.log("yes")
else
  console.log("no") //返回yes

因为给予了if判断条件true值,当if判断条件成功,即为true时,就直接返回了yes。反之,若给予false,则返回no

(4)number

if(0)
  console.log("yes")
else
  console.log("no") //返回no

if(1)
  console.log("yes")
else
  console.log("no") //返回yes

因为数值+0,-0,或NaNfalse,其他为true,当if判断条件成功,即为true时,就直接返回了yes,否则返回no

(5)string

if("")
  console.log("yes")
else
  console.log("no") //返回no

if(" ")
  console.log("yes")
else
  console.log("no") //返回yes

空字符串为false,其他为true" "因为中间有空格,不是空字符串,当if判断条件成功,即为true时,就直接返回了yes,否则返回no

(6)object

if([])
  console.log("yes")
else
  console.log("no") //返回yes

if({})
  console.log("yes")
else
  console.log("no") //返回yes

对象直接转换为true,所以就直接返回了yes

<2>比较运算符

  • JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符。
    对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true
    而对于被广泛使用的比较运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型。
    对于关系运算符(比如 <=)来说,会先将操作数转为原始值,使它们类型相同,再进行比较运算。

1.==运算符

比较运算符会为两个不同类型的操作数转换类型,然后进行严格比较。
当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同。
比较运算符的类型转换,可以参考下面的表格:

左边 右边 结果
undefined null true (这个比较特殊)
NaN NaN false (NaN和任何值不相等,包括其自身)
number string string转换为number,然后进行比较
Boolean (any) Boolean转为number,然后进行比较
string object object转为string,然后进行比较
number object object转为number,然后进行比较
其他 其他 false

对于number转换,可以参考下表

数据类型 转换结果
undefined NaN
null 0
true 1
false 0
"123" 123
"abc" NaN

对于对象的数据转换,先调用valueof获取结果,没有则调用toString()。当对象为空时,toString得到的结果是[object object]

下面是各个数据类型进行比较时的例子:
(1)undefined 和 null
undefinednull比较特殊,除了自身绝对相等以外,它们之间还相等。

undefined === undefined // true
null === null // true
undefined == null  // true

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

NaN == NaN  // false

NaN与任何值都不相等(包括自身)

12 == 12  // true
12 == 34  // false

同一类型的number会直接进行数值比较

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

{} == {} // false
[] == [] // false
(function () {} == function () {}) // false

因为运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false

如果两个变量引用同一个对象,则它们相等。

var v1 = {};
var v2 = v1;
v1 == v2 // true

对于两个对象的比较,相等运算符比较的是地址

(4)number 和 string

123 == "123"  // true

stringnumber相等比较时,会自动转换为number数据进行比较。

(5)Boolean 和 其他类型比较

true == "true"  // 返回false,表达式等同 Number(true) === Number("true") --> 1 === NaN
0 == false  //返回true,表达式等同 0 === Number(false)--> 0 === 0
"" == false  //返回true,表达式等同 Number("") === Number(false)--> 0 === 0

Boolean与其他相等比较时,会自动将两边转换为number数据进行比较。

(6)object 和 其他类型比较

[1] == 1  // 返回true,表达式等同 Number([1]) === 1 --> 1 === 1
[1] == "1"  //返回true,表达式等同 String([1]) == "1"--> "1" === "1"
[1] == false  //返回false,表达式等同 Number([1]) === Number(false)--> 1 === 0

object与其他相等比较时,会自动将两边转换为numberstring数据进行比较。

2.===运算符

严格相等运算符会为两个操作数进行严格比较,类型也会进行严格比较。
下面是各个数据类型进行比较时的例子:
(1)不同类型的值
如果两个值的类型不同,直接返回false

1 === "1" // false
true === "true" // false

上面的代码因为类型不同,所以结果都是false

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

1 === 0x1 // true

上面代码比较十进制的1与十六进制的1,因为类型和值都相同,返回true

NaN === NaN  // false
+0 === -0 // true

NaN与任何值都不相等(包括自身)。另外,正0等于负0

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

{} === {} // false
[] === [] // false
(function () {} === function () {}) // false

因为运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false

如果两个变量引用同一个对象,则它们相等。

var v1 = {};
var v2 = v1;
v1 === v2 // true

对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值。

var obj1 = {};
var obj2 = {};

obj1 > obj2 // false
obj1 < obj2 // false
obj1 === obj2 // false

上面的三个比较,前两个比较的是值,最后一个比较的是地址,所以都返回false

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

undefined === undefined // true
null === null // true

由于变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。

var v1;
var v2;
v1 === v2 // true
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容