前端面试

cookie与session

cookie

在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登陆成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie就是解决这类问题的,第一次登陆后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie的数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。

主要参数

key:设置cookie的值
value:key对应的value
max_age:改cookie的过期时间,不设置则会在浏览器关闭后自动过期
expires:过期时间
domain:此cookie在哪个域名有效
path:此cookie在哪个路径下有效

session

与cookie作用类似,都是为了存储用户相关的信息。但是cookie存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加安全,不容易被窃取。

结合使用

两种方式:

  1. 存储在服务端:
    通过cookie一个session_id,然后具体的数据则是保存在session中。如果用户已经登陆,则服务器会在cookie保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据,就能知道该用户是谁,以及之前保存的一些状态信息(server side session)
  2. 将session数据加密,然后存储在cookie中(client side session)

Ubuntu几种不同的下载指令

  1. apt-get
    +update 更新所有软件
    +upgrade 更新软件包
    +install packagename 安装一个新软件包
    +remove packagename 卸载一个已安装软件包
  2. wget
    用来从指定的url下载文件
  3. git clone
    专门用来下载github上的东西
  4. pip 和 pip3
拓展:

apt-get和pip区别
apt-get 安装的是Ubuntu系统级别的典型依赖包,它只是安装单一版本,无法决定版本,而pip用来安装来自PyPi的所有的依赖包,可以选择版本。

八种方式实现跨域请求

(协议、端口、域名)

  1. 图片ping或script标签跨域(单向请求get)
  2. JSONP跨域(script,抓到的数据不是JSON,而是JavaScript,用Javascript解释器运行而不是JSON解析器解析)
  3. CORS(Cross-Origin Resource Sharing)跨域资源共享(除了GET方法之外也支持其他的HTTP请求)
  4. window.name + iframe(通过在iframe中加载跨域HTML文件来起作用)
  5. window.postMessage()(用来向其他所有的window对象发送消息)
  6. 修改document.domain跨子域
  7. WebSocket(实现了浏览器与服务器全双工通信,同时允许跨域通讯)
  8. 代理
    DomainA客户端=》DomainA服务器=》DomainB服务器=》DomainA客户端

在浏览器地址栏输入地址到页面渲染(一次完整的HTTP事务是怎样的过程)

  1. 客户端解析url,通过dns解析(本地dns缓存,之后操作系统缓存,之后hosts文件查找,都没有就通过查找dns服务器得到ip地址)
  2. 根据ip地址找到目标服务器
    (1、2为域名解析)
  3. 进行tcp三次握手,建立tcp连接
  4. 客户端向服务器发送请求,服务端响应请求
  5. 客户端解析html,渲染页面

TCP三次握手

TCP三次握手
第一次握手:Client设置SYN=1,随即设置值seq=J,发送该数据包给Server,Client状态为SYN_SENT。
第二次握手:Server接收该数据包,如果SYN=1,则说明Client请求建立连接,返回Client值有,SYN=1,ACK=1,ack=J+1,随即设置值seq=K,Server进入SYN_RCVD状态
第三次握手:Client检查Server发送来的数据中ACK是否等于1,ack是否等于J+1,如果都是的话,则向Server发送ACK=1,seq=K+1,Server检查正确则,Client和Server完成三次握手,建立TCP连接,进行数据传输。

四次挥手

即终止TCP连接,需要客户端和服务端总共发送4个包以确认连接的断开。
TCP四次挥手

JS闭包介绍

闭包指的是能够访问另一个函数作用域的变量的函数,闭包就是一个函数,能够访问其他函数作用域中的变量
基本变量的值一般都是存在栈内存中
对象类型的变量的值存储在堆内存中,栈内存存储对应空间地址

jsonp跨域请求

<script>
	$(document).ready(function(){
		$("#btn").click(function(){
			$.ajax({
				url: "http://localhost:8080/user",
				type: "GET",
				dataType: "jsonp",	//指定服务器返回的数据类型
				success: function(data) {
					var result = JSON.stringify(data);	//json对象转为字符串
					$("#text").val(result);
				}
			});
		});
	});
