Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JavaScript高频面试题整理

JavaScript高频面试题整理

作者头像
努力的Greatiga
发布于 2022-07-25 02:21:13
发布于 2022-07-25 02:21:13
41900
代码可运行
举报
运行总次数:0
代码可运行

作用域链

作用域就是程序执行到某一个特定部分时,可以访问这一部分的变量或者函数,这些变量或者函数就组成了一个特定的域,称为作用域。

程序执行会有一个环境栈,从全局环境开始,生成一个全局执行环境的关联对象,该对象拥有全局作用域的所有变量和方法。然后程序继续执行,遇到函数,也会生成该函数的一个关联的环境对象,并且将它压入栈中,此时会根据环境栈生成一个作用链,栈顶(作用域链顶端)也就是当时的函数执行环境对象,查找变量时就可以从作用域链顶端开始一直往后。

每一个执行环境都有一个作用域链,他可以访问作用域链上的属性和方法

原型、原型链

为什么要有原型。因为原本的构造函数,工厂模式产生的实例不能共享方法,非常浪费内存。

测试类型、数组类型

typeof 可以测试基本类型值,引用类型值只能测出 object instanceof 可以测所有类型的值,包括是哪种引用类型值 constructor 该属性是属于原型的属性,指向了其构造原型的构造函数 Object.prototype.toString.call() 对象拥有的原型方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = Object.prototype.toString;
console.log(x.call(11));
console.log(x.call("yes"));
console.log(x.call(true));
console.log(x.call(null));
console.log(x.call([1,2,4]));
console.log(x.call(undefined));
console.log(x.call({}));
console.log(x.call(function f() {}))

闭包

一种延长作用域链的方式,通过函数中创建另一个函数并且引用函数内部的属性,当函数运行完之后,返回的匿名函数依然保存着对原来函数的属性引用,这个引用是通过作用域链来完成的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Great() {
  var x = 1, b = "yes";
  return function() {
    return ++x;
  }
}
var com = Great();
console.log(com());
console.log(com());

null和undefine的区别

null 为空值,是一个空指针对象,通过 number 可以转为 0 undefined 是未定义,定义的变量没有初始化就会默认为这个值,通过 number 转为 NaN

call,apply,bind区别 ,手写bind

ES6

函数和执行域相关

记住函数作用域以及 var 有变量提升

函数柯里化

实现诸如 add(1,3)(2) = 6 的效果,利用闭包的特性来做

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function KeLi(...arg) {
  let args = [...arg];
  return function add(...newArgs) {
    if(newArgs.length != 0) {
      args.push(...newArgs);
      return add;
    } else {
      return args.reduce((pre, next) => pre += next);
    }
  }
}

console.log(KeLi(1,2)(4,5,5,6,7)(1,2)(-13,2)())
//22

对node.js有了解吗

promise

promise.all 方法

每一个promise 实例变为 full ,最后的才会变为 full。否则遇到的第一个 reject ,就会返回该 reject。并且整个 Promise.all 会停止执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let pro = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('e了');
  }, 1000);
})
// .then(res => {
//   console.log(`触发成功${res}`);
//   return res;
// } , err => {
//   console.log(`触发错误${err}`);
//   return err
// } );

let pro1 = new Promise((resolve, reject) => {
  for(let i = 3;i < 10;i ++) {
    if(i % 2 == 0) {
      resolve(i);
    } else {
      reject(i);
    }
  }
});

let sum = Promise.all([pro, pro1]);

sum.then(res => {
  console.log(`最终结果为成功${res}`);
}, err => {
  console.log(`最终结果为错误${err}`);
});
//最终结果为错误3

但是这里有一个点,如果在实例上有 then 方法,那么最终实例是接不到 err 回调函数的,因为在最终实例看来是成功的,并且整个 Promise.all 会执行完

自己实现一个 Promise.all 方法

async 和 await

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function great() {
  await setTimeout(() => {
    console.log('开始下一条')
  }, 1000);
  await console.log('Yes');
}
great();

数组扁平化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//数组扁平化方式一
function flaten(array) {
  let clone = [];
  for(let i = 0;i < array.length;i ++) {
    clone = clone.concat(Array.isArray(array[i]) ? flaten(array[i]) : array[i]);
  }
  return clone;
}

//数组扁平化方式二
function flaten1(array) {
  let clone = array;
  //console.log(clone.some(item => Array.isArray(item)));
  while(clone.some(item => Array.isArray(item))) {
    clone = [].concat(...clone);
  }
  return clone;
}

//ES6中的方法 flat
console.log(x.flat(Infinity))

let x = [1,2,[3,4,[5,6,'yes'],{a: 1}]];
let y = [1,2,4,4,[1,2]]

console.log(flaten1(y))

数组的常用方法

