关于if(xx)和 a==b的判断
if 的判断
if(xxx){
}
对于括号里的表达式,会被强制转换为布尔类型。
类型 | 结果 |
---|---|
Undefined | false |
Null | false |
Boolean | 直接判断 |
Number | +0,-0,或者 NaN 为 false,其他为 true |
String | 空字符串为 false,其他都为 true |
Object | true |
结果为 true 的只有:
- Object
- 除空字符串以外的 String
- 除 +0,-0 和 NaN 以外的 Number
结果为 false 的:undefined、null、boolean 直接判断、+0,-0 或者 NaN、空字符串。
a==b的判断
- 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同
1.如果一个是null,一个是undefined,那么相等
2.如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
3.如果一个值是true/false则将其转为1/0比较
4.如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
5.其它就不相等了
详解:
x | y | 结果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
otherwise | otherwise | false |
toNumber:
type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | true --> 1,false --> 0 |
String | "abc" --> NaN,"123" --> 123 |
toPrimitive
对于 Object 类型,先尝试调用 .valueOf 方法获取结果。 如果没定义,再尝试调用 .toString方法获取结果
以下代码输出结果是? 为什么
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//输出"number2",因为typeof优先级高先计算,结果是'number'加上2,得到结果。
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//输出undifined
var data2 = d = 0 || console.log('haha')
console.log(data2)
//未完待续
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
遍历数组,打印数组里的每一项的平方。
var arr = [3,4,5]
使用for in
var arr = [3,4,5] ;
for(var a in arr) {
console.log(arr[a]*arr[a]);
}
以下代码的输出结果是? 为什么?
var a = 1;
var b = 3;
console.log( a+++b );
switch case 语句中的 break 有什么作用?
如果表达式等于 case 的值,对应的语句就会执行,break 关键字会使程序跳出 switch 语句,很多编程规范强调必须添加 break,不添加不会有语法错误,程序会多次判断 case,进入相应流程。
没有一个值符合case,流程进入 default 子句,很多规范也强调必须添加default部分
JavaScript switch语句虽然参考的C语言的写法,但是有特殊性:
- switch 和 case 可以使用任意表达式,不一定是常量
- switch 语句进行比较的时候是全等于(===)操作,不会发生类型转换
break与continue有什么区别?
break 关键字在 switch 语句中已经见过,这两个关键字多用在循环语句中:
break 用于强制退出循环体,执行循环后面的语句
continue 用于退出本次循环,执行下次循环
例子:
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
}
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
}
这是 break 和 continue 最常规的用法,其实这两个关键字后面可以跟上我们之前提到的label,退出指定位置的代码,对于多层循环是个有用的技巧,但是难以理解,一般不推荐使用(如同C语言中被误解的goto)
写出如下知识点的代码范例
if-else
的用法
if语句是编程语言最常用的语句,语法
if(condition){
//true statement
}else {
//false statement
}
其中condition可以是任意表达式,结果不一定是布尔值,JavaScript解释器会自动调用Boolean()将表达式结果转为布尔值,如果表达式为真执行第一个代码块内语句,如果为假执行第二个代码块内语句
只有一条语句的时候代码块不是必需的,出于维护性考虑我们建议添加
if语句可以单独使用,也可以和多个else连续使用
if(a > 2){
// statement
}
if( a == 1){
}else if(a == 2){
}else if(a == 3 ){
}else{
}
switch-case
的用法
switch 语句和if语句关系密切,语法
switch(expresstion){
case value1:
statement;
break;
case value2:
statement;
break;
case value3:
statement;
break;
default:
statement;
}
我们可以看到if语句使用多个else的时候写法很繁琐,可读性也下降,switch语句可以轻松解决
switch(a){
case 1:
statement;
break;
case 2:
statement;
break;
case 3:
statement;
break;
default:
statement;
}
如果表达式等于case的值,对应的语句就会执行,break关键字会使程序跳出switch语句,很多编程规范强调必须添加break,不添加不会有语法错误,程序会多次判断case,进入相应流程
没有一个值符合case,流程进入default子句,很多规范也强调必须添加default部分
JavaScript switch语句虽然参考的C语言的写法,但是有特殊性
switch和case可以使用任意表达式,不一定是常量
switch语句进行比较的时候是全等于(===)操作,不会发生类型转换
while
的用法
while语句属于前测试循环语句,也就是在循环体内的代码被执行之前,就会对条件求值,不符合的话就不会执行
while(expression){
statement;
}
看个例子
var i = 10;
while(i > 0){
console.log(i);
i--;
}
do-while
的用法
while
while语句属于前测试循环语句,也就是在循环体内的代码被执行之前,就会对条件求值,不符合的话就不会执行
while(expression){
statement;
}
看个例子
var i = 10;
while(i > 0){
console.log(i);
i--;
}
for
遍历数组的用法
for语句也是前测试循环语句,但具备在执行循环代码以前初始化变量和定义循环后要执行代码的能力,改造一下while语句
for(var i = 10; i > 0; i--){
console.log(i);
}
for-in
遍历对象的用法
for-in是一种迭代语句,用于枚举对象的属性
for(property in object){
statement
}
看个例子
for(var prop in window){
console.log(prop);
}
因为ECMAScript规定对象中的属性没有顺序,所以for-in遍历出来的属性的顺序也不是固定的(虽然大部分浏览器是按属性名称排序,我们不能依赖这个)
break
和 continue
的用法
break关键字在switch语句中已经见过,这两个关键字多用在循环语句中
break 用于强制退出循环体,执行循环后面的语句
continue 用于退出本次循环,执行下次循环
看个例子对比一下
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
}
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
}
这是break和continue最常规的用法,其实这两个关键字后面可以跟上我们之前提到的label,退出指定位置的代码,对于多层循环是个有用的技巧,但是难以理解,一般不推荐使用(如同C语言中被误解的goto)