if 语句
if (condition) statement1 else statement2
这里的condition可以是任意表达式,表达式求值后, js会自动将此值(这个值可以不是布尔值) 转换为布尔值
-
关于这个如何将这个值转换为布尔值遵循以下规则:
数据类型 转换为true的值 转换为false的值 Boolean true false String 非空字符串 "" Number 任何非0的数字值(包括无穷大) 0和NaN Object 任何对象 null Undefined n/a undefined var a = "0"; if (a) { console.log("我是灰太狼") } else { console.log("我是喜洋洋") } /*输出 我是灰太狼*/
这里的"0" 不是空字符串,是一个值为0 的字符串
var a = 0; if (a) { console.log("我是灰太狼") } else { console.log("我是喜洋洋") } /*输出 我是喜洋洋*/
这里的0 是一个值为0 的number ,转换为布尔值时是false.所以执行else里的内容
if(" "){ console.log("hello world") } else { console.log("haha") } /* 输出 "hello world" */
空白字符串在转换为布尔值时是true,所以输出"hello world"
if(""){ console.log("hello world") } else { console.log("haha") } /* 输出 haha */
空字符串在转换为布尔值时为FALSE
var a = 1; if(a = 2){ console.log("hello world") } console.log(a) /* 输出 "hello world" 2 */
这里的if ( ) 里的是赋值语句,故为TRUE,且a 的值改变了
var a = 1; if(a == 2){ console.log("hello world") } console.log(a) /* 输出 1 */
if ( ) 里的判断语句是 "相等"判断,number不相等,故为FALSE,只输出1
var a = "2"; if(a == 2){ console.log("hello world") } console.log(a) /* 输出 "hello world" "2" */
if ( ) 里的判断语句是 "相等"判断,会进行类型转换式的比较,故也为TRUE
var a = "2"; if(a === 2){ console.log("hello world") } console.log(a) /* "2" */
这里是进行全等判断,所以类型和值有一个不相等,即为FALSE
相等 == 判断
相等 ==
在比较操作数时通常会进行“强制类型转换”在进行比较
转换规则是尽量往数值上转换(一般体现在两边操作数类型不同时,对象和NaN见下面),具体遵循以下规则:
其中一个操作数是布尔值的话,将布尔值转换为数值,true为1 , false 为 0
如果有一个字符串,另一个操作数是数字,将字符串转换为数值,字符串" 2" 转换为 2, 字符串"a" 转换为 NaN
如果有一个操作数是对象,调用其valueOf()方法(此方法返回对象的字符串、数值或布尔值表示,通常与toString()方法返回值相同),再依照上面所述进行基本类型转换
(各对象valueOf()方法返回类型值)
对象 | 返回值 |
---|---|
Array | 返回数组对象本身 |
Boolean | 布尔值 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC |
Function | 函数本身 |
Number | 数字值 |
Object | 对象本身,这是默认情况 |
String | 字符串值 |
Math 和 Error | 没有 valueOf 方法 |
null 和 defined 相等
如果有一个操作数时NaN,则返回false
NaN与NaN是不相等的
如果操作数均是对象,如果指向同一个对象则相等(指的是保存对象的地址相同的变量),这种
{} == {}
是不相等的。
所以一般是使用 ===
来进行判断