检测方法

  • Array.isArray(x) 是数组就返回 true

位置方法

  • array[i]
  • array.indexOf(x)
  • array.lastIndexOf(x)

操作方法

  • pop push
  • unshift shift
  • splice
  • slice
  • concat

排序方法

  • sort() 传入一个函数作为比较条件
  • reverse() 翻转数组

迭代方法

  • some every
  • map filter
  • forEach
  • reduce 向后迭代
  • reduceRight 从后向前迭代

同花顺一面

Ajax 的基本使用

同花顺一面

创建 XHR 对象

可以使用 new XMLHttpRequest(); 来创建

IE 7之前的要使用 new ActiveXObject(); 来创建

使用

xhr.open(methods, url, boolean);

如上所示,method 为请求方法,url 为请求地址,可加参数。布尔值表示是否要异步发送

xhr.send(null);

在成功调用 open 方法后,必须调用 send 方法才能开始发送。该方法接受一个参数,表示要在请求主体里面添加的数据,若是没有必须设置为空。

获取头部信息

  • getResponseHeader(params) 参数代表头部字段名称,函数返回相应头部字段对应的信息
  • getAllResponseHeaders() 获取所有头部字段包含的信息

监听

使用 send 后必须监听响应或者错误

  • onreadystatechange() 监听状态码 state ,也就是 http 响应码
  • ontimeout 监听事件是否超时

事件捕获、冒泡、委托

同花顺一面

垃圾回收机制

dom 常见 api

选择节点,创建节点,添加节点、删除节点

事件循环机制

请看这篇文章

几大继承及最优继承

this.$set

大数据渲染(documentFrame、虚拟列表)