</script>

CSS弹性盒子(Flex Box)

通过设置display的值为flex或inline-flex将其定义为弹性容器
弹性子元素通常在弹性盒子内一行显示,默认情况下每个容器只有一行

  1. direction
  2. flex-direction:指定弹性子元素在父容器中的位置
  3. justify-content:内容对齐属性,把弹性项沿着弹性容器的主轴线对齐(flex-start、flex-end、center、space-between、space-around)
  4. align-items:设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐(flex-start、flex-end、center、baseline、stretch)
  5. flex-wrap:用于指定弹性盒子的子元素换行方式(nowrap、wrap、wrap-reverse)
  6. align-content:修改flex-wrap属性的行为

Position的属性值及各自含义

  1. relative:生成相对定位的元素
  2. absolute:生成绝对定位的元素,相对于static定位之外的第一个父元素进行定位
  3. fixed:生成绝对定位的元素,相对于浏览器窗口进行定位
  4. static:默认值。没有定位,出现在正常的流中

ES6新增事物

1.let关键字
  1. 变量不允许被重复定义;
  2. 不会进行变量声明提升;
  3. 保留块级作用域中i
2.const定义常量
  1. 常量值不允许被改变
  2. 不会进行变量声明提升
3.箭头函数
4.字符串模板``

允许使用反引号来创建字符串

5.字符串和数组新增方法

字符串:

  1. 字符串模板
  2. include
  3. startswith
  4. endsWith
    数组:
  5. Array.of
  6. Array.from
6.set集合和Map集合(重点)
7.Promise规范(重点)
类的支持

const和let

let:声明的变量只在let命令所在的代码块内有效
const:声明一个只读的变量,一旦声明,常量的值就不能改变

Arrow Function(箭头函数)

x => x*x
//相当于
function(x) {
	return x*x;
}

箭头函数相当于匿名函数,并且简化了函数定义。

事件机制

DOM事件流(event flow)存在三个阶段:

  1. 事件捕捉阶段:
    当触发dom事件时,浏览器会从根节点开始由外到内进行事件传播
  2. 处于目标阶段
  3. 事件冒泡阶段:
    由内到外进行事件传播,直到根节点
    (停止事件传播:event.stopPropagation)

兼容性问题

UDP和TCP

  1. TCP是面向连接的,UDP是面向无连接的
  2. UDP程序结构简单
  3. TCP是面向字节流的,UDP是基于数据报的
  4. TCP保证数据准确性,UDP可能丢包
  5. TCP保证数据顺序,UDP不保证
TCP为什么是可靠连接
  1. 通过TCP连接传输的数据无差错,不丢失,不重复,且按顺序到达
  2. TCP报文头里面的序号能使TCP的数据按序到达
  3. 报文头里面的确认序号能保证不丢包,累计确认及超时重传机制
  4. TCP拥有流量控制及拥塞控制机制

前端性能优化

一、 浏览器访问优化

  1. 减少http请求
  2. 启用压缩
  3. 利用浏览器缓存
  4. 减少Cookie传输
  5. CSS放在页面最上面,JS放在页面最下面

二、CDN(Content Distribute Network 内存分发网络)加速
将数据缓存在离用户最近的地方,是用户以最快速度获取数据,即所谓网络访问第一跳
三、反向代理
反向代理服务器位于网站机房一侧,接收HTTP请求

MVVM与MVC

MVVM(双向通信)

是Model-View-ViewModel的简写,即模型-视图-视图模型

  1. 模型:指的是后端传递的数据
  2. 视图:指的是所看到的页面
  3. 视图模型:MVVM的核心,是连接view和model的桥梁
    总结:
    在MVVM框架下视图和模型是不能直接通信的。它们通过ViewModel来通信。
MVC(单向通信)

是Model-View-Controller的简写,即模型-视图-控制器
M、V跟MVVM相同,C即Controller指的是页面业务逻辑,使用MVC的目的就是将M和V的代码分离

对象和类的区别

