前端面试题总结(未完待续)

236 阅读12分钟

1.请描述一下cookies、sessionStorage和local Storage

参考答案
共同点:都是保存在浏览器端,且同源的。
区别:
cookie sessionStorage localStorage
储存方式 在浏览器和服务器间来回传递 不会自动把数据发给服务器,仅在本地保存 同左
储存大小的限制 不能超过4k 比cookie大得多,可以达到5M 同左
数据有效期 只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭 仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持 始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据
作用域 在所有同源窗口中都是共享的( 即数据共享 ) 不在不同的浏览器窗口中共享,即使是同一个页面(即数据不共享) 在所有同源窗口中都是共享的
参考链接:cookie、localStorage和sessionStorage 三者之间的区别以及存储、获取、删除等使用方式

2.定位position的值有哪几种?区别是什么?

参考答案
static fixed relative absolute
对象是否存在标准文档流中 否,若离标准文档流 否,若离标准文档流
top, right, bottom, left 等属性 失效 否,若离标准文档流 否,若离标准文档流
相对于谁定位 —— 相对于浏览器窗口进行绝对定位 相对于该对象在标准文档流中的位置进行偏移 相对于static定位以外的第一个父元素进行绝对定位

结论:

1.从位置上(是否脱标)

staticrelative位置上以及形态上没有任何变化

absolutefixed靠内容撑开盒子,脱离标准流,不占位置


2.从相对谁定位上来看

通过top、left等属性值得出结论


static与在top、left属性下作用无任何改变

relative在自己原来的位置产生变化即相对自己原来的位置定位

fixed相对于浏览器窗口定位,永远固定在浏览器窗口的一个位置,不随文档滚动而滚动

absolute分两种情况

1.在父元素没有定位的情况下,它的定位相对于浏览器窗口定位,但不固定

2.在父元素定位的情况下,它的定位相对于父元素作为定位

3.写出下面代码输出什么

    undefined == null  
    1 == true         
    0 == false        
    NaN == NaN          
    [] == false        
    null == Object     
参考答案
    undefined == null   //true  因为null == false //false   undefined == false  
    1 == true          //true   只要布尔类型参与比较,该布尔类型的值首先会被转换为数字类型
    0 == false         //true   根据布尔类型的ToNumber规则,true转为1,false转为0
    NaN == NaN          //false
    [] == false         //true
    null == Object      //false
    
相关资料补充——隐式转换的补充
1.++ -- 自加自减的隐式转换
        var a = "123";
        a++;
        console.log(a); 
        
        var b ="123";
        --b;
        console.log(b);//122
        
        var c = "啊啊啊";
        c++;
        console.log(c); 
1.++ -- 自加自减的隐式转换(参考答案)
        var a = "123";//Number(a)
        a++;
        console.log(a); //124
        
        var b ="123";
        --b;
        console.log(b);//122
        
        var c = "啊啊啊";
        c++;
        console.log(c); //NaN
在自加或自减中,会相相当于使用了Number()的转换,这种隐式转换只适用于字符串是数字,若非数字会出现NAN。
2.+ - * / % 的隐式转换
var b = "b" +1 ;
console.log(b);
var c = "1" +1 ; 
console.log(c);
2.+ - * / % 的隐式转换(参考答案)
var b = "b" +1 ;//String(1)
console.log(b);//b1
var c = "1" +1 ; 
console.log(c);//11
【 + - * / % 都是str -> number】
3.< > = 的隐式转换
var d  = "1" > 2;
console.log(d);   
var e  = 1 > "2";
console.log(e);  
var f = "a" > "b";
console.log(f);  
3.< > = 的隐式转换(参考答案)
var d  = "1" > 2;
console.log(d);   //false
var e  = 1 > "2";
console.log(e);   //false
var f = "a" > "b";//转换成ascii   < > = 都转换成number
console.log(f);   //false
4. "==" & "===" 的隐式转换
var a = 1 =="1";
console.log(a)//true
var c = 1 ==="1";
console.log(c)//false
var b = 1 !="2";
console.log(b);
4. "==" & "===" 的隐式转换(参看答案)
var a = 1 =="1";
console.log(a);//true
var c = 1 ==="1";//这个不进行隐式转换
console.log(c);//false
var b = 1 !="2";
console.log(b);//true
=== 全等号不进行隐式转换
5.NaN 的隐式转换
 //"==" & "===" 的隐式转换
 var a = 1 =="1";
 console.log(a);//true
 var c = 1 ==="1";//这个不进行隐式转换
 console.log(c);//false

 var b = 1 !="2";
 console.log(b);//true

