淑芬已经成功入职上班了,给大家分享一下自己总结的面试题

发布于:2022-12-21 ⋅ 阅读:(740) ⋅ 点赞:(0)

JS部分

1、什么是原型,什么是原型链

每个构造函数(class)都有一个显示的原型prototype

每个实例对象都有个隐示原型 _proto_

实例的隐示原型 _proto_等于其构造函数的显示原型protype

当查找一个对象的属性或方法时先在实例上查找,找不到沿着 _proto_向上逐级查找

我们把 _proto_的_proto_形成的链条关系成为原型链

作用:原型链实现了js继承,原型可以给构造函数创建的实例添加公用方法解释:

1. 实例对象a只有__proto__(隐式原型),构造函数既有 __proto__(隐式原型)也有prototype(显式原型)

2. __proto__ 和 prototype 都是一个对象,既然是对象,就表示他们也有一个 __proto__

2、var、const和let的区别

var在ES5提出,let和const是在ES6提出的

let和const 不存在变量提升,var声明变量会存在变量提升。即变量可以在声明之前调用,值为undefined

let 和const在同一作用域下不能重复声明,var可重复声明

const 声明必须赋值,值不能修改

3、this指向问题

  1. 事件响应函数的this指向调用者
  2. setTimout setInterval 的this指向window
  3. 箭头函数的this指向上一层作用域的this
  4. 对象中的this指向对象
  5. call,apply,bind响应的函数this指向第一个参数
  6. 构造函数new函数名()this指向new出来的对象的实例

4、http状态码代表什么

  1. 1xx 表示HTTP请求已经接受,继续处理请求
  2. 2xx 表示HTTP请求已经处理完成(200)
  3. 3xx 表示把请求访问的URL重定向到其他目录(304资源没有发生变化,会重定向到本地资源)
  4. 4xx 表示客户端出现错误(403禁止访问、404资源不存在)
  5. 5xx 表示服务器出现错误

5、异步和同步

同步是按顺序执行,会阻塞代码

异步是非阻塞式执行代码

异步方法:回调函数,Promise,订阅发布模式,事件响应,async和await

6、null和undefined的不同

null的数据类型为object,代表空,空指针

undefined的数据类型为undefined,代表定义了没有赋值,

console.log(null);//null
console.log(undefined);//NaN
console.log(null+22);//22
console.log(undefined+22)//NaN
//NaN代表非数字,代表未定义或者不可表示的值

7、事件流

冒泡流:事件由最具体的元素响应然后逐渐冒泡到最不具体的元素

捕获流:从最不具体的元素捕获事件

开启捕获addEventListenter 第三个参数true

阻止事件冒泡:e.stopPropagation

8、cookie、localstorage、sessionstrorage之间有什么区别?

1、与服务器交互:

cookie 是网站为了标示用户身份而储存在用户本地终端上的数据(通常经过加密)

cookie 始终会在同源 http 请求头中携带(即使不需要),在浏览器和服务器间来回传递

sessionStorage 和 localStorage 不会自动把数据发给服务器,仅在本地保存

2、存储大小:

cookie 数据根据不同浏览器限制,大小一般不能超过 4k

sessionStorage 和 localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大

3、有期时间:

localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据

sessionStorage 数据在当前浏览器窗口关闭后自动删除

cookie 设置的cookie过期时间之前一直有效,与浏览器是否关闭无关

9、ajax和axios的区别

axios是通过promise实现对ajax技术的一种封装,就像jQuery实现js封装一样。

优缺点:ajax本身是针对MVC的编程,不符合现在前端MVVM

10、箭头函数和普通函数的区别

1、箭头函数的this指向上一层作用域的this

2、箭头函数不能作为构造函数,没有constructor

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

1、值类型key和value都存储在栈中

2、引用类型栈中存内存地址,真正值存储在堆中

3、实例:

(1)、var a=15 ; var b=a; b=20; b与a互相不影响

(2)、var a= {age:15} ; var b = a; b.age=18; 此时a.age也是18

12、什么是闭包,闭包的应用场景,闭包的缺点

1、闭包就是函数嵌套函数,函数作为参数被传入,作为返回值被返回

2、闭包的作用

(1)、在函数外部访问函数内部变量成为可能

(2)、形成局部作用域

3、闭包的缺点

被闭包引用的变量不会被js垃圾回收机制回收,会常驻内存,使用不当容易造成内存崩溃

4、如何解决闭包的缺点

少用或者不用闭包

手动释放

13、数组去重的方法

14、浅拷贝和深拷贝