是具有相同属性和服务的一组对象的集合,为属于该类的所有对象提供了统一的抽象描述。是一个独立的程序单位

对象

是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。

两者的关系

类和对象的关系就如模具和铸件,类的实例化结果就是对象,而对一类对象的抽象就是类。

两者的区别
  1. 类是一个抽象的概念
  2. 对象是类的一个实例化
  3. 类是一个静态的概念,本身不携带任何数据
  4. 对象是一个动态的概念,对象的属性可以随着自己的行为而发生改变

面向对象

三大特点:封装、继承、多态

原型链

js完全依靠原型链(prototype chain)模式来实现继承
proto:原型链指针
prototype:指向原型对象
constructor:每一个原型对象都包含一个指向构造函数的指针

CSS响应式布局

set和map的区别(增、删、判断、取出)

set

类似于数组,但是它里面每一项的值是唯一的。它是一个构造函数,用来生成set的数据结构

Map

类似于对象,也是键值对的集合,但是范围不限制于字符串,各种类型的值(包含对象)都可以当作键。同时Map里面也不可以放重复的项

快排和冒泡

快排:
function quickSort(arr) {
	if(arr.length <= 1){
		return arr;
	}
	var pivoIndex = Math.floor(arr.length/2);
	var pivot = arr.splice(pivoIndex, 1)[0];
	var left = [];
	var right = [];
	for(var i = 0; i < arr.length; i++) {
		if(arr[i] < pivot) {
			left.push(arr[i]);
		}else {
			right.push(arr[i]);
		}
	}
	return quickSort(left).concat([pivot], quickSort(right));
}
冒泡:
function bubbleSort(arr) {
	for(var i = 0; i <arr.length; i++) {
		for(var j = 0; j<arr.length; j++) {
			if(arr[j] > arr[j+1]) {
				var temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
	return arr;
}

去重

function unique(arr) {
	var hash = [];
	for(var i = 0; i < arr.length; i++) {
		if(hash.indexOf(arr[i]) == -1) {
			hash.push(arr[i]);
		}
	}
	return hash;
}

JS数组方法

原数组改变
  1. push:向数组的末尾添加一个或多个元素,并返回新的数组长度
  2. pop:删除并返回数组的最后一个元素,若数组为空,则返回undefined
  3. unshift:向数组的开头添加一个或多个元素,并返回新的数组长度
  4. shift:删除数组的第一项,并返回第一个元素的值,若数组为空,则返回undefined
  5. reverse:将数组倒序
  6. sort:对数组元素进行排序
  7. splice:删除元素并添加元素
原数组不变
  1. concat:合并两个或多个数组,生成一个新的数组
  2. join:将数组的每一项用指定字符连接形成一个字符串
  3. map:原数组的每一项执行函数后,返回一个新的数组
  4. slice(start,end):显示数组的值

every和some的区别

every和some方式都是JS中数组的迭代方法
every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true
some()是对数组中每一项运行给定函数,如果该函数对任一项返回true,则返回true

http和https的区别

https在http的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份

HTTP

一种网络协议,是一个客户端和服务端请求和应答的标准(TCP)。用于WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少

HTTPS

是以安全为目标的HTTP通道,简单讲就是HTTP的安全版
主要作用:

  1. 建立一个信息安全通道,来保证数据传输的安全
  2. 确认网站的真实性
区别

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,要比http协议安全

  1. https协议需要到ca申请证书,一般需要一定费用‘
  2. http是超文本传输协议。信息是明文传输,https则是具有安全性的ssl加密传输协议
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  4. http的连接简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

哪些JS操作会引起内存泄漏

  1. 意外的全局变量
  2. 闭包
  3. 没有清理的DOM元素引用
  4. 被遗忘的定时器或回调

什么是盒子模型

元素的内容,元素的内边距,元素的边框,元素的外边框

href和src的区别

href

指向网络资源所在位置

src

指向外部资源的位置

OSI七层模型

应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

应用层

负责对软件提供接口时程序能使用网络服务

表示层

应用程序与软件之间的翻译官

会话层

负责在网络中的两节点之间建立和维持通信

传输层

建立端到端之间的连接,数据的分段和重组

网络层

将网络地址翻译成对应的mac地址,指导数据包的转发

数据链路层

将网络层接收到的数据包装成为特定的数据帧,使其在不可靠的物理链路上进行可靠的数据传递

物理层

IP地址与MAC地址

IP(Internet Protocol)

即网络之间互连的协议的外语缩写,也就是为计算机网络互相连接进行通信而设计的协议
IP地址分为A、B、C、D和E类

MAC地址

也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部

TCP/IP

模型:应用层、传输层、网络层和网络接口层

IP协议

是TCP/IP协议的核心,所有的TCP、UDP、IMCP和IGMP的数据都以IP数据格式传输。

ARP协议及RARP协议

ARP是根据IP地址获取MAC地址的一种协议

ICMP协议

即网络控制报文协议,用来保证数据送达的工作。
当传送IP数据包发生错误,比如主机不可达,路由不可达等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会。

TCP/UDP

TCP/UDP
协议的应用

Vue的生命周期


     var vm = new Vue({
        el: '#container',
        data: {
            test: 'hello world'
        },
        beforeCreate: function() {
            console.log(this);
            showData('创建vue实例前', this);
        },
        created: function() {
            showData('创建vue实例后', this);
        },
        beforeMount: function() {
            showData('挂载到dom前', this);
        },
        mounted: function() {
            showData('挂载到dom后', this);
        },
        beforeUpdate: function() {
            showData('数据变化更新前', this);
        },
        updated: function() {
            showData('数据变化更新后', this);
        },
        beforeDestroy: function() {
            vm.test = "23333";
            showData('vue实例销毁前', this);
        },
        destroyed: function() {
            showData('vue实例销毁后', this);
        }
    });
    function realDom() {
        console.log('真实的dom结构:' + document.getElementById('container').innerHTML);
    }
    function showData(process, obj) {
        console.log(process);
        console.log('data数据: ' + obj.test);
        console.log('挂载的对象:');
        console.log(obj.$el);
        realDom();
        console.log('------------');
        console.log('------------');
    }

HTML5新元素

canvas

定义图形,比如图表和其他图像

audio

定义音频内容

video

定义视频(video或者movie)

source

定义多媒体资源video和audio

embed

定义嵌入的内容,比如插件

track

为诸如video和audio元素之类的媒介规定外部文本轨道

datalist

定义选项列表

keygen

规定用于表单的密钥对生成器字段

output

定义不同类型的输出,比如脚本的输出

其他

article、aside、bdi、command、details、dialog、summary、figure、figcaption、footer、header、mark、meter、nav、progress、ruby、rt、rp、section、time、wbr

promise实现买菜洗菜做菜洗碗

       let flag = 1;
            function step1(resolve, reject) {
                console.log("准备去买菜");
                if(flag==1) {
                    resolve("买好了");
                }else {
                    reject("没菜了");
                }
            }
            function step2(resolve, reject) {
                console.log("洗菜");
                if(flag==1) {
                    resolve("洗好了");
                }else {
                    reject("没水");
                }
            }
            function step3(resolve, reject) {
                console.log("做饭");
                if(flag==1) {
                    resolve("做好了");
                }else {
                    reject("没有煤气");
                }
            }
            function step4(resolve, reject) {
                console.log("吃饭");
                if(flag==1) {
                    resolve("好吃");
                } else {
                    reject("难吃");
                }
            }
            function step5(resolve, reject) {
                console.log("洗碗");
                if(flag==1) {
                    resolve("洗好了");
                } else {
                    reject("没洗洁精");
                }
            }
            new Promise(step1).then(function(val1) {
                console.log(val1);
                return new Promise(step2);
            }).then(function(val2) {
                console.log(val2);
                return new Promise(step3);
            }).then(function(val3) {
                console.log(val3);
                return new Promise(step4);
            }).then(function(val4) {
                console.log(val4);
                return new Promise(step5);
            }).then(function(val5) {
                console.log(val5);
            })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值