//NaN 的隐式转换
var d = NaN == NaN;
console.log(d); //false

//比较的隐式转换
var f1 = 2 > 1 > 3;
console.log(f1);//false
var f2 = 2 > 1 == 1;
console.log(f2);//true

//undefined  null  的隐式转换
var  a1 = undefined > 0;
var  a2 = undefined < 0;
var  a3 = undefined = 0;
var  a4 = undefined == 0;
console.log(a1,a2,a3,a4);//false false 0 false

var b1 = null > 0;
var b2 = null < 0;
var b3 = null = 0;会报错
var b4 = null == 0;
console.log(b1,b2,b4);//false false false

var c = undefined == null;
console.log(c);//true
var c = undefined === null;
console.log(c);//false  因为数据类型不同
判断是否NaN——isNaN()
console.log(isNaN(123));//false
console.log(isNaN("123"));//false
console.log(isNaN(null));//false
console.log(isNaN(undefined));//true    undefined -> 隐式转换时 Number(undefined)属于NAN
//isNaN  ==>    Number(值) -> Nan -> bool
6.[] == ![] 输出什么?
1. [] == ![]

2. [] == false

3.[] == 0

4.'' == 0

5.0 == 0         

6.[] == ![] 输出什么?(参考答案)
1. [] == ![]
// true 因为 !的优先级比较高先执行,[]数组的存储属于堆,[] == []是false的

2. [] == false
//true 当比较中有布尔值时,优先把布尔值转化为数值  把false转化成 0 

3.[] == 0
//true 当比较中是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较(valueOf 和 toString)   [].toString() == 0  ——>  "" == 0  再进行比较

4.'' == 0
//true 当字符串和数值对比时,把字符串转为数值进行对比   即Number("") == 0   Number("")——>0 


4.怎么添加、移除、移动、复制、创建和查找节点(用原生JS)

参考答案

(1)创建新节点

   createDocumentFragment()    //创建一个DOM片段
   createElement()   //创建一个具体的元素
   createTextNode()   //创建一个文本节点

(2)添加、移除、替换、插入

    appendChild()
    removeChild()
    replaceChild()
    insertBefore() //在已有的子节点前插入一个新的子节点

(3)查找

    getElementsByTagName()    //通过标签名称
    getElementsByName()   

通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)

    getElementById()    //通过元素Id,唯一性

5.Js创建对象的有哪几种方式(代码举例实现)

参考答案 1.对象字面量方法
var p ={name:"Jokid",job:"doctor"}
console.log(p)    //{name: "Jokid", job: "doctor"}

2.构造函数模式

function person(name,age,job){
    this.name = "Jokid",
    this.age = 18,
    this.job = "teacher",
    this.init = function(){console.log(this.name)}
}

6简述AJAX的原理

参考答案

参考链接: 参考1

