容易被忽略的JavaScript基础 习题及详解【基本语法】(laosix)

温馨提示:本博客中的所有问题,都可以放入浏览器F12中的console中执行来验证


请注意!!!用F12执行代码时,可以会受以前定义变量的影响
所以建议在执行新的代码块之前【刷新网页】
不然就会出现类似于这样的问题
惨痛教训


最近在补js的基础,把学到的新知识总结了一下,做了点题目分享给大家(因为是js基础知识,所以尽量不用es6的写法)

习题

1、[选择] 请问以下代码分别会在控制台中输出什么?

console.log(a)
var a = 123

A.	'123'
B.	报错 a is not defined
C.	123
D.	undefined

2、[填空] 已知函数 SW() 定义如下,请问输入以下参数,分别会在控制台中输出什么?

function SW(num){
	switch(num){
		case 1:
			console.log('我是数字1')
			break
		case 2:
			console.log('我是数字2')
		case 3:
			console.log('我是数字3')
			break
		default:
			console.log('我是其他')
	}
}
1. SW(1)

2. SW(2)

3. SW(3)

4. SW('1')

3、[选择] 请问以下代码分别会在控制台中输出什么?

var a = 1
var b = a === 1 ? 'a是数字1' : 'a不是数字1'
console.log(b)

A.	a
B.	'a是数字1'
C.	"a === 1 ? 'a是数字1' : 'a不是数字1'"
D.	'a不是数字1'

4、[填空] 已知 breakNormal()breakLabel() 的定义如下,请问调用他们分别会在控制台中输出什么?

function breakNormal(){
	for(var i=0; i<10; i++){
		for(var j = 0; j<10; j++){
			if(j === 3) break
		}
	}
	console.log('i=' + i + '; j=' + j)
}

breakNormal()
function breakLabel(){
	top:
		for(var i=0; i<10; i++){
			for(var j = 0; j<10; j++){
				if(j === 3) break top
			}
		}
	console.log('i=' + i + '; j=' + j)
}

breakLabel()

5、[填空] 已知 continueNormal()continueLabel() 的定义如下,请问调用他们分别会在控制台中输出什么?

function continueNormal(){
	for(var i=0; i<10; i++){
		for(var j = 0; j<10; j++){
			if(j === 3) continue 
		}
	}
	console.log('i=' + i + '; j=' + j)
}

continueNormal()
function continueLabel(){
	top:
		for(var i=0; i<10; i++){
			for(var j = 0; j<10; j++){
				if(j === 3) continue top
			}
		}
	console.log('i=' + i + '; j=' + j)
}

continueLabel()



详解

变量提升

1、[选择] 请问以下代码分别会在控制台中输出什么?

console.log(a)
var a = 123

A.	'123'
B.	报错 a is not defined
C.	123		
D.	undefined	【正确】

解:
本题考察的是【变量提升】知识点

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行

这会导致所有的变量的声明语句,都会被提升到代码的头部

也就是说,代码块的实际执行顺序是这样的

var a
console.log(a)
a = 123
// 输出的结果为 undefined 
// 因为只有声明语句被提升,赋值的语句不会提升
// 在调用console.log(a)时,a只被定义,还未被赋值,所以输出undefined 

switch

2、[填空] 已知函数 SW() 定义如下,请问输入以下参数,分别会在控制台中输出什么?

function SW(num){
	switch(num){
		case 1:
			console.log('我是数字1')
			break
		case 2:
			console.log('我是数字2')
		case 3:
			console.log('我是数字3')
			break
		default:
			console.log('我是其他')
	}
}
1. SW(1) // '我是数字1'

2. SW(2) // '我是数字2''我是数字3'

3. SW(3) // '我是数字3'

4. SW('1') // '我是其他'

解:
本题主要考察 switch 的【执行机制】和【相等机制】

1 在 SW()case 2 的末尾没有使用 break 跳出代码块,所以会继续往执行 case 3 的语句

2 switchcase 使用的是严格相等判断也就是运算符中的===,在判断时不会转化变量的类型

console.log(1 === '1') // false

所以 SW('1') 会执行 default 的语句


三目运算符

3、[选择] 请问以下代码分别会在控制台中输出什么?

var a = 1
var b = a === 1 ? 'a是数字1' : 'a不是数字1'
console.log(b)

A.	a
B.	'a是数字1'	【正确】
C.	"a === 1 ? 'a是数字1' : 'a不是数字1'"
D.	'a不是数字1'

解:
本题考察的是【三目运算符】

三目运算符可以理解为 if...else... 的简便写法

如果条件true,执行语句一,否则执行语句二

// 三目运算符
条件 ? 语句一 : 语句二

// if...else...
if(条件){
	语句一
}else{
	语句二
}

break label

4、[填空] 已知 breakNormal()breakLabel() 的定义如下,请问调用他们分别会在控制台中输出什么?

function breakNormal(){
	for(var i=0; i<10; i++){
		for(var j = 0; j<10; j++){
			if(j === 3) break
		}
	}
	console.log('i=' + i + '; j=' + j)
}

breakNormal() // 'i=10; j=3'

解:
普通的 break 会跳出当前的代码块,本题中 j=3 便跳出内层代码块,继续执行外层代码块

结束时,外层代码块全部执行完毕所以 i=10 ,而内层代码块j=3 时就被跳出,所以停留在 j=3

function breakLabel(){
	top:
		for(var i=0; i<10; i++){
			for(var j = 0; j<10; j++){
				if(j === 3) break top
			}
		}
	console.log('i=' + i + '; j=' + j)
}

breakLabel() // 'i=0; j=3'

解:
break 设置了 label 的时候,就会直接跳到 label 所以在的代码块

在本题中 break top 就直接跳到了 top 所在的位置,也就是两层代码块之外,就等于是直接结束了两层循环

此时外层循环第一次循环都没有执行完,就被 break top 跳出了,所以 i=0内层循环执行到了第三次, 所以 j=3

continue label

5、[填空] 已知 continueNormal()continueLabel() 的定义如下,请问调用他们分别会在控制台中输出什么?

function continueNormal(){
	for(var i=0; i<10; i++){
		for(var j = 0; j<10; j++){
			if(j === 3) continue 
		}
	}
	console.log('i=' + i + '; j=' + j)
}

continueNormal() // 'i=10; j=10'

解:
普通情况下的 continue 会跳过本次循环,如果 continue 之下还有别的语句,在本次循环中是不会被执行的

但是对于本题而言,没有什么影响,内外两层循环都执行了10次,所以 i=10; j=10

function continueLabel(){
	top:
		for(var i=0; i<10; i++){
			for(var j = 0; j<10; j++){
				if(j === 3) continue top
			}
		}
	console.log('i=' + i + '; j=' + j)
}

continueLabel() // 

解:
和上一题类似,当 continue 设置了 label 的时候,就会直接跳到 label 所以在的代码块

在本题中 continue top 就直接跳到了 top 所在的位置,就是每次执行到 j=3 就直接跳出内层循环,继续执行外层循环,基本等同了 普通break 的效果

当循环结束的时候,外层循环全部执行完,而内层循环j=3的时候被跳出,所以最终的答案是 i=10; j=3
`


本次分享到此结束,感谢各位的阅读~

本次分享共5题,如果每题20分的话,你们能得多少分呢?欢迎在评论区晒出各位的分数

如果本片博客中存在问题,也欢迎各位在评论区指出,这能让我们共同进步

好的,再次感谢你的阅读,我们下期再见 0v0

本博客的知识点均来自于 《js基础教程》

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值