js面试题汇总

前言🎡

古今中外有学问的人,有成绩的人,总是十分留意积累的。知识就是积累起来的,经验也是积累起来的。我们对什么事情都不应当像过眼云烟。——邓拓

最近在复习更新js小知识点,记录了一些实用性高的或者很基础很重要的知识点分享给大家。希望大家多多支持。

1、理解JSON对象⚾

JSON历史

JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。

JSON对象与JS对象的关系

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串

JSON对象与JS对象的转换

JSON的序列化

let obj = {name:1}
JSON.stringify(obj)
//"{"name":1}"

JSON的反序列化

let obj = '{"name":1}'
JSON.parse(obj)
// {name:1}
//扩展
JSON.parse(obj,(k,v)=>{
    if(k === '') return v;
    return v * 2;
})
JSON的序列化与反序列化的应用
  • css-loader
  • 前后台交互
  • 待添加。。。
浏览器的兼容性
  • Full support

2、前端三座大山之作用域与闭包🥎

作用域
  • 作用域是一套规则,用来帮助编译器找到变量存储的位置。📍如果要查找变量对其进行赋值,则用LHS查询,如果只是查找变量,就用RHS查询。如果不知道LHS和RHS,请自己查询一下。(mark一下)

  • 函数作用域,一个函数就包含一个作用域,全局作用域可以看作是最外面的函数(自己理解),内部的作用域可以访问外部的作用域,外部的作用域访问不到内部的作用域。

闭包
  • 闭包(closure)呢就是能够在外部作用域访问到内部作用域的变量。

  • 我对闭包的几个认识阶段:

  • 1.定义在一个函数内部的函数

  • 2.能够读取其他函数内部变量的函数,搭建了不同作用域之间的桥梁(后来看到《你不知道的javaScript》这本书,发现了静态词法作用域)

  • 什么是静态词法作用域呢?

  • 就是作用域定义在代码的书写阶段而不是运行阶段,我们可以这样理解,如果函数A内嵌套函数B,函数B可以访问函数A的变量。无论运行后是如何复杂执行的,作用域都是在书写的时候就确定了,动态改变的可能是this,因为this是“最后谁调用的就指向谁”。

  • 闭包呢我理解有两个功能:不受作用域限制,可提取函数内部的变量的一种手法,另一个就是让这些变量的值始终保持在内存中。

  • 由于闭包可能会常驻内存,所以要注意合理使用闭包。还有一些问题,在以后的章节会提到。

3、实现一下防抖节流函数🏀

防抖函数
  • 防抖:场景理解:在一段时间内,你一直在做重复的事情100次,防抖就是只让你在这段时间内最后一次生效,换言之,这段时间,你只做成功了一次。

  • 比如你女朋友用微信给你发消息,你会看到"对方正在输入。。。",仔细分析一下它是如何设计的,我们可以看到防抖的身影。

  • 简单代码如下

   <input type="text" id="it">
   <p class="inText">你好</p>
  • 每当输入时触发,清除之前的计时事件(改变状态),重新计时
let s;
function debounce(fn, w) {
    return function () {
        document.querySelector('.inText').innerText = "对方正在输出。。。"
        if(s){ clearTimeout(s);}
        s = setTimeout(()=>{
            fn()
        },w)
     }
}
function input() {
    document.querySelector('.inText').innerText = "请输入"
 }
 var x=document.querySelector("#it")
x.addEventListener('input',function () {
     debounce(input,2000)()
 })
节流函数
  • 节流是让多次执行变成每隔一段时间执行。(开源节流)
var canRun = true
function throttle(){
    if(!canRun){
      return
    }
    canRun = false
    setTimeout( function () {
        console.log("函数节流")
        canRun = true
      }, 500)
    }
//测试
setInterval(() => {
    console.log(1);
    throttle()
}, 100 );

4、new操作符做了什么事情,如何手写实现一个new的操作?的🧶

思路
  • 获取传入的构造函数
  • 创建一个新的对象,将构造函数的原型继承到新的对象上
  • 执行构造函数,改变this到新的对象上,(这是新对象在继承构造函数的作用域链)
  • 判断构造函数的执行结果,返回合适的结果
function Person(n) {
    this.age = 23
    this.name = n

}
Person.prototype.sayName = function () {
    console.log(this.name);
}
Person.prototype.sayAge = function () {
    console.log(this.age);
}
function _new(){
let constr = Array.prototype.shift.call(arguments)
let obj = Object.create(constr.prototype);
let result = constr.apply(obj,arguments)
return result instanceof Object?result:obj
}
// let per = new Person('小明')
let per = _new(Person,'小明')

per.sayName()
per.sayAge()
今天就这样吧。👋

参考资料📕

《你不知道的javaScript》

欢迎关注作者雾灵🥇

个人博客 | github-雾灵

vue.js的API整理

简单实现vue的几个流程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值