1.列出你所知道的js的数据类型,是typeof运算符显示出来的;
undefined;定义了但是未赋值
string;字符串类型;
number;数字类型
Boolean;布尔类型
object;对象
function;函数
2.对this的理解:
this是JavaScript的一个关键字;他是函数运行时自动生成的一个内部对象,只能在函数内部使用;
this指的是调用函数的那个对象;this在函数定义的时候是确定不了的,
只有在函数执行的时候才能确定this指向的到底是谁,实际上this最终指向的是调用它的对象。
3.bind,call跟apply的区别;
bind,call,apply都是改变this指向的方法;
call跟apply可以直接使用;bind需要一个变量接取一下;
call中有多个参数,第一个参数是将this指向改变成谁,后面的参数是传入的实参;
apply中有两个参数,第一个参数是将this指向改变成谁,第二个参数是一个数组,数组中是传入的实参;
bind中有多个参数,第一个参数是将this指向改变成谁,后面的参数是传入的实参;
4。封装一个函数实现深拷贝(复制对象或者数组):
function copy(obj){
var newobj={};
for(let key in obj){
if(typeof obj[key]=="object"){
newobj[key]= copy(obj[key]);
}else{
newobj[key]= obj[key];
}
}
return newobj
}
5.请写出浏览器执行网页的原理:
1.连接服务器
2.浏览器获取请求
3.服务器响应
6.谈谈你对闭包的理解:
闭包就是 一个能读取函数内局部变量 的函数;
闭包形成条件是函数嵌套跟内部函数读取外部函数的局部变量;
闭包的特点是(1.可以在函数外部读取函数内部的局部变量;
(2.读取的变量可以持久化存储在内存中,不会因为外部变量的调用而销毁;
(3.可以解决全局变量污染的问题,私有化变量
(4.违背了垃圾处理机制;
缺点:内存泄漏;
7.请描述你对函数柯里化与反柯里化的理解?
柯里化就是一个包含一个参数并且返回一个函数的函数;
柯里化实际是把简单的问题复杂化的同时也在我们使用函数时拥有更多的自由度;
而这里对于函数参数的自由处理正是柯里化的核心所在,柯里化本质上是降低通用性,提高适用性;
可以理解为提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数。因为这样的特性,也被称为部分计算函数。柯里化,是一个逐步接收参数的过程。
反柯里化,是一个泛型化的过程。它使得被反柯里化的函数,可以接收更多参数。使本来只有特定对象才适用的方法,扩展到更多的对象。
8.请写出对模块化的理解,以及ES6的模块化和commonjs模块化的关键字(按需导入和按需导出对应进行书写)
模块化就是将完整的长篇代码文件根据不同的功能划分成几个文件,这些文件各自负责一个独立的功能,各个文件组合起来实现一个完整的大功能,这就是模块化,每个负责独立功能的文件就是模块
es6默认导入:import module from“地址”
按需导入:import {导入的变量} from“地址”
默认导出:export default{}
按需导出:export 导出的变量
commonjs的默认导入:require(“路径”)
默认导出:module.exports={导出的内容};
module.exports.变量名=“值”;
exports.变量名=“值”
9.重构数组的some方法:
// 2.some
// 只要有一个满足一个条件 返回true 跳出循环
var arr = [1, 2, 3, 4];
Array.prototype.mySome = function (fun, obj) {
for (let i = 0; i < this.length; i++) {
if (obj ? fun.call(obj,this[i],i,this):fun(this[i],i,this)){
return true;
}
}
return false;
}
var res = arr.mySome(function (item, index, arr) {
console.log(this); //两次zhangsan
return item > 1;
}, { name: "zhangsan" });
console.log(res); //true
10.请描述你对原型和原型链的理解;
每个构造函数都有一个原型对象Prototype,该原型对象可以通过该构造函数的实例化对象直接访问到
每一个对象都有一个proto属性,该属性指向该对象的原型对象;每一个原型对象也是对象,也有proto属性;这样一层一层往上查找就形成了原型链;
原型链可以帮助我们完成方法的继承(原型链继承);
11.请描述你对事件循环的理解:
js是一门单线程语言,同一个时间只能做一件事情,所有的任务在执行的时候都需要排队等候,单线程可能会造成页面阻塞的问题;
事件循环也叫事件轮询,就是同步任务进入到主线程,异步任务进入到任务队列中;
当主线程的同步任务走完之后,再运行任务队列中的异步任务;这个过程会一直重复;
12.前端路由原理(hash模式跟history模式):
hash模式:#后面的被称之为锚点(hash值),页面在不刷新的情况下通过锚点的改变改变页面的内容;
history模式:history模式是HTML5新增的特性:他可以操纵页面的前进跟后退,
history新增api:history。pushstate(),可以操纵页面的前进跟后退,但是不会刷新页面,history。pushstate有三个值,第一个值为跳转的状态,第二个为跳转的标题,第三个是跳转的路由,他可以在我们看不到的地方将状态压入历史记录栈中;
需要在服务器下运行;
13.事件委托的原理:
事件委托就是利用时间冒泡的原理将原本绑定在子元素身上的事件委托给父元素;
后期可以通过e.target获取到具体点击的元素;
减少了事件的绑定,提高了性能;
新增的元素可以获取到父元素身上的事件;
14.函数节流跟事件防抖的原理:
函数节流:将一段时间内多次触发的某个事件改变成过一段时间触发一次;
事件防抖:将一段时间内多次触发的某个事件改变为只触发最后一次;
15.对垃圾回收机制的理解:
垃圾处理机制就是:清除内存中定义了但是没有使用的变量,释放内存;
16.请描述你所知道的设计模式以及使用场景跟思路:
单例模式就是一个类只能生成一个对象,如果希望一个系统中某个类的对象只存在一个单例模式就是最好的选择;
观察者模式就是多个订阅者监听一个发布者状态的变化,从而使这些观察者的状态发生改变;应用场景是当一个对象状态的更新需要其他对象同步更新,而且其他对象的数量动态可变;
工厂模式:创建对象,可以理解为定义了一个普通的函数,在函数内部写入了一个对象,每次调用这个函数都会创建一个新对象;
17.Ajax的流程,readyState和status的意思?
流程:(1.创建一个XMLHTTPRequest对象;
(2.配置相关请求信息:xhr.open(请求方法,url,是否异步);
(3.发送请求xhr.send()
(4.响应结果判断响应状态码status跟请求状态码readystate是否成功,成功的话响应数据responseText;
readyState意为请求状态码:0:未创建对象
1:创建对象成功,发送请求
2:发送请求成功;
3:读取响应信息
4:响应信息读取成功;
statue意为响应状态码:常见的有200响应成功
404前端路径错误
500服务器出错;
18.请描述你对前后端分离架构的理解:
前端就是用户可以看得到的地方;
后端包括服务端跟数据库端;
1. 地址栏输入地址------->发请求------>服务器接收请求------>从数据库找到对应的数据----->把数据库的数据和百度的模板做一个拼接------>响应给前端
2. 下拉滚动条------->向后端发请求-----》 索要8条数据------->后端从数据库中找到对应的数据------> 响应回来---->前端拿到数据,进行数据的渲染
19.请写出你对promise的理解以及promise的方法以及作用:
promise是ES6新增的解决异步编程的方法是一个构造函数;
promise上的方法有.then,当状态是成功的时候走then,如果状态是失败且没有定义catch时失败的状态走then的第二个函数;
.catch当状态是失败的时候走catch;
promise.all([])当promise的对象状态全都是成功时, promise.all([])返回成功的状态,如果有失败的状态则返回第一个失败的状态;
promise.race()运行promise对象中响应最快的结果;
20.请写出你对声明提升的理解:
当js代码运行时,js引擎会将作用域中var跟function声明类的提到当前作用域的最前方;
如果变量名跟函数名相同,函数名会在变量名的上方;
21.数组常用方法:
join数组转字符串
concat数组拼接
push后方插入
pop后方删除
unshift前方插入
shift前方删除
reverse倒序输出
indexOf从前方开始查找元素,返回下标
lastindexOf从后方开始查找元素,返回下标
splice在数组任意位置添加删除内容;
slice截取
22.ES6的新特性
let跟const
箭头函数
模板字符串
promise
模块化开发export default,import module from“地址”
解构赋值
扩展运算符;
set集合跟map集合
默认参数;
class类
23.请写出你知道的node中的官方模块;
http打开一个服务;
fs对文件进行读写;
url对url地址栏的值进行分析;
queryString将字符串转换为对象;
path进行拼接,用于格式化以及进行完整的拼接;
时间冒泡和捕获?如何阻止?事件默认行为?
dom0级绑定只支持冒泡
dom2级支持捕获也支持冒泡 事件源.addEventlistener(“事件类型”,事件处理函数,true或者false)默认是false,冒泡,true是捕获
捕获就是事件触发时从外层向内层传递
冒泡就是从最具体的元素想外层依次传递;
阻止冒泡:e.stopPropagation;
阻止事件默认行为.e.preventDefault();
return false
事件流:
就是事件的流向
事件流有三个阶段:
捕获阶段
目标阶段
冒泡阶段
tagname的返回类型是一个伪数组;
js数据类型存储位置:
基本数据类型跟引用数据类型的变量值都存在在栈内
基本数据类型的值存储在栈内,引用数据类型的地址值存在堆内
块级作用域:
如果在for循环中如果使用let跟const定义变量就形成了块级作用域;
在块级作用域外部无法获取到定义的变量;
判定箭头函数的this:
箭头函数是没有this指向的;他的this指向箭头函数上下文相关的内容;
http跟https区别:
HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息
https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
https协议需要到ca申请证书。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
class类?class与ES5写法的区别?
class类是es6新增的关键字,专门用来创建类;
es5主要通过构造函数跟原型方式定义一个类;
get与post的区别:
get传输数据快,不够安全,传输的数据量小;
post传输数据慢,安全,传输的数据量大;
url的长度有限1-1024kb;
get的请求参数可以直接写在url中;
post得写在send中,post得在open跟send中间添加请求头setRequestHeader;
定时器中this的指向为window
继承方式:
属性的继承(通过调用父类的构造函数)方法继承(原型链的继承)
即想继承方法又想继承属性就需要用组合继承;
es6新增的class类继承
class 子类 extends 父类{
constructor(){
super()
}
}
object.definedProperty?
es5新增的Vue2的底层语法,为对象增加属性;
object.definedProperty(哪个对象,对象的那个属性,{
存取描述符get(),set();对对象的设置跟获取进行拦截(数据劫持)存取描述符的get,set跟数据描述符的value跟wretable是冲突的只能设置其中一个;
数据描述符4个:value给属性设置值
writable:true设置对象的属性能否被修改;
configurable:true设置对象能否被删除;
ennumerable:true设置对象能否被遍历
})
object.definedProperty跟普通添加对象属性的区别是object.definedProperty内有拦截层,可以再拦截层做一些自己的业务逻辑;
可以更底层的操作对象的增删改查
object.definedProperty做数据代理跟proxy代理的区别
object.definedProperty做数据代理时只能对代理的数据进行设置跟获取的操作,不能进行添加跟删除;
proxy可以对代理的对象进行设置,获取,添加,删除的操作;