web前端面试题(三):JS篇

1、原始类型

b u n n s s(Boolean,Undefined,Number,Null,String,Symbol)

2、null是对象吗

首先当使用typeof检测的时候会输出Object,但这是js的bug,null表示空指针,
typeof null也是object,null instanceof Object —> false

3、对象类型和原始类型的不同之处

原始类型储存的是值,对象类型储存的是指针

4、类型转换

转Boolean:在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,
其他所有值都转为 true,包括所有对象。

对象转原始类型:对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数

5、说一下事件代理?

事件委托是指将事件绑定到目标元素的父元素上,利用冒泡机制触发该事件

6、target、currentTarget的区别?

currentTarget当前所绑定事件的元素;target当前被点击的元素。

7、说一下宏任务和微任务?

宏任务:当前调用栈中执行的任务称为宏任务。(主代码快,定时器等等)。

微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务为
微任务。(可以理解为回调事件,promise.then,proness.nextTick等等)。

宏任务中的事件放在callback queue中,由事件触发线程维护;微任务的事件放在微任务队列中,
由js引擎线程维护。

8、说一下继承的几种方式及优缺点?

借用构造函数继承,使用call或apply方法,将父对象的构造函数绑定在子对象上
原型继承,将子对象的prototype指向父对象的一个实例
组合继承

原型链继承的缺点

字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
借用构造函数(类式继承)

借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。
组合式继承

组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,
而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,
又保证每个实例都有它自己的属性。

9、说一下闭包?

闭包的实质是因为函数嵌套而形成的作用域链

定义即:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包

10、export和export default的区别?

使用上的不同

export default  xxx
import xxx from './'

export xxx
import {xxx} from './'

11、什么是会话cookie,什么是持久cookie?

cookie是服务器返回的,指定了expire time(有效期)的是持久cookie,没有指定的是会话cookie

12、数组去重

es6: 
Array.from(new Set(array))     //Array.from()能把set结构转换为数组
Set去重:[...new Set(array)]

indexOf去重:let newArr = [];for (...) {if(newArr.indexOf(arr[i])==-1){newArr.push(arr[i]);}}
splice去重:for(...i){ for(...j){if(arr[i]==arr[j]){arr.splice(j,1);j--;}} }
sort去重:arr = arr.sort();let array = [arr[0]];for(){if(arr[i]!=arr[i-1]){array.push(arr[i])}}
includes去重:if(!newArr.includes(arr[i])){newArr.push(arr[i]);}

13、get、post的区别

get传参方式是通过地址栏URL传递,是可以直接看到get传递的参数,post传参方式参数URL
不可见,get把请求的数据在URL后通过?连接,通过&进行参数分割。psot将参数存放在HTTP
的包体内

get传递数据是通过URL进行传递,对传递的数据长度是受到URL大小的限制,URL最大长度是
2048个字符。post没有长度限制

get后退不会有影响,post后退会重新进行提交

get请求可以被缓存,post不可以被缓存

get请求只支持URL编码,post支持多种编码方式

get请求的记录会留在历史记录中,post请求不会留在历史记录

get只支持ASCII字符,post没有字符类型限制

14、主要是用es6哪些新特性

 不一样的变量声明:const和let;
 模板字符串:${}和反引号;
 箭头函数(Arrow Functions):精简代码;
 函数的参数默认值:给定默认值,省去在函数体内赋值;
 Spread / Rest 操作符:函数传入多个参数时,函数可用...+形参名称接收;
 对象和数组解构:const {a,b} = obj;
 for...of 和 for...in
 ES6中的类:继承关键字super()

15、防抖和节流的概念、用途、优缺点、实现方式、区别

 函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,
 如果n秒内高频事件再次被触发,则重新计算时间。

 函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。
 
 函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,
 以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。
 
 防抖实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
 防抖的缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟
 节流实现方式:每次触发事件时,如果当前有等待执行的延时函数,则直接return

 两者区别:函数节流一定会在指定时间内触发一次事件处理函数,而防抖函数则是在最后一次触发事件后执行函数
 使用场景:防抖函数在页面下拉刷新时可以使用,节流函数在页面比如在滚动中一定时间内触发Ajax

16、this关键字

“this” 一般是表示当前所在的对象,但是事情并没有像它应该的那样发生。JS中的this关键字由
函数的调用者决定,谁调用就this就指向哪个。如果找不到调用者,this将指向windows对象

17、变量的提升

变量的提升是JavaScript的默认行为,这意味着将所有变量声明移动到当前作用域的顶部,
并且可以在声明之前使用变量。初始化不会被提升,提升仅作用于变量的声明。

18、js的异步情况以及异步解决

js的异步情况:
    1)异步函数,比如 setTimeout和setInterval
    2)ajax
    3)node.js中的许多函数也是异步的
异步问题的解决
    1)命名函数:清除嵌套回调的一个便捷的解决方案是简单的避免双层以上的嵌套,
                           传递一个命名函数给作为回调参数,而不是传递匿名函数
使用promise
    promise在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了
    promise还可以做若干个异步的任务

19、解释一下严格模式(strict mode)

严格模式用于标准化正常的JavaScript语义。严格模式可以嵌入到非严格模式中,关键字 

‘use strict’。使用严格模式后的代码应遵循JS严格的语法规则。
例如,分号在每个语句声明之后使用。

20、apply 和 call 什么含义,什么区别 ?什么时候用 ?

call,apply 都属于 Function.prototype 的一个方法,它是 JavaScript 引擎内在实现的,因为
属于 Function.prototype,所以每个 Function 对象实例(就是每个方法)都有 call,apply 属性。
既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为
它们的作用一样,只是使用方式不同。

相同点:两个方法产生的作用是完全一样的。
不同点:方法传递的参数不同。

每个函数对象会有一些方法可以去修改函数执行时里面的 this,比较常见得到就是 call 和 apply,
通过 call 和 apply 可以重新定义函数的执行环境,即 this 的指向。

21、简述Promise

Promise 是异步编程的一种解决方案,比传统的异步解决方案【回调函数】和【事件】
更合理、更强大。现已被 ES6 纳入进规范中。

Promise类的构造函数接受一个参数,该参数是一个函数(执行器函数,可以参照mdn中
promise说明),执行器函数在实例化后立即执行(resolve或reject)

Promise有三种状态,分别是pending/fulfilled/rejected,一旦状态确定就不可更改

状态改变只能是pending=>fulfilled 或者 pending=>rejected;

resolve和reject函数是用来更改状态的 resolve: fulfilled reject: rejected

then方法内部做的事情就判断状态 如果状态是成功 调用成功的回调函数 如果状态是失败 
调用失败回调函数 then方法是被定义在原型对象中的

then成功回调有一个参数 表示成功之后的值 then失败回调有一个参数 表示失败后的原因

22、async/await的用法和理解

async 是一个修饰符,async 定义的函数会默认的返回一个Promise对象resolve的值,
因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数

await 也是一个修饰符,await 关键字 只能放在 async 函数内部, await关键字的作用 就是获取
Promise中返回的内容, 获取的是Promise函数中resolve或者reject的值
如果await 后面并不是一个Promise的返回值,则会按照同步程序返回值处理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值