首页 > 其他分享 >面试题JS三座大山

面试题JS三座大山

时间:2022-10-25 17:49:11浏览次数:76  
标签:function 异步 面试题 console log 三座大山 JS prototype fn

原文章地址

  1. 原型和原型链
  2. 作用域与闭包
  3. 异步和单线程

01、如何判断一个变量是不是数组

考察点:instanceof的掌握

参考答案:

function isArray(obj){
 if (obj instanceof Array) {
return true
 } else {
return false
 }
}
instanceof 可以判断是不是由这个class构建的

扩展知识:

【原型】
console.log(stu.__proto__) 隐式原型
console.log(Student.prototype) 显示原型
console.log(Student.prototype === stu.__proto__)
每个类都有显示原型、每个实例都有隐式原型
实例的隐式原型__proto__指向类的显示原型prototype
【原型链】
console.log(Student.prototype.__proto__)
console.log(People.prototype)
console.log(Student.prototype.__proto__ === People.prototype)

02、如何使⽤class实现继承?

 

 

class ⼦类 extends ⽗类 {
 constructor() {
  super()
 }
}

作⽤域与闭包

串讲:

  • 作⽤域 —— 变量的合法使⽤范围。全局作⽤域、函数作⽤域、块级作 ⽤域
  • ⾃由变量 —— ⼀个变量在当前作⽤域没有定义,但被使⽤了
  • 闭包(56T) —— 所有⾃由变量的查找,是在函数定义的地⽅向上级作 ⽤域查找

03、this在不同场景下如何取值?

参考答案:

this的值是什么,取决于调⽤什么时候,与定义⽆关
// 在普通函数
function fn(){
  alert(this) // this -> window
}
fn()
// 使⽤ call、apply、bind
let fn2 = fn.bind({a:'abc'})
fn2() // this -> {a:'abc'}
// 对象⽅法调⽤
let obj={
  name: 'abc',
  getName(){
    this.name // this -> 当前对象
  },
  test(){
   setTimeout(() => {
     this // this -> 当前对象,箭头函数中this的值是上级作⽤的this
   })
 }
  test2(){
    setTimeout(function(){
      this // this -> window
    })
  }
}
// 在class中
// 在箭头函数中

04、⼿写bind函数

Function.prototype.bind1=function (){
  const args=Array.prototype.slice.call(arguments)
  const targetThis=args.shift()
  const _this=this
  return function (){
    return _this.apply(targetThis, args)
  }
}

05、阅读代码,填写结果

function foo(fn){
  const a=200;
  fn()
}
const a=100;
function fn() {
  console.log(a)
}
foo(fn) // 结果是多少? 100

06、阅读代码,填写结果

function foo() {
  const a=100;
  return function (){
    console.log(a)
  }
}
const fn=foo();
const a=200;
fn() // 结果是?? 100

07、实际开发中闭包的应⽤场景,举例说明

参考答案:

// 隐藏数据,数据被隐藏,外部⽆法访问
function myData(){
  let data={}
  return {
    setData(key, value){
      data[key]=value
    },
    getData(key) {
      return data[key ]
    }
  }
}

(function (){

})()

// 事件中获得正确的下标 ⻅ “闭包应⽤”
for (var i = 0; i < aBtn.length; i++) {
  (function (index) {
    aBtn[i].addEventListener("click", function () {
      alert(index);
    });
  })(i);
}

08、阅读代码,填写结果

// ⻚⾯中有3个按钮
let aBtn=document.getElementsByClassName('btn')
for (var i=0; i<aBtn.length; i++) {
  aBtn[i].addEventListener('click', function (){
    alert(i) // 每个按钮点击时,i的值分别是什么?
  })
}
//都为3

异步和单线程

09、阅读代码,填写结果

console.log(1)
setTimeout(() => {
  console.log(2)
}, 1000)
console.log(3)
setTimeout(() => {
  console.log(4)
}, 0)
console.log(5)

// 1、3、5、4、2

参考答案:

js是单线程语⾔
 js和DOM渲染共⽤同⼀个线程,因为JS可以修改DOM结构

先把同步代码执⾏完,再执⾏异步的代码

10、同步和异步的区别是什么?

