Skip to content

js&ts

8、你怎么理解原型和原型链的

每个class都有一个显示原型property,如果new一个该class的实例,那么这个实例的隐式原型_proto_指向class的显示原型property,当实例执行一个方法的时候会先在当前实例寻找该方法,如果找不到就会通过隐式原型去class对象的显示原型里寻找

9、你是怎么理解闭包的

js变量属于本地或全局作用域,全局变量能够通过闭包实现局部(私有)。 表现形式是一个函数方法作为变量被返回,这样可以实现私有变量,只能通过返回的方法去修改。而且闭包调用多次产生多个作用域数据互相不影响 闭包也有个缺点,常驻内存得不到释放 我们的组件都是闭包

15、你在项目中遇到哪些js问题

truly问题,项目中有很多判断不严谨 还有浏览器兼容问题,map的操作等profill也没用,es的新语法最好少用。

16、js如何性能优化?

尽量使用let和const少用var 打包的时候尽量减少闭包 循环的时候少调用.length setState,vue的data修改,应该做个缓存一次性输入和输出 多个事件绑定的情况下使用事件委托,不要一个个div去绑定事件

19、如何获取多个数字中的最大值

Math.max(10,20,30)

20、var、let、const区别

let和const是ES6新增的局部变量,有块级作用域,var是多了一个变量提升,他没有值的时候会一直往上面的作用域去找 let和var是变量可修改,const是常量不可修改,但是const的对象和数组声明的栈地址不变,但是堆里面的内容可以改变。

21、列举强制类型转换和隐式类型转换

强制类型转换一般用parseInt、toString 隐式转换用的比较多,数字+空字符串变为字符、逻辑运算3<4返回false之类

22、值类型和引用类型的区别

  1. 字符、数字、boolean、undefined、null、symbol的值类型值存在栈里
  2. 对象、数组、function都是引用存在栈里,内容存在堆里,不固定大小

23、split()和join()区别

split是将字符串拆分成数组,join是将数组合成字符串

24、数组slice和splice区别

slice返回截取的元素,不会改变原数组 splice会改变原数组 [0,1,2,3]=》splice(1,2,'a','b','c')=>[ 0, "a", "b", "c", 3 ],第1个开始,删掉2个,跟上abc

25、数组的pop\push\shift\unshift分别做什么?

  1. pop删除最后一个元素,并返回删除元素
  2. push是再数组最后添加一个元素,返回添加后的数组长度
  3. shift删除第一个元素,并返回删除元素
  4. unshift是将一个元素添加到数组前面,返回添加后的数组长度

少用新的api,特别是map,除了||和&&意外的运算符

27、手写防抖节流

  1. 防抖是有些场景事件触发的频率过高,触发函数执行的频率过高导致卡顿,设置一定时间段内没有再触发事件,事件处理函数才会执行一次,比如滚轮事件、input框查询事件
    html
    <html>
        <input class="input1">
        <script>
            //防抖
            let input1 = document.querySelector('.input1')
            input1.addEventListener('keyup',debounce(function(e){
                console.log(input1.value)
            }))
            function debounce(fn,delay=2000){
                let timer = null
                return function(){
                    if(timer){
                        clearTimeout(timer)
                    }
                    timer = setTimeout(()=>{
                        fn.apply(this,arguments)
                        timer = null
                    },delay)
                }
            }
        </script>
    </html>
  2. 节流是让一个持续触发的事件,每隔一段事件执行一次.
    html
    <html>
        <input class="input1">
        <script>
            let input1 = document.querySelector('.input1')
            input1.addEventListener('keyup',throttle(function(e){
                console.log(input1.value)
            },2000))
            function throttle(fn,delay=100){
                let timer = null
                return function(){
                    if(timer){
                        return
                    }
                    timer = setTimeout(()=>{
                        fn.apply(this,arguments)
                        timer = null
                    },delay)
                }
            }
        </script>
    </html>

28、new Object()和Object.create()的区别

  1. 都是生成对象的方式,
  2. 第一个new Object({})等同于{},用的比较多
  3. Object.create({a:b}),是创建一个空对象,然后隐式原型指向{a:b}且三等判断是相等的
  4. Object.assign(目标对象,源对象)合并

29、函数声明和函数表达式的区别

  1. 函数声明是function fn(){},表达式是一个变量=function方法
  2. 函数声明会在代码执行前预加载,而函数表达式不会

30、如何获取js中的异常

  1. 一种是try、catch、finally,就是用try包裹需要捕获的代码块,然后用catch捕获异常和finally最后执行方式
  2. 还有一种是window.onerror = function(message,source,lineNum,colNum,error)方法,但是不能捕获跨域js的详细信息,只能报个错,还有压缩后的js需要配合sourceMa'p才能确定具体多少行

33、数组去重

function unique(arr){ const set = new Set(arr) return […set]

34、数组排序

const sortAns1 = Arrays.sort((a,b)=>{return a-b});

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

x instanceof Array

36、介绍RAF requestAnimationFrame 18-13

想要动画流畅,更新频率要60帧/s,即16.67ms更新一次试图 setTimeout要手动控制频率,而RAF浏览器会自动控制 后台标签或隐藏iframe中,RAF会暂停,而setTimeout依然执行

37、class的原型本质,怎么理解?

class本质还是function,可以通过constructor构建一些属性,定义方法的时候不需要加function,实例需要通过new关键字来实现实例。 实例的隐式原型指向class的prototype

39、如何使用JS实现继承?

基本都是用class语法糖来实现继承,容易理解,不用calss的话也可以通过 一个functon.prototype = new 另一个function来实现

41、函数call和apply、bind的区别

都是修改this指向,都不会修改原先函数的this指向 call和apply临时修改一次,bind是返回一个新函数 传参不同,call和bind是一个个传入,apply支持数组