15、JavaScript数据类型

基本数据类型:字符型,布尔型,数字型,空(null),未定义(undefined)、symbol

引用数据类型:对象,数据,函数,正则(RegExp),Date(日期)

HTML和CSS部分

1.transition和animation的区别

Animation和transition大部分属性是相同的,他们都是随时间改变元素的属性值,

他们的主要区别是

transition需要触发一个事件才能改变属性;

animation不需要触发任何事件的情况下才会随时间改变属性值;

并且transition为2帧,从from .... to,而animation可以一帧一帧的。

2.BFC是什么,如何开启BFC?

定义:

BFC 全称:Block Formatting Context, 名为 "块级格式化上下文"。

W3C官方解释为:BFC它决定了元素如何对其内容进行定位,以及与其它元素的关系和相互作用,当涉及到可视化布局时,Block Formatting Context提供了一个环境,HTML在这个环境中按照一定的规则进行布局。

简单来说就是,BFC是一个完全独立的空间(布局环境),让空间里的子元素不会影响到外面的布局。那么怎么使用BFC呢,BFC可以看做是一个CSS元素属性

如何开启BFC:

  • overflow: hidden
  • display: inline-block
  • position: absolute
  • position: fixed
  • display: table-cell
  • display: flex

3、定位区别

relative 相对定位 正常文档流 相对于自身的位置

absolute 绝对定位 脱离文档流 相对于开启了position非static最近的父辈元素

fixed 固定定位 脱离文档流 相对于浏览器定位(不随滚动条滚动)

4、简述href和src的区别

src(source)用于替换当前的元素,指向外部资源的位置,指向的内容会嵌入到文档中的标签所在的位置,;在请求src资源时会将其指向的资源下载并应用到文档内;例如:js脚本,img图片

href(Hypetext Reference),指向网络所在的位置(可指向在线资源),建立和当前元素或文档之间的链接;

src和href最大的区别,src使用时,会先暂停其他资源的下载和处理,直到该资源加载完成。href指向资源所在位置,加载时并不会停止其他资源的加载。

5、优雅降级和渐进增强

优雅降级:先针对高版本的浏览器构建页面,以求功能的完善,然后再对低版本浏览器进行兼容

渐进增强:先对低版本浏览器以求最基本的功能,然后再对高版本浏览器的效果和交互等功能追求更好的用户体验。

6、css权重

第一等:内联样式 >内部样式 > 外部样式

第二等:id选择器 权重100

第三等:class(类)选择器; 伪类选择器;属性选择器 权重 10

第四等:标签选择器,伪元素选择器 权重 1

选择器权重总结:id选择器 > class选择器 = 伪类选择器 = 属性选择器 > 标签选择器 = 伪类选择器

7、如何写个三角形

width: 0px;

height: 0px;

display:block;

border:10px solid transparent(全背景透明)

border-left-color:red;

8、html5标签有哪些

header(头部)、nav(导航栏)、main(主要部分)、section(节)、aside(侧边栏)、arcticle(文章段落)、footer(脚注)。

9、清除浮动,解决父元素坍塌问题

1、父元素坍塌,给父元素设置overflow属性

2、使用伪元素清除浮动

注意:伪元素清除浮动,display:block;content: ' ';

10、 css垂直居中的几种方法

1、弹性盒子

2、父元素position:relative ;子元素position:absolute

top:0px;bottom:0px;left:0px;right:0px;margin: auto;

3、父元素不动,子元素设置

position:relative;top:50%; left:50%; tranfrom:translate(-50%,-50%)

11、html5新增的元素和功能

语义化标签:header、nav、section、article、aside、detailes、summary、dialog

新增音频和视频标签:video、audio

新整Canvas绘图

新增svg绘图

新增拖放<div draggble="true"></div>

小程序部分

1、小程序传递参数的方法

1、使用全局变量,在app.js中this.globalData={}中放入要存储的数据,在组件.js中,头部引入const app=getApp();湖区全局变量,直接app.globalData.key来进行赋值

2、使用路由,wx.你avigateTo和wx.redirectTo时,可以通过在url后拼接+变量,然后在目标页通过onLoad周期中,通过参数来获取传递过来的值

3、使用本地缓存

Vue部分

1、v-if和v-show的区别

都可以隐藏节点,v-show是通过操作css隐藏,v-if是直接移除dom节点,频繁切换显示和隐藏用v-show,反之用v-if。

2、$router和$route 的区别

$route的当前页面路由信息,params,query,path,fullpath

$router使整个路由实例,通常带方法,push,replace,back,forward,go

