1. 以下代码,alert出来的值是多少:
console.log(1 && 0); 0
console.log (0 && 1); 0
&&运算符首先判断前面的表达式是否为true,是的话,执行后面的表达式。
2. 以下代码, 写出每一步执行后影响那个变量结果,以及alert结果,并指出每次dbl执行时,this指的是什么?(10分)
window.val = 1;
var json = {
val: 10,
dbl: function(){
this.val *= 2;
}
};
json.dbl(); 作为对象的方法执行,this指向该对象
var dbl = json.dbl;
dbl(); 作为普通函数执行,this指向全局变量,即window对象
json.dbl.call(window); 通过 call 函数,将this绑定给window对象
alert(window.val + json.val); 24
3.以下代码,打印值是什么?并说明原因
var name = 'Shumei';
(function () {
if (typeof name === 'undefined') {
var name = 'SM';
console.log('Hello ' + name);
} else {
console.log('Hello ' + name);
}
})();
Hello SM
立即执行函数是一个独立的作用域,如果要使用全局变量,要把全局变量作为参数传给立即执行函数,否则在立即执行函数内部的变量是局部变量。
4. 以下代码写出log的值,以及原因
function Test(name, age){
this.name = name
if(age != undefined){
this.age = age;
}
}
Test.prototype = {
name: 'SM',
age: 18
}
var instance = new Test();
console.log(instance.name); SM
console.log(instance.age); 18
console.log(instance.constructor); Test
因为instance.__proto__ === Test.prototype,当使用instance的属性或方法时,如果它本身没有,就会去原型上找,即instance.__proto__,从而找到了Test.prototype。
5. 多项选择题:下列哪一项会返回‘true’,并说明原因
null == undefined true
Boolean("false") true
{} == 0 false
[] == 0 true
6. 写出以下代码执行结果,并说明原因
var a1 = [1,2];
var a2 = a1;
a1[0] = a2[1]
a2.push(3);
console.log(a1); [2,2,3]
console.log(a2); [2,2,3]
因为数组是引用类型变量,它存在堆中,而在栈中保存一个指向堆中变量的指针,复制时复制的只是这个指针,所以 a1 和 a2 的执行结果相同。
7. 写出下面代码的执行结果,并说明原因
setTimeout(function(){
console.log(1);
}, 0);
new Promise(function(resolve, reject){
var i = 0;
console.log(2);
while(i<100) {
i++;
i == 1 && resolve();
}
console.log(3);
}).then(function(){
console.log(4);
});
console.log(5);
2,3,4,1
遇到settimeout,把consolo.log(1)放到任务序列,遇到promise先执行console.log(2)输出2,进入while循环i从1变化到100. 然后输出3,并执行console.log(4) 输出4,最后回来执行settimeout里面的console.log(1)
- 请用原生js写防抖函数和节流函数。
function debounce(func, wait) {
let timeout;
return function () {
let context = this;
let args = arguments;
if (timeout) clearTimeout(timeout);
timeout = setTimeout(() => {
func.apply(context, args)
}, wait);
}
}
function throttle(func, wait) {
let previous = 0;
return function() {
let now = Date.now();
let context = this;
let args = arguments;
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
}
}