(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象
 (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息
 (3)设置响应HTTP请求状态变化的函数
 (4)发送HTTP请求
 (5)获取异步调用返回的数据
 (6)使用JavaScript和DOM实现局部刷新

7.谈谈你对Promise的理解并写出其基本模式代码

参考答案

参考链接: 参考1 参考2 参考3

8.JS有几种类型的值并简单描述

参考答案
    undefined
    null
    number
    string
    boolean
    object
    symbol————————是一种特殊的、不可变的数据类型,可以作为对象属性的标识符使用,表示独一无二的值。
    
    栈:原始数据类型(Undefined,Null,Boolean,Number、String)
 堆:引用数据类型(对象、数组和函数)

 两种类型的区别是:存储位置不同;
 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体

图

symbol 拓展

参考链接:symbol 拓展

9.说说你对闭包的理解

参考答案
闭包是什么?
闭包就是能够读取其他函数内部变量的函数
闭包的应用场景?

参考链接

10.写出JS面向对象中继承实现的代码(最少两种)

参考答案

参考链接:详解 继承

11.请描述Javascript是一门怎么样的编程语言

参考答案
js就是面向对象的弱类型语言
语言特性:面向对象(要掌握创建对象的多种方式,继承的多种方式、原型链),动态/弱类型语言

动态语言的特性
var num=10;//num是一个数字类型
num="jim";//此时num又变成一个字符串类型
//我们把一个变量用来保存不同数据类型的语言称之为一个动态语言,或者说是一个弱类型语言

12.请简述前端跨域的原因及解决方案

参考答案

13.如何判断一个变量的类型,并封装一个判断变量的函数

参考答案

14.请罗列数组操作方法,并标注哪些会改变原数组

参考答案

参考链接:数组方法不混淆 es6操作数组的方法 面试题大全——数组的操作

map: 遍历数组,返回回调返回值组成的新数组
forEach: 无法break,可以用try/catch中throw new Error来停止
filter: 过滤
some: 有一项返回true,则整体为true
every: 有一项返回false,则整体为false
join: 通过指定连接符生成字符串
push / pop: 末尾推入和弹出,改变原数组, 返回推入/弹出项【有误】
unshift / shift: 头部推入和弹出,改变原数组,返回操作项【有误】
sort(fn) / reverse: 排序与反转,改变原数组
concat: 连接数组,不影响原数组, 浅拷贝
slice(start, end): 返回截断后的新数组,不改变原数组
splice(start, number, value...): 返回删除元素组成的数组,value 为插入项,改变原数组
indexOf / lastIndexOf(value, fromIndex): 查找数组项,返回对应的下标
reduce / reduceRight(fn(prev, cur), defaultPrev): 两两执行,prev为上次化简函数的return值,cur 为当前值(从第二项开始)

15.请写出下面代码在控制台的运行结果,为什么?

console.log(a);//请写出输入结果
console.log(b);//请写出输入结果

var a =function(){};
var a = 100;

var b = 200;
function b(){}

console.log(a);//请写出输入结果
console.log(b);//请写出输入结果
参考答案

16.正则表达式在实际项目中的应用,请列举2~3个例子

参考答案

17.请描述get和post的区别?

参考答案
get post
在浏览器回退时 :---------------- :----------------
是否可以被Bookmark :---------------- :----------------
被浏览器主动cache :---------------- :----------------
请求编码 :---------------- :----------------
参数保留 :---------------- :----------------
传送参数的长度 :---------------- :----------------
对参数的数据类型 :---------------- :----------------
安全性 :---------------- :----------------
传参形式 参数通过URL传递 放在request body 中

参考链接:99%的人都理解错了HTTP中GET与POST的区别

18.请列举css隐藏元素的几种方法

参考答案

display:none元素隐藏,不再占有原来的位置

visibility:hidden元素隐藏,仍占有原来的位置

opacity:0元素隐藏,仍占有原来的位置

height,width:0元素隐藏,不占有原来的位置,但内容仍显示

19.原型链_proto_和prototype分别是什么?

参考答案

prototype(原型)

原型与原型链的关系

instance.constructor.prototype = instance.__proto__

20.使用过那些前端自动化构建工具,都解决了什么问题?

参考答案

21.请简述时间委托和时间循环(event loop)

参考答案

22.项目上做过哪些优化?

参考答案

23.使用过哪些设计模式及场景?

参考答案

24.如何实现一个new?

参考答案

new操作符具体干了什么呢?

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。

2、属性和方法被加入到 this 引用的对象中。

3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。

 var obj  = {};
 obj.__proto__ = Base.prototype;
 Base.call(obj);

25.css的居中

参考答案

1.关于文字居中

text-align: center

适用于行类标签,如div、p标签

vertical-align: middler

只对行内元素、表格单元格元素生效:不能用它垂直对齐块级元素,所以可以配合display: table-cell;使用

补充:
行内元素

不单独占一行

书写完成后不会自动换行

没有宽和高

不单独占一行

常用有:

a、b、button、i、img、input、label、select、span...

块级元素

独占一行

书写完会自动换行

宽和高可以修改

常用有:

div、p、li、nav、ul...

关于行块级元素,详情可参考:探究行内元素和块级元素 最全的居中

26.列举一下项目中常用得css预处理/后处理方案,对比一下优缺点和使用场景区别

参考答案

27.列举一下你常用得HTML语义化标签,说明使用场景。只用语义化标签来写页面结构是否合适?

参考答案

28.列举一下你常用得JS内置数组操作API,说明一下再不同应用场景下的选择

参考答案

29.请写一个function,以数组形式返回整个HTML树的所有标签名称(需去重)。返回值示例:["div","span","p",...]

参考答案

30.请列举你使用果的JS异步流程控制方案,对比一下它们的优劣处

参考答案

31.现在H5项目需要设计一个通用的弹层组件(Modal),请以你熟悉的组件化框架为基础,为改租间设计尽可能丰富的API,并考虑后续迭代的API废弃机制

参考答案

32.再多人协作的项目中怎么做Git的分支管理?请解释你所用方案的依据

参考答案