3、什么是MVVM(前后端分离)

M:model模式存储数据

V:view显示内容

VM:viewModel视图模块,连接视图与model模型

当model数据发生变化时通过VM可以监听变化更新视图

当view视图发生变化时可以通过VM监听变化自动更新视图

4、Vue的router-link和a标签的本质区别

a标签:a标签跳转,页面会重新加载,相当于重新打开一个网页。

router-link:通过router-link跳转不会跳转到新的页面,不会重新渲染。

a标签和router-link对比,router-link避免了重复渲染,减少了dom性能的损耗。

5、在vue-for循环中为什么必须要加上key

key为了让vue虚拟dom节点查找与更新更加优化,

6、computed与watch区别

computed有缓存,watch没有

computed从现有数据计算出新的数据,watch是监听数据变化执行handler回调函数

computed 多对一,watch 一对多

7、vue生命周期

1、 概念:我们把一个对象从生成(new)到销毁(destory)的过程,称为生命周期

2、八大生命周期钩子函数

beforeCreated

Vue实例初始化之前调用

created

Vue实例化初始化之后调用

beforeMount

挂载到DOM树之前调用

mounted

挂载到DOM树之后调用

beforeUpdate

数据更新之前调用

update

数据更新之后调用

beforeDestory

Vue实例销毁之前调用

destoryed

Vue实例销毁之后调用

8、谈谈Vuex。

1、什么是Vuex?

Vuex是vue的全局状态管理器,当state更新,引用state组件的视图会响应式更新;本质上就是一个没有template的Vue文件,通过Vuex可以更好集中管理数据,多个组件共享数据。

2、Vuex有哪些组件?

存储数据的:state

获取数据state数据唯一方式:getters

修改数据唯一方式:mutations

异步操作的:actions

模块:module

9、Vuex和全局变量的区别

1、都可以实现多个组件全局共享数据

2、Vuex的数据是响应式的,会自动更新视图

3、Vuex的修改必须是mutations,更加利于调试

4、Vuex还支持异步操作,方便Vuex插件便于调试

10、哪些数据你存储在vuex中

当多个组件都需要的数据通常存储在Vuex里面

用户相关信息:token,用户信息,权限信息,第三方登陆信息,用户访问历史

设置信息:主题,自定义菜单

11、在Vue-for循环中为什么设置key值

12、什么是虚拟dom,优点

1、虚拟dom就是一个普通的js对象,包含了tag、props、children三个属性,以这三个属性来描述一个dom节点

2、优点:虚拟dom是一个普通的js对象,实际是对js对象属性的更改;虚拟dom是运用diff算法来计算出真正需要更新的节点,最大限度地减少dom操作以及dom操作带来的排版和重绘,从而提高性能。

13、nextTick作用(全局方法)

数据更新,等待视图更新执行的回调函数(dom操作常用)

14、vue的修饰符有哪些

15、单页面spa和多页面mpa的区别

单页面(spa)

概念:只有一个html页面,所有的跳转方式都是通过组件切换完成的

优点:页面之间跳转流畅、组件开发可复用,开发便捷,易维护

缺点:首屏加载较慢,加载整个项目中使用的css,js,seo优化不好

多页面(mpa)

概念:整个项目有多个html,所有跳转方式都是页面之间相互跳转

优点:首屏加载比较快,只加载本页面所用的css、js;seo优化比较好

16、哈希路由(hash)和历史路由的区别(history)

hash路由:

原理:通过监听浏览器onhashchange事件变化查找对应的路由应用,通过改变localtion.hash改变页面路径

history路由:

原理:通过html5中history interface新增的pushState()和replaceState()方法,改变页面路径

17、vue修饰符

vue中五种修饰符:事件修饰符、鼠标修饰符、表单修饰符、键值修饰符、v-bind修饰符

表单修饰符

v-model-lazy:光标离开表单时,赋值给value

v-model-trim:自动过滤用户输入的首空格字符,而中间的空格不能过滤

v-model-number:自动将用户的输入值转化为数值类型

事件修饰符:

@click.stop:阻止事件冒泡

@click.prevent:阻止事件默认行为

@click.self:当前元素触发时处理函数

@click.once:绑定了只能触发一次

@click.captrue:使事件触发从包含这个元素的顶层开始往下触发

@scroll.passive:

鼠标修饰符:

@click.left左键点击

@click.right右键点击

@click.middle中键点击

18、vue插槽

微信小程序

1、微信小程序有几个文件

wxml:微信自己定义的一套组件

wxss:用于描述wxml的组件样式

