<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
,或NaN
为false
,其他为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
undefined
和null
比较特殊,除了自身绝对相等以外,它们之间还相等。
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
string
与number
相等比较时,会自动转换为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
与其他相等比较时,会自动将两边转换为number
或string
数据进行比较。
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
undefined
和null
与自身严格相等。
undefined === undefined // true
null === null // true
由于变量声明后默认值是undefined
,因此两个只声明未赋值的变量是相等的。
var v1;
var v2;
v1 === v2 // true