参考答案:

同步就是⼀件事做完再做下⼀件事,异步是多件事情⼀起做
同步阻塞代码执⾏,异步不阻塞代码执⾏
 同步:alert demo
 异步:setTimeout setInterval ajax

11、⼿写Promise加载⼀张图⽚

参考答案:

let url = '';
function loadImg(url){
  let oImg = document.createElement('img');
  return new Promise((resolve, reject) => {
    oImg.src = url;
    oImg.onload = () =>{
      resolve(oImg);
    }
    oImg.onerror = () => {
      reject(new Error('图片加载失败');
    }
  })
}

扩展知识:

// 回调地狱
$.ajax.get(url, function (data){
  $.ajax.get(url2, function (data2){
    $.ajax.get(url3, function (data3){
    })
  })
})
// Promise
axios().then().then()

12、前端常⽤异步场景有哪些?

参考答案:

以下2种情况必须使⽤异步
⽹络请求 ajax
 $.ajax(url, function (data){ console.log(data) })

定时任务 setTimeout setInterval

13、请描述 event loop的机制,可画图

参考答案:

console.log('start')

setTimeout(() => {
  console.log('timeout')
}, 5000)

console.log('end')

Event Loop 事件循环、事件轮询

同步代码执⾏完,启动 event loop 机制
Event Loop 到回调队列中找有没有要执⾏的代码
如果有,放⼊调⽤栈执⾏
如果没有,Event Loop会⼀直轮询

setTimeout、setInterval、ajax、DOM事件都是基于 event loop 实现的

标签:function,异步,面试题,console,log,三座大山,JS,prototype,fn
From: https://www.cnblogs.com/Lmyong/p/16825654.html

相关文章

  • java程序员面试题(高级程序员面试题)
    java面试问题给你参考!!!一个月的实习过程使我受益匪浅。不仅是在专业知识方面,最主要是在怎样去解决编程中出现的问题。社会在加速度地发生变化,对人才的要求也越来越高,要用......
  • 如何用webgl(three.js)搭建一个3D库房,3D仓库,3D码头,3D集装箱可视化孪生系统——第十
    序又是快两个月没写随笔了,长时间不总结项目,不锻炼文笔,一开篇,多少都会有些生疏,不知道如何开篇,如何写下去。有点江郎才尽,黔驴技穷的感觉。写随笔,通常三步走,第一步,......
  • jsp-webuploader+jsp如何实现分片+断点续传
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上......
  • # 一篇文章了解 threejs 在 vue 项目中的基本使用(未完结)
    一篇文章了解threejs在vue项目中的基本使用Three.js是一个跨浏览器的脚本,使用JavaScript函数库或API来在网页浏览器中创建和展示动画的三维计算机图形。为啥突......
  • vue中加载three.js的gltf模型
    一、开始引入three.js相关插件。首先利用淘宝镜像,操作命令为:cnpminstallthree//npminstallthree也行二、three.js中所有的控件插件,都可以在node_modules下......
  • JS利用window.print()实现网页打印功能
    2.方法二将需要打印的内容用一个大的div包裹,打印时将body的内容替换为该div的内容,调用打印print()方法。 <body>     <inputtype="button"value="打印此页面"......
  • Node.js安装详细步骤教程(Windows版)
    什么是Node.js?简单的说Node.js就是运行在服务端的JavaScript。Node.js是一个基于ChromeV8引擎的JavaScript运行环境;Node.js使用一个事件驱动、非阻塞式I/O的......
  • python json和pickle
    json和pickle共用方法dumps把任意对象序列化成一个strloads把任意str反序列化成原来数据dump把对象序列化后写入到文件对象中load把文件对象中的内容反序列化jso......
  • 110-注解JSONField、DateTimeFormat、JsonFormat、JsonProperty
    JSONField注解在属性上,作用为:属性的名称与转为toString的名称不一样时,使用该注解。例如:@JSONField(name="user_id")privateStringuserId;当userId="a";使用:JSON.......
  • Luogu P4171 [JSOI2010]满汉全席
    题目链接:​​传送门​​2-sat板子题注意输入的时候可不要以为w和h后面数字只有一位*/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#includ......