JS面试题

一、定时器

1.1语法

循环定时器语法

//创建定时器

var timer=setInterval(function() {
        // 循环执行的代码
      }, 1000);

清除定时器

clearInterval(timer)

一次性定时器用法

var timer=setTimeout(function() {
        // 执行的代码
      }, 1000);

清除定时器

clearTimeout(timer)

1.2定时器面试题

setTimeout的执行原理——Javascript事件处理器在线程空闲之前不会运行。

for (var i = 1; i <= 3; i++) {
        setTimeout(function() {
          console.log(i);
        }, 0);
  }//4 4 4 

让结果输出123?

立即执行函数

    for (var i = 1; i <= 3; i++) {
        setTimeout(
          (function() {
            console.log(i);
          })(i),
          0
        );
      }

闭包

for (var i = 1; i <= 3; i++) {
        setTimeout(
          (function(i) {
            return function() {
              console.log(i);
            };
          })(i),
          0
        );
      }

二、window对象上常用方法

2.1页面跳转

window.location.href="网址"

2.2返回锚点

window.location.hash

2.3返回搜索参数

window.location.search返回的是?号后面的参数

2.4刷新当前页面

window.location.reload() 

三、ES6新特性

3.1let和var的区别

let是块级作用域,var是函数作用域

var arr = [];
for( var i= 0;i<2;i++){
    arr[i] = function(){
        console.log(i)
    }
}
arr[0]();
arr[1]();

先创建了一个空数组,然后执行for循环,然后将函数存储到数组中。这时候函数并没有被调用。然后for循环结束,arr0和arr1调用函数。注意var 声明的变量的作用域是全局作用域,而在执行调用函数之前,for循环早就执行完了,这个时候的i变成了2,被调用的函数的i去找值只能上全局作用域中去找,然后两个函数找到的都是2.所以输出的结果都为2。

var arr = [];
for( let i= 0;i<2;i++){
    arr[i] = function(){
        console.log(i)
    }
}
arr[0]();
arr[1]();

代码执行的顺序都是一样的,不同的点是let声明的关键字,在每一次执行for循环的时候,都会产生一个块级作用域。然后当函数被调用去找i的值的时候,是去上一级对应的作用域去找i值,这时候找到的i值分别是0和1.所以输出的结果就是0和1

3.2变量解构

数组解构

 let [a, b, c] = [1, 2, 3];
 console.log(a, b, c);//123
 //设定默认值
 let [a, b = 5] = [10];
 console.log(a, b); //10 5

对象解构

      let res = {
        code: 200,
        data: {
          message: [
            { id: 1, name: "冰箱", price: 2000 },
            { id: 2, name: "彩电", price: 1000 }
          ]
        }
      };
      const {
        code,
        data: { message }
      } = res;
      console.log(code, message); //200 []

字符串解构

      const [a, b, c, d, e] = "hello";
      console.log(a, b, c, d, e); // "h"  "e" "l" "l" "o"

3.3模板字符串

      var y = 2022;
      var m = 5;
      var d = 15;
      var str = `今年是${y}年${m}月${d}日`;
      console.log(str); // 今年是2022年5月15日

3.4箭头函数

函数默认值

 function log(x, y = "World") {
        console.log(x, y);
      }

      log("Hello"); // Hello World

箭头函数

  • 箭头函数没有自己的this对象。
  • 不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。
  • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

上面几点中,最重要的是第一点。对于普通函数来说,内部的this指向函数运行时所在的对象,但是这一点对箭头函数不成立。它没有自己的this对象,内部的this就是定义时上层作用域中的this。也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。

var f = v => v;

// 等同于
var f = function (v) {
  return v;
};


var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
  return num1 + num2;
};


由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。

// 报错
let getTempItem = id => { id: id, name: "Temp" };

// 不报错
let getTempItem = id => ({ id: id, name: "Temp" });

剩余参数代码示例

     function fn(a, ...b) {
        console.log(a, b);
      }
      fn(2, 3, 4, 5);

代码示例

function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

var id = 21;

foo.call({ id: 42 });
// id: 42

上面代码中,setTimeout()的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以打印出来的是42。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值