前端面试总结(part 4): javascript编程部分
请用代码写出(今天是星期x)其中x表示当天是星期几,如果当天是星期一,输出应该是"今天是星期一"
let weekday = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
let date = new Date();
console.log('今天是'+ weekday[date.getDay()]);
下面这段代码想要循环延时输出结果0 1 2 3 4,请问输出结果是否正确,如果不正确,请说明为什么,并修改循环内的代码使其输出正确结果
for (var i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i + ' ');
}, 100);
}
解答:结果错误。因为循环中的setTimeout接受的参数函数通过闭包访问变量i.js的运行环境是单线程,setTimeout注册的函数需要等待线程空闲才能执行,此时for循环已经结束,i值为5.所以输出结果都为5.
修改:
for (var i = 0; i < 5; ++i) {
(function (i) {
setTimeout(function () {
console.log(i + ' ');
}, 100);
}(i));
}
将setTimeout放在函数立即调用表达式中,将i作为参数传递给包裹函数,创建新的闭包
完成下面的tool-tip
网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示"××年还剩××天××时××分××秒"
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>TEst</title>
</head>
<body>
<span id="target"></span>
<script type="text/javascript">
// 为了简化。每月默认30天
function getTimeString() {
var start = new Date();
var end = new Date(start.getFullYear() + 1, 0, 1);
var elapse = Math.floor((end - start) / 1000);
var seconds = elapse % 60 ;
var minutes = Math.floor(elapse / 60) % 60;
var hours = Math.floor(elapse / (60 * 60)) % 24;
var days = Math.floor(elapse / (60 * 60 * 24)) % 30;
var months = Math.floor(elapse / (60 * 60 * 24 * 30)) % 12;
var years = Math.floor(elapse / (60 * 60 * 24 * 30 * 12));
return start.getFullYear() + '年还剩' + years + '年' + months + '月' + days + '日'
+ hours + '小时' + minutes + '分' + seconds + '秒';
}
function domText(elem, text) {
if (text == undefined) {
if (elem.textContent) {
return elem.textContent;
} else if (elem.innerText) {
return elem.innerText;
}
} else {
if (elem.textContent) {
elem.textContent = text;
} else if (elem.innerText) {
elem.innerText = text;
} else {
elem.innerHTML = text;
}
}
}
var target = document.getElementById('target');
setInterval(function () {
domText(target, getTimeString());
}, 1000)
</script>
</body>
</html>
注:textContent、innerText、innerHTML的区别和差异
textContent属性可以获取指定节点的文本及其后代节点中文本内容,也包括<script>和<style>元素中的内容;
innerText也是获取指定节点的文本及其后代节点中文本内容,但不能获取<script>和<style>元素中的内容。
innerHTML是获取HTML文本结构内容。
2、textContent会获取display:none的节点的文本;而innerText好像会感知到节点是否呈现一样,不作返回。
也就是说,textContent能够获取元素的所有子节点上的文本,不管这个节点是否呈现;而innerText只返回呈现到页面上的文本。
3、要注意设置文本时被替换的可不只是文本了;这时textContent 、innerText属性相当于innerHTML属性,会把指定节点下的所有子节点也一并替换掉。
4、由于 innerText 受 CSS 样式的影响,它会触发重排(reflow),但 textContent 不会。