js:逻辑处理

json:小程序页面配置

闭包

什么是闭包

函数嵌套函数,函数作为参数被传入,作为返回值被返回

要理解闭包就要去理解变量的作用域,在JS中存在两种变量的作用域,一种是全局变量,一种是局部变量。两种变量的区别就是函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

那什么是闭包呢?闭包是指有权访问另外一个函数作用域中的局部变量的函数。声明在一个函数中的函数,叫做闭包函数。而且内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

闭包的特点

  1. 让外部访问函数内部变量成为可能
  2. 局部变量会常驻在内存中
  3. 可以避免使用全局变量,防止全局变量污染
  4. 会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,并且互不干扰。闭包会发生内存泄漏,每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址。但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根指针给内部活动对象。大概意思就是说当外部函数运行结束甚至销毁时,局部的变量key=value,尽管key被垃圾回收机制给回收了,但是value仍不会被回收,会变成一个自由变量留下引用的指针。

例子1(手动释放闭包)

<script>
    var age = 10;
    function foo() {
        console.log(age);//-----------------1
        //name作为函数内部的变量,外部访问不到。
        var name = "hunt_bo";
        //name作为函数值被返回,实现了外部访问函数内部变量
        return function () {
            console.log(name);
        }
    }
    console.log(name);//---------------2
    var bar = foo();
    bar();
    //手动释放闭包
    bar=null
</script>

例子2

function addCount(){
	var count = 0;
	return function(){
		count += 1;
		console.log(count);
	}
}
var fun1 = addCount();
var fun2 = addCount();
fun1();//1
fun1();//2
fun1();//3
fun2();//1
fun2();//2

解析:就会发现替他打印的不是12345,而是12312,那这是什么原因呢,这就回到了上边介绍的那句话:每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址。所以说虽然fun1和fun2都是addCount(),但是呢都创建了新地址,都是自己的,互不干扰。

例子3

function fnnn(){
   	var arr = [];
   	for(var i = 0;i < 5;i ++){
		arr[i] = function(){
			return i;
	 	}
   	}
   	return arr;
}
var list = fnnn();
for(var i = 0,len = list.length;i < len ; i ++){
   console.log(list[i]());
}
//打印结果   5 5 5 5 5

手写ajax

//1、创建一个xhr对象
var  xhr=new XMLHttpRequest();
//2、打开连接get方式
xhr.open("get","url地址")
//3、发送数据
xhr.send(data)
//4、发送数据到服务器
xhr.onreadystatechange = function () {
    // 监听xhr的变化
    if (xhr.readystate === 4) { //状态4成功
        if (xhr.status === 200) { //响应码200
            // xhr.responseText 获取的数据
        }
    }
}

清除浮动的方法

为什么要清除浮动,因为浮动的盒子脱离标准流,如果父盒子没有设置高度的话,子盒子就会把父盒子撑起来。

解决浮动带来的问题

1、额外标签法(在最后一个浮动标签后,新加了一个标签,给其设置clear:both;)

2、父级元素overflow属性(父元素添加overflow:hidden)(不推荐)

3、使用after伪元素清除浮动(推荐)

  .box {
            background-color: pink;
        }

        .one {
            width: 300px;
            height: 300px;
            float: left;
            background-color: red;
        }

        .two {
            width: 200px;
            height: 200px;
            float: left;
            background-color: blue;
        }

         .box:after {
            content: "";//必加
            display: block;//伪元素只对块元素起作用
            clear: both;
        } 


<div class="box">
        <div class="one"></div>
        <div class="two"></div>
    </div>

2、给父元素加overflow属性进行清除浮动

 .box {
            background-color: pink;
            overflow: auto;
        }

        .one {
            width: 300px;
            height: 300px;
            float: left;
            background-color: red;
        }

        .two {
            width: 200px;
            height: 200px;
            float: left;
            background-color: blue;
        }



 <div class="box">
        <div class="one"></div>
        <div class="two"></div>
    </div>

使用after和before双伪元素清除浮动

 .box {
            background-color: pink;
        }

        .one {
            width: 300px;
            height: 300px;
            float: left;
            background-color: red;
        }

        .two {
            width: 200px;
            height: 200px;
            float: left;
            background-color: blue;
        }

        .box:after,
        .box:before {
            content: '';
            display: block;
        }

        .box:after {
            clear: both;
        }

        .box:before {
            *zoom: 1;
        }

 <div class="box">
        <div class="one"></div>
        <div class="two"></div>
    </div>

本文含有隐藏内容,请 开通VIP 后查看