防抖、节流

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//防止短时间大量执行,等待动作结束在执行
function Jitter(fn, sleep) {
  var timer = null;
  return function() {
    if(timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(fn, sleep);
  }
}
//一定间隔内执行一次
function throttle(fn, sleep) {
  var valid = true;
  return function() {
    if(!valid) {
      return false;
    }
    valid = false;
    setTimeout(function() {
      fn();
      valid = true;
    }, sleep);
  }
}

function ScrollTop() {
  var top = document.body.scrollTop || document.documentElement.scrollTop;
  console.log(top);
}
window.addEventListener('scroll', Jitter(ScrollTop, 500), false);
window.addEventListener('scroll', throttle(ScrollTop, 500), false);

nextTick() --Vue

浅拷贝和深拷贝

利用 assign 或者 “=“ 进行浅拷贝

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var obj = {
  a: 1,
  b: {
    x: 12,
    y: "yes"
  },
  c: function() {
    return this.a;
  }
}

var obj1 = Object.assign(obj);
obj1.a = 34;
console.log(obj);
//浅拷贝

利用数组的 concat 和 slice 进行第一层深拷贝

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var obj = [1, 2, 4, [12, 13]];

var obj1 = obj.concat();
var obj2 = obj.slice();
obj1.push(34);
obj2[3].push(15);
console.log(obj, obj1, obj2);
//浅拷贝

利用 JOSN.stringify 和 JSON.parse 进行深拷贝。会过滤掉 undefined、function、symbol 这些值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var obj = {
  a: 1,
  b: {
    x: 12,
    y: "yes"
  },
  c: function() {
    return this.a;
  }
}

var obj1 = JSON.parse(JSON.stringify(obj));
obj1.a = 34;
console.log(obj,obj1);
//浅拷贝

递归进行深拷贝

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var obj = {
  a: 1,
  b: {
    x: 12,
    y: "yes"
  },
  c: function() {
    return this.a;
  },
  d: [1,2,[3,4]]
}

function deepClone(obj) {
  var clone = obj instanceof Array ? [] : {};
  for(key in obj) {
    if(obj.hasOwnProperty(key)) {
      clone[key] = typeof obj[key] == "object" ? deepClone(obj[key]) : obj[key];
    }
  }
  return clone;
}
//深拷贝
var obj1 = deepClone(obj);
obj1.a = 5;
obj1.d[2].push(5);
console.log(obj, obj1);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面了十多家,总结出20道JavaScript 必考的面试题!
面临毕业季,相信有很多朋友正在进行找工作,背面试题;今天就分享给大家20道JavaScript必会的问题
程序员老鱼
2023/09/07
2180
面了十多家,总结出20道JavaScript 必考的面试题!
【面试】386- JavaScript 面试 20 个核心考点
Javascript是前端面试的重点,本文重点梳理下 Javascript 中的常考基础知识点,然后就一些容易出现的题目进行解析。限于文章的篇幅,无法将知识点讲解的面面俱到,本文只罗列了一些重难点,如果想要了解更多内容欢迎点击https://github.com/ljianshu/Blog。
pingan8787
2019/10/23
4720
【面试】386- JavaScript 面试 20 个核心考点
学会6大类型JavaScript面试题,面试官都不淡定了
当我们找实例对象的属性时,如果找不到,就会查找与对象关联的原型中去找,如果还找不到,就去找原型的原型,直到最顶层。
can4hou6joeng4
2023/11/29
1720
滴滴前端一面经典手写面试题
一般来说,Promise.all 用来处理多个并发请求,也是为了页面数据构造的方便,将一个页面所用到的在不同接口的数据一起请求过来,不过,如果其中一个接口失败了,多个请求也就失败了,页面可能啥也出不来,这就看当前页面的耦合程度了
helloworld1024
2023/01/04
9200
js手写题汇总(面试前必刷)
event bus既是node中各个模块的基石,又是前端组件通信的依赖手段之一,同时涉及了订阅-发布设计模式,是非常重要的基础。
helloworld1024
2022/11/09
1.1K0
前端一面必会手写面试题(边面边更)4
函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
helloworld1024
2023/01/06
3250
这样回答前端面试题才能拿到offer2
Webkit 和 Firefox 都做了这个优化,当执行 JavaScript 脚本时,另一个线程解析剩下的文档,并加载后面需要通过网络加载的资源。这种方式可以使资源并行加载从而使整体速度更快。需要注意的是,预解析并不改变 DOM 树,它将这个工作留给主解析过程,自己只解析外部资源的引用,比如外部脚本、样式表及图片。
loveX001
2023/01/04
4860
腾讯前端手写面试题及答案
函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
helloworld1024
2022/12/19
6640
2021JavaScript面试题(最新)不定时更新(2021.11.6更新)
js 一共有六种基本数据类型,分别是 Undefined、Null、Boolean、Number、String,还有在 ES6 中新增的 Symbol 类型。 Symbol 代表创建后独一无二且不可变的数据类型,它的出现我认为主要是为了解决可能出现的全局变量冲突的问题。
全栈程序员站长
2022/09/07
2.6K0
2022高频前端面试题合集之JavaScript篇(上)
解析:该题主要考察就是对 js 中的继承是否了解,以及常见的继承的形式有哪些。最常用的继承就是「组合继承」(伪经典继承)和圣杯模式继承。下面附上 js 中这两种继承模式的详细解析。
程序员法医
2022/12/20
1.1K0
2022高频前端面试题合集之JavaScript篇(上)
字节前端高频手写面试题(持续更新中)1
观察者需要放到被观察者中,被观察者的状态变化需要通知观察者 我变化了 内部也是基于发布订阅模式,收集观察者,状态变化后要主动通知观察者
helloworld1024
2023/01/03
6980
前端二面手写面试题总结
then 方法返回一个新的 promise 实例,为了在 promise 状态发生变化时(resolve / reject 被调用时)再执行 then 里的函数,我们使用一个 callbacks 数组先把传给then的函数暂存起来,等状态改变时再调用。
helloworld1024
2022/10/27
8300
腾讯前端高频手写面试题
函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
helloworld1024
2022/11/15
5940
【吐血整理】前端JavaScript高频手写面试大全,助你查漏补缺
https://segmentfault.com/a/1190000038910420
@超人
2021/02/26
8650
【吐血整理】前端JavaScript高频手写面试大全,助你查漏补缺
js面试题及答案2020_JS面试题大全
number、string、bootlean、null、undefined、Bigint 、Symbol
全栈程序员站长
2022/09/27
3790
前端常见20道高频面试题深入解析
今年来,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力。本文挑选了20道大厂面试题,建议在阅读时,先思考一番,不要直接看解析。尽管,本文所有的答案,都是我在翻阅各种资料,思考并验证之后,才给出的。但因水平有限,本人的答案未必是最优的,如果您有更好的答案,欢迎给我留言。如果有错误,可以在评论区指出。本文篇幅较长,希望小伙伴们能够坚持读完。
前端达人
2020/04/08
1.2K0
前端常见20道高频面试题深入解析
前端js手写面试题汇总(二)
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。
helloworld1024
2022/11/16
5480
高级前端手写面试题
该方法的参数是 Promise 实例数组, 然后其 then 注册的回调方法是数组中的某一个 Promise 的状态变为 fulfilled 的时候就执行. 因为 Promise 的状态只能改变一次, 那么我们只需要把 Promise.race 中产生的 Promise 对象的 resolve 方法, 注入到数组中的每一个 Promise 实例中的回调函数中即可.
helloworld1024
2022/09/17
7060
2022必会的前端面试手写题
instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。
buchila11
2022/07/29
5820
百度前端必会手写面试题及答案
防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行
helloworld1024
2022/09/17
5440
相关推荐
面了十多家,总结出20道JavaScript 必考的面试题!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验