面试 个人摸底监测 考察考察JS三座⼤⼭ 1. 原型和原型链 2. 作⽤域与闭包 3. 异步和单线程 (第四天)
  7ODUQ2xZYopn 2023年11月01日 64 0

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

let arr = [1,2,3,4] function fun(){ return arr instanceof Array }

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

class fu {consructor(name,age)} class son extends fu{super(...arguments))}

扩展:

      //父类 class People { constructor(name, age) { this.name = name; this.age = age; } eat() { console.log("吃吃吃"); } } // 子类 class Student extends People { constructor(name, age) { super(name, age); } sayHi() { console.log(this.name + " " + this.age); } } let stu = new Student("abc", 20); stu.eat();

【原型】

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)

 

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

this的值是什么,取决于调⽤什么时候,与定义⽆关

举例:

// 在普通函数 function fn(){ alert(this) // this -> window } fn() // 使⽤ call、apply、bind let fn2 = fn.bind({a:'abc'}) fn2() // this -> {a:'abc'}

1,以普通函数的形式调用,this是window
2,以对象的方法被调用时,this是调用方法的对象
3,以构造函数形式调用,this是新创建的对象
4,使用call和apply调用时,this是call和apply的第一个参数,如果参数为空,默认指向全局对象
5,全局作用域中this是window
6,箭头函数的this由外层作用域决定

04、⼿写bind函数

Function.prototype.myBind = function(){  let arr = Array.prototype.slice.call(arguments)  let newThis = arr.shift()  let _this = this  return function(){ _this.apply(newThis,arr) } }

05、阅读代码,填写结果

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

100

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

100

作⽤域 —— 变量的合法使⽤范围。全局作⽤域、函数作⽤域、块级作

⽤域

⾃由变量 —— ⼀个变量在当前作⽤域没有定义,但被使⽤了

闭包(56T) —— 所有⾃由变量的查找,是在函数定义的地⽅向上级作⽤域查找

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

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

闭包就是能够读取其他函数内部变量的函数

07、阅读代码,填写结果

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

3,3,3

当按钮执行的时候,for循环已经执行完了,解决方法用立即执行 (function (){})():这也算一个闭包

      for (var i = 0; i < aBtn.length; i++) { (function (index) { aBtn[i].addEventListener("click", function () { alert(index); }); })(i); }

08、阅读代码,填写结果

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是单线程的,同步就是⼀件事做完再做下⼀件事,

       异步是多件事情⼀起做

同步阻塞代码执⾏,异步不阻塞代码执⾏

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

以下2种情况必须使⽤异步

⽹络请求 ajax

$.ajax(url, function (data){ console.log(data) })

 

定时任务 setTimeout setInterval

09、⼿写Promise加载⼀张图⽚

let url = '01.jpg' // 地址 function fun (){ let oimg = docments.createElements('img') return new Promise((res,req)=>{ oimg.src = url oimg.onload = function (){ res(oimg) } oimg.onerror = function (){ req(new Error('失败')) } }) }

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

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

 个人博客地址:http://blog.qianbaiyv.cn/get/my/blog/details/2311887075%40qq.com/121

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  f18CFixvrKz8   2024年05月20日   93   0   0 JavaScript
  fxrR9b8fJ5Wh   2024年05月17日   53   0   0 JavaScript
  2xk0JyO908yA   2024年04月28日   41   0   0 JavaScript
7ODUQ2xZYopn