var a = 11
if(a < 10)
console.log('a是一位数')
console.log('a是小于 10 的数')
此题会打印出:a是小于10的数
因为if语句默认离他最近的那一句为一个整体,进行判断后不会输出:a是一位数。第四句则为单独一个句子,可以这么理解:
var a = 11
if(a < 10)
console.log('a是一位数')
console.log('a是小于 10 的数')
————————————————————————————————————————————————————————
var a = 1
if(a = 3)
console.log('a等于3')
此题会打印出:a=3
因为'='是赋值语句,在if的条件语句中a被赋值为3,所以打印出a的值即为3。
如果是下面这种情况:
var a = 1
if(a === 3)
console.log('a等于3')
'==='以及'=='不同于'=',他们并不是赋值语句,只是判断a的值是否为3,因而在上面代码中,会打印出a=1。
————————————————————————————————————————————————————————
与DOM API相关习题:(补充立即执行函数相关知识)
1、
i. <div id=x></div> //x的值就是这个id = x的div对应的Element对象。
ii. <div id=parent></div> //parent的值为:如果有父窗口,就是父窗口,如果没有就是当前窗口。
两题区别:给id取的名字不一样
结论:i. parent是一个全局变量,因此不要拿来给id命名(全局变量可耻,不要用)
ii. 如果想用id = parent,就构造一个函数,在函数内部(局部变量)使用
iii. 声明了这个函数后,请立即调用它!!!
function(){
var parent = document.querySelector('#self')
console.log(parent)
}.call() //立即调用
iv. 这个时候执行它控制台会报错,如何解决?
方法一:可以用括号将这个立即执行函数(匿名函数)包起来:(function(){alert('我是一个匿名函数')})()
方法二:在这个函数前面加上一个符号(可以是!、-、+、~),告诉浏览器这不是一个声明而是一个立即执行函数。 !function(){alert('我是一个匿名函数')}()在这里引出了一个立即执行函数
概念:立即执行函数就是声明一个匿名函数并且马上调用它。
作用:创建一个独立的作用域。这个作用域里面的变量,外面访问不到(避免变量污染)。
2、HTMLCollection与NodeList的区别有 答案: AC
A. HTMLCollection实例对象的成员只能是Element节点,NodeList实例对象的成员可以包含其他节点。
B. HTMLCollection实例对象都是动态集合,节点的变化会实时反映在集合中。NodeList实例对象都是静态集合。
C. HTMLCollection实例对象可以用id属性或name属性引用节点元素,NodeList只能使用数字索引引用。
3、
var parent1 = document.getElementById('parent1');
parent1.childNodes.length // 2
parent1.appendChild(document.createElement('div'));
parent1.childNodes.length // 请问现在 length 是多少 答案是3
var allDiv = document.querySelectorAll('div')
allDiv.length // 假设是 2
document.body.appendChild( document.createElement('div') )
allDiv.length // 请问现在 length 的值是多少??? 答案是2
第一次的代码重新进行了一次查询,而第二次的代码并没有重新进行查询,如果想让第二次的答案是3,那么把第二次的最后一句代码删去,并加上allDiv = document.querySelectorAll('div');allDiv.length即可。
————————————————————————————————————————————————————————与作用域相关的考题:
拿到代码直接做必然会错!!!先提升声明!!!!!
1、
var a = 1
function f1(){
alert(a) //a是多少?
var a = 2
}
f1.call()
变量提升后的代码如下:
var a = 1
function f1(){
var a
alert(a) //此时a是undefined,先提升声明var a,并没有给a赋值,所以打印出a是undefined
a = 2
}
f1.call()
2、
var a = 1
function f1(){
var a = 2
f2.call()
}
function f2(){
console.log(a) //a = ?
}
f1.call()
3、
var liTags = document.querySelectAll('li')
for (var i = 0;i<liTags.length;i++){
liTags[i].onclick = function(){
console.log(i) //点击第三个li时,打印2还是6
}
}
打印6,不论点击的是哪个li,for循环始终要进行,循环完之后的i是6。
补充:如果想打印出0~5,可使用立即执行函数给每个li创造一个独立作用域即可
var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
!function(ii){
liList[ii].onclick = function(){
alert(ii) // 0、1、2、3、4、5
}
}(i)
}
在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。
i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 ii 分别是 0、1、2、3、4、5。