margin:0 auto;
/*(适用于行内元素)*/
text-align:center;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
transfrom: translate(-50%,-50%);
display: flex;
一、px是固定的像素,一旦设置了就无法因为适应页面大小而改变。
二、em和rem相对于px更具有灵活性,他们是相对长度单位,意思是长度不是定死了的,更适用于响应式布局。
三、em是相对于其父元素来设置字体大小的,一般都是以的“font-size”为基准。这样就会存在一个问题,进行任何元素设置,都有可能需要知道他父元素的大小。而Rem是相对于根元素,这样就意味着,我们只需要在根元素确定一个参考值。
常用的有none、inline、block、inline-block。分别的意思是:
none: 元素不会显示,而且改元素现实的空间也不会保留。但有另外一个 visibility: hidden, 是保留元素的空间的。
inline:
display的默认属性。将元素显示为内联元素,元素前后没有换行符。我们知道内联元素是无法设置宽高的,所以一旦将元素的display 属性设为 inline,设置属性height和width是没有用的。此时影响它的高度一般是内部元素的高度(font-size)和padding。
block: 将元素将显示为块级元素,元素前后会带有换行符。设置为block后,元素可以设置width和height了。元素独占一行。
inline-block:行内块元素。这个属性值融合了inline 和 block 的特性,即是它既是内联元素,又可以设置width和height。
// 1.router-link
1. 不带参数
<router-link :to="{name:'home'}">
<router-link :to="{path:'/home'}"> //name,path都行, 建议用name
// 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由开始。
2.带参数
<router-link :to="{name:'home', params: {id:1}}">
// params传参数 (类似post)
// 路由配置 path: "/home/:id" 或者 path: "/home:id"
// 不配置path ,第一次可请求,刷新页面id会消失
// 配置path,刷新页面id会保留
// html 取参 $route.params.id
// script 取参 this.$route.params.id
<router-link :to="{name:'home', query: {id:1}}">
// query传参数 (类似get,url后面会显示参数)
// 路由可不配置
// html 取参 $route.query.id
// script 取参 this.$route.query.id
2. this.$router.push() (函数里面调用)
1. 不带参数
this.$router.push('/home')
this.$router.push({name:'home'})
this.$router.push({path:'/home'})
2. query传参
this.$router.push({name:'home',query: {id:'1'}})
this.$router.push({path:'/home',query: {id:'1'}})
// html 取参 $route.query.id
// script 取参 this.$route.query.id
3. params传参
this.$router.push({name:'home',params: {id:'1'}}) // 只能用 name
// 路由配置 path: "/home/:id" 或者 path: "/home:id" ,
// 不配置path ,第一次可请求,刷新页面id会消失
// 配置path,刷新页面id会保留
// html 取参 $route.params.id
// script 取参 this.$route.params.id
4. query和params区别
query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在
params类似 post, 跳转之后页面 url后面不会拼接参数 , 但是刷新页面id 会消失
3. this.$router.replace() (用法同上,push)
4. this.$router.go(n) ()
this.$router.go(n)
向前或者向后跳转n个页面,n可为正整数或负整数
ps : 区别
this.$router.push
跳转到指定url路径,并想history栈中添加一个记录,点击后退会返回到上一个页面
this.$router.replace
跳转到指定url路径,但是history栈中不会有记录,点击返回会跳转到上上个页面 (就是直接替换了当前页面)
this.$router.go(n)
向前或者向后跳转n个页面,n可为正整数或负整数
beforeCreate:在实例初始化之后,**数据观测(data observer) ** 和 event/watcher事件配置 之前被调用,注意是 之前,此时data、watcher、methods统统没有。
这个时候的vue实例还什么都没有,但是$route对象是存在的,可以根据路由信息进行重定向之类的操作。
created:在实例已经创建完成之后被调用。在这一步,实例已完成以下配置:数据观测(data observer) ,属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始, e l 属 性 目 前 不 可 见 。 此 时 t h i s . el属性目前不可见。 此时 this. el属性目前不可见。此时this.data 可以访问,watcher、events、methods也出现了,若根据后台接口动态改变data和methods的场景下,可以使用。
beforeMount:在挂载开始之前被调用,相关的 render 函数 首次被调用。但是render正在执行中,此时DOM还是无法操作的。我打印了此时的vue实例对象,相比于created生命周期,此时只是多了一个$el的属性,然而其值为undefined,
页面渲染时所需要的数据,应尽量在这之前完成赋值。
mounted:在挂载之后被调用。在这一步 创建vm.$el并替换el,并挂载到实例上。
此时元素已经渲染完成了,依赖于DOM的代码就放在这里吧~比如监听DOM事件。
beforeUpdate: v m . d a t a 更 新 之 后 , 虚 拟 D O M 重 新 渲 染 和 打 补 丁 之 前 被 调 用 。 你 可 以 在 这 个 钩 子 中 进 一 步 地 修 改 vm.data更新之后,虚拟DOM重新渲染 和打补丁之前被调用。 你可以在这个钩子中进一步地修改 vm.data更新之后,虚拟DOM重新渲染和打补丁之前被调用。你可以在这个钩子中进一步地修改vm.data,这不会触发附加的重渲染过程。
updated:虚拟DOM重新渲染 和打补丁之后被调用。
当这个钩子被调用时,组件DOM的data已经更新,所以你现在可以执行依赖于DOM的操作。但是不要在此时修改data,否则会继续触发beforeUpdate、updated这两个生命周期,进入死循环!
beforeDestroy:实例被销毁之前调用。在这一步,实例仍然完全可用。
实例要被销毁了,赶在被销毁之前搞点事情吧哈哈~
原理:
利用访问器属性(如下)实现数据属性变化到view变化的映射,set用于在数据发生变化时加入相应的数据带view的处理方法
Object.defineProperty(obj, "hello", {
get: function () {return sth},
set: function (val) {/* do sth */}
})
设计模式
观察者模式
Observer是一种设计模式,其中一个对象(称为主题)根据它(观察者)维护一个对象列表,自动通知它们状态的任何变化。
当主体需要通知观察者有关发生的有趣事情时,它会向观察者广播通知(其中可以包括与通知主题相关的特定数据)。
当我们不再希望某个观察员被注册的主题通知其变化时,主体可以将其从观察员名单中删除。
// es6 set对象实现
let arr = [1,2,3,4,56,123,1,2,3,4,1,2,3,4,1,23,];
let arr1 = new Set(arr);
console.log(arr1);
// indexof 方法实现
function set(arr){
let hash = [];
for(let i = 0; i < arr.length; i++){
if(hash.indexOf(arr[i]) == -1){
hash.push(arr[i]);
}
}
return hash
}
arr = set(arr);
let str = 'aaasdqwioedhjzkxcaipdlknaksldnl';
let max = 0;
let obj = {}
result = ''
for(let i = 0; i < str.length; i++){
var charAt = str.charAt(i);
if(obj[charAt]){
obj[charAt]++
}else{
obj[charAt] = 1;
}
}
for(let i in obj){
if(obj[i] > max){
max = obj[i];
result = i
}
}
console.log(result,max)
解决内存的泄露,垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存。现在各大浏览器通常采用的垃圾回收机制有两种方法:标记清除,引用计数。
标记清除:
js中最常用的垃圾回收机制就是标记清除,当变量进入环境时,例如在函数中声明一个变量,就将这个变量标记为“进入环境”,而当变量离开环境时,标记为“离开环境”。
垃圾回收机制会在运行时给在存储在内存中的所有变量打上标记,然后会去掉还在环境中的变量标记,之后拥有标记的变量被视为将要删除的变量,原因是这些变量已经无法被访问到了,最后垃圾回收机制在下一个运行周期中将这些变量删除。
引用计数:
语言引擎有一张"引用表",保存了内存里面所有资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。
如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏
原型
原型链
从概念上看:
每个对象都可以有一个原型,这个原型还可以有它自己的原型,以此类推,形成一个原型链。
使用场景:
当我们查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去,如果还是没有的话再去原型对象的原型对象里去寻找… 这个操作就是被委托在整个原型链上。
一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。
但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
根据HTML
代码形成DOM Tree
再根据css
代码形成CSSOM
将DOM Tree
和CSSOM
整合形成HTML Render Tree
根据Render Tree
渲染整个页面
遇到script
标签则停止渲染,优先加载并执行js代码,完成后再继续
直至Render Tree
渲染完成
什么是闭包?
闭包是指有权访问另外一个函数作用域中的变量的函数。
闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配。当在一个函数内定义另外一个函数就会产生闭包。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
OPTIONS:
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
HEAD:
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内
容的情况下,就 可以获取其中“关于该资源的信息”(元信息或称元数据)。
GET: 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web
Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法
POST:
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT: 向指定资源位置上传其最新内容。
DELETE: 请求服务器删除Request-URI所标识的资源。
TRACE: 回显服务器收到的请求,主要用于测试或诊断。
CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
点击f12 再点击network 点击xhr
call():调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
bind(): 除了返回是函数以外,它的参数和call一样。
apply():调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
少数的汉字每个占用3个字节,多数占用4个字节。
接下来我们对几个钩子函数进行解释
其实大家很多时候都会在created钩子函数中是调用事件,那么这个数据监听和事件初始化就是在beforeCreated之前和created之后进行的。
beforeMount 这个进行模板编译,编译模板但是没有元素挂载,无法获取dom
mounted 元素挂载结束,可以获取dom 元素
beforeUpdata 组件更新前调用
updataed 组件更新后调用
beforedestory vue实例销毁前执行
destoryed vue实例销毁之后执行 vue实例销毁后,dom元素还存在但是数据双向绑定,vue的功能就没有了,比如数据双向绑定。
vue.js是一套用于构建用户界面的渐进式框架,vue采用自底而上的增量开发设计。vue可以说是一个轻巧、高性能、组件化的mvvm框架。vue.js的目标是通过尽可能简单的api实现响应的数据绑定和组合的试图组件。
Ajax是全称是asynchronous JavaScript andXML,即异步JavaScript和xml,用于在Web页面中实现异步数据交互,实现页面局部刷新
优点:可以实现异步通信效果,页面局部刷新,带来更好的用户体验
JSON是一种轻量级的数据交换格式,看着像对象,本质是字符串
优点:轻量级、易于人的阅读和编写,便于js解析,支持复合数据类型
缺点:
// 删除
arr.delete() // 删除值但并不会减少长度
arr.splice() // 删除并更改长度
arr.shift() // 删除第一个
arr.pop() // 删除最后一个
// 增加
arr.unshift(); // 第一个元素前添加
arr.push(); // 在最后一个元素后添加
arr.concat() // 合并数组,但不会改变原有数组,而是会返回一个新数组
// 排序
arr.sort(); // 对数组进行升序降序
arr.reverse(); // 对数组进行反转操作
// 其他操作
arr.slice(); // 从数组中截取一段作为新数组并返回
arr.join(); // 将数组转换为字符串,由自己传的值作为分隔
arr.toString(); // 也是将数组变为字符串,是用逗号隔开的
子组件通过$emit()
向父级传递数据
// 子组件
this.$emit('fn',data)
// 父组件
<child @getChild="fn" />
export default {
// ...
data() {
},
methods: {
getChild(data){
console.log(data)
}
}
}
生命周期上:
Localstorage: 除非被手动清除,否则永久保存
Sessionstorage:仅在当前网页会话下有效,关闭页面或浏览器后就会被清除
存放数据:
Localstorage和sessionstorage:可以保存5M的信息
http请求:
仅在客户端即浏览器中保存,不参与和服务器的通信
易用性:
可采用原生接口,亦可再次封装
应用场景:
localstorage可以用来在页面传递参数。sessionstorage可以用来保存一些临时的数据,防止用户刷新页面后丢失了一些参数。
1、标准盒模型中width指的是内容区域content的宽度;height指的是内容区域content的高度。
标准盒模型下盒子的大小 = content + border + padding + margin
2、怪异盒模型中的width指的是内容、边框、内边距总的宽度(content + border + padding);height指的是内容、边框、内边距总的高度
怪异盒模型下盒子的大小=width(content + border + padding) + margin
固定定位fixed
,参照浏览器窗口,固定位置无视滚动
相对定位relative
,相对于本身位置而言进行偏移,脱离文档流
绝对定位position
,相对于父级位置进行偏移。
function test(){
let index = 0;
return {
fn(count){
if(index == count)return ;
setTimeout(() => {
index++
this.fn(count);
console.log(index)
}, 1000);
}
}
}
test().fn(3)
网格系统的实现原理,是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统
Promise 是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。 promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败
态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行
两者都是能够使元素脱离文档流,区别在于使用float的元素同一父元素内的文本会环绕在float元素,而使用absolute元素文本会直接无视该元素
cookie特点
● cookie是不加密的,用户可以自由看到;
● 用户可以删除cookie,或者禁用它
● cookie可以被篡改
● cookie可以用于攻击
● cookie存储量很小。未来实际上要被localStorage替代,但是后者IE9兼容。
session
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存-储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
session特点
1、session 在服务器端,cookie 在客户端
2、session 默认被存在在服务器的一个文件里(不是内存)
3、session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4、session 可以放在 文件、数据库、或内存中都可以。
重点是Object.defineProperty(obj,‘msg’,{})下面的get方法和set方法
在负组件中对子组件直接定义传入过去的变量名及数据:key=“value”
,再在子组件中定义props:[‘key’]
,就可以实现父组件传值。
图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片。当用户需要查看时可直接从本地缓存中渲染,以提供给用户更好的体验,减少等待的时间。否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,这样浏览者可能以为图片预览慢而没兴趣浏览,把网页关掉,这时,就需要图片预加载。当然这种做法实际上牺牲了服务器的性能换取了更好的用户体验。
图片懒加载(缓载):延迟加载图片或符合某些条件时才加载某些图片。这样做的好处是减少不必要的访问数据库或延迟访问数据库的次数,因为每次访问数据库都是比较耗时的即只有真正使用该对象的数据时才会创建。懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。
懒加载的实现:
MVVM指的是一种架构模式。通俗的来讲就是 视图 模型 和控制器的关系
M - model数据模型
V - view视图
VM - viewModel控制器
MVC是Model-View- Controller的简写。即模型-视图-控制器。M和V指的意思和MVVM中的M和V意思一样。C即Controller指的是页面业务逻辑。使用MVC的目的就是将M和V的代码分离。MVC是单向通信。也就是View跟Model,必须通过Controller来承上启下。MVC和MVVM的区别并不是VM完全取代了C,只是在MVC的基础上增加了一层VM,只不过是弱化了C的概念,ViewModel存在目的在于抽离Controller中展示的业务逻辑,而不是替代Controller,其它视图操作业务等还是应该放在Controller中实现。也就是说MVVM实现的是业务逻辑组件的重用,使开发更高效,结构更清晰,增加代码的复用性。
因为Vue在初始化实例时会对属性进行getter/setter转化,这样被转化的属性就是响应式的,而只有在data中声明的属性会执行这个过程。所以,后续通过JavaScript传过来的对象属性因为没有在data中声明,所以并不会执行这个转化过程,因此这些属性全都是不响应式的。
也是因为这个原因,现在的Vue.js无法监听到对象属性的添加和删除,也无法检测到数组的变动。
使用Array.concat()方法
let arr = [12,3213,321,456,547,12,33,90];
function sort(arr){
let len = arr.length - 1;
for(let i = 0; i < len; i++){
for(let j = 0; j < len - i; j++){
if(arr[j] > arr[j + 1]){
let temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
console.log(sort(arr))
Ajax(Asynchronous JavaScript and XML)异步JavaScript和XML。
不是一种编程语言,是一种在不需要重新加载整个网页的情况下,能够更新部分页面的技术
作用:
作用:用于完成局部刷新 使用场景:需要刷新的页面,如(浏览器地图搜素、自动提示、用户重复检查、购物车、用户登录等…)都需要用到Ajax交互。
优点:
缺点:
如何创建ajax
创建XMLHttpRequest对象,也就是创建一个异步调用对象.
创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
设置响应HTTP请求状态变化的函数.
发送HTTP请求.
获取异步调用返回的数据.
使用JavaScript和DOM实现局部刷新.
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP协议工作于客户端-服务端架构为上。 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
优化图片
图像格式的选择(GIF:提供的颜色较少,可用在一些对颜色要求不高的地方)
优化CSS(压缩合并css,如margin-top,margin-left…)
网址后加斜杠(如www.campr.com/目录,会判断这个“目录是什么文件类型,或者是目录。)
标明高度和宽度(如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小,如果图片很多,浏览器需要不断地调整页面。这不但影响速度,也影响浏览体验。 当浏览器知道了高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容。从而加载时间快了,浏览体验也更好了。)
减少http请求(合并文件,合并图片)。
模块化开发,一个模块就是一个实现特定功能的文件,有了模块我们就可以更方便的使用别人的代码,要用什么功能就加载什么模块。
模块化开发的4点好处:
避免变量污染,命名冲突
提高代码复用率
提高维护性
依赖关系的管理
闭包是指有权访问另一个函数作用域中的变量的函数
作用:
translate是transform属性值是指元素进行2D变换,2D变换就是指,元素以当前位置(0,0)按照x轴的方向移动多少,按照y轴的方向移动多少
transform的中文翻译是变换、变形,是css3的一个属性
transition 在一定时间之内,一组css属性变换到另一组属性的动画展示过程。可以用来实现动态效果,css3的属性
transform属性有:
通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统。Bootstrap框架中的网格系统就是将容器平分成12份。
localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。
他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)。
localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。
sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。
不同浏览器无法共享localStorage或sessionStorage中的信息。相同浏览器的不同页面间可以共享相同的 localStorage(页面属于相同域名和端口),但是不同页面或标签页间无法共享sessionStorage的信息。这里需要注意的是,页面及标 签页仅指顶级窗口,如果一个标签页包含多个iframe标签且他们属于同源页面,那么他们之间是可以共享sessionStorage的
let reg = /^1[3|4|5|7|8][0-9]{9}$/
div{
width: 400px;
height: 400px;
border-radius: 50%;
background-color: #f00;
animation: move 3s linear infinite;
}
@keyframes move {
0%{
transform: translateY(0);
}
50%{
transform: translateY(300px);
}
100%{
transform: translateY(0);
}
}
<div class="container">
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</div>
.container{
display: flex;
}
.container div{
height: 300px
}
.left,.right{
width: 200px;
background: #f00;
}
.center{
flex: 1;
background: #0f0;
}
<ul>
<ol>
<li>1</li>
</ol>
<ol>
<li>2</li>
</ol>
<ol>
<li>3</li>
</ol>
<ol>
<li>4</li>
</ol>
</ul>
let list = document.getElementsByTagName('li')
list = [...list];
for(let i = 0; i < list.length; i++){
list[i].addEventListener('click',() => {
console.log(i)
})
}
let arr = [1,2,3,4,5,6,7,8];
function disorder(arr){
let len = arr.length;
let newArr = []
for(let i = 0; i < len; i++){
if(newArr[i]){
continue;
}
let random = ~~(Math.random() * len);
while(random == i){
random = ~~(Math.random() * len);
}
newArr[i] = newArr[random] = true;
let temp = arr[i];
arr[i] = arr[random];
arr[random] = temp
}
return arr
}
console.log(disorder(arr))
function parse(jsonStr){
return eval('(' + jsonStr + ')');
};
localStorage:
localStorage生命周期是永久,除非主动清除localStorage信息,否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。
获取:
localStorage.getItem(‘key’);
cookies
cookie是客户端与服务器端进行会话使用的一个能够在浏览器本地化存储的技术。简言之,cookie是服务器端发给客户端的文本文件;目的是用于辨别用户身份。
获取
document.cookie
94. 是否可以在html中写 标签?是否可以用?如何让它正常显示?怎么创建自定义标签?
let test = document.createElement('test');
test.addEventListener('click',() => {
alert('success');
})
test.innerHTML = '111'
document.body.appendChild(test)
97. es6的有哪些扩展?新增的数组方法有哪些?用什么方法连接两个数组?函数扩展中的箭头函数中的this所指向的是什么?一般函数的this指向的又是什么?
98. 用什么方法判断是否是数组?又用什么方法判断是否是对象?
数组判断方法
- instanceof()
- Array.isArray()
对象判断方法
- instanceof()
- typeof()
99. 引用样式的方式有哪几种?他们的优先级排序怎么样?
- 内联
- 内嵌
- 外联
- 导入
优先级为就近原则,即 内联>内嵌>外联>导入
101. 对H5新增的语义化标签的理解?
平时,我们都会采用DIV+CSS布局我们的页面。但是这样的布局方式不仅使我们的文档结构不够清晰,而且不利于浏览器对页面的读取。所以HTML5新增了很多新的语义化标签。并且,在我们未给页面添加css样式时,用户体验并不好。语义化标签也能让浏览器更好的读取页面结构。再就是便于团队开发和维护,语义化更具可读性,遵循W3C标准的团队都遵循这个标准,可以减少差异化。
102. 最近有没有在看某一本书?或者是有没有学习某一个课程?有没有什么学习的计划?
103. 前端优化可以做什么?
-
减少http请求:
合并js和css文件(使用webpack或其它打包工具打包)
小图片使用雪碧图(需要的图片和ui说下,交给ui做就可以)
使用base64表示简单的图片
-
用内容分发网络cdn
cdn主要用于静态文件,如css,js和flash。
cdn,自动寻找最近的物理机服务器下载web组件
-
简js和css
使用jsmint和gzip精简文件,css精简技术点:#660066 优化 #606 ,提取 css ,js 公共方法,使用0代替0px
-
资源体积减少
gzip压缩
js混淆
css压缩
图片压缩
-
图片加载处理
图片懒加载
首屏加载时进度条的显示
懒加载详细:最初给图片的src设置一个比较简单的图片,然后将图片的真实地址设置给自定义的属性,做一个占位,然后给图片设置监听事件,一旦图片到达视口范围,从图片的自定义属性中获取出真是地址,然后赋值给src,让其进行加载。
首屏加载时进度条的显示:往对于首屏优化后的数据量并不满意的话,同时也不能进一步缩短首屏包的长度了,就可以使用进度条的方式,来提醒用户进行等待。
- 移动端优化
长列表滚动优化
函数防抖和函数节流
使用touchstart、touchend代替click
HTML的viewport设置
长列表滚动:ios尽量局部滚动,Android尽量全局滚动,同时需要给body添加上-webkit-overflow-scrolling: touch来优化移动段的滚动
防抖:止频繁滑动或者重复点击,当调用动作过了n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。
节流:预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。
touchstart、touchend代替click:click在移动端会有300ms延时,事件执行顺序是touchstart->touchmove->touchend->click
HTML的viewport设置:可以防止页面的缩放,来优化性能。
104. 什么情况会造成跨域,以及怎么解决跨域?
造成跨域的四字真言:同源策略
跨域问题是这是浏览器为了安全实施的同源策略导致的,同源策略限制了来自不同源的document、脚本,同源的意思就是两个URL的域名、协议、端口要完全相同
解决跨域:
-
JSONP
-
CORS跨域(目前用的最多的)
-
设置document.domain解决无法读取非同源网页的 Cookie问题
-
跨文档通信 API:window.postMessage()
-
hash与history的区别?
SPA需要在不刷新页面的情况下做页面更新的能力,这就需要引入前端路由,实际上,前端路由是利用了浏览器的hash或history属性。
hash :(兼容性更强)
hash (url中#后面的部分)虽然出现在 URL 中,但不会被包含在 http 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
当hash改变时,会触发hashchange事件,监听该事件,对页面进行更新。
window.onhashchange = function() {
document.getElementById("demo").innerHTML = x; //更新页面内容
......
};
history :
history 利用了 html5 history interface 中新增的 pushState() 和 replaceState() 方法。这两个方法应用于浏览器记录栈,
在当前已有的 back、forward、go 基础之上,它们提供了对历史记录 修改的功能(pushState将传入url直接压入历史记录栈,replaceState将传入url替换当前历史记录栈)。
只是当它们执行修改时,虽然改变了当前的 URL ,但浏览器不会立即向后端发送请求。
pushState()、replaceState() 方法接收三个参数:stateObj、title、url
history.pushState({color: "red"}, "red", "red");//设置状态
window.onpopstate = function(event) { //监听状态
if(event.state && event.state.color === "red") {
document.body.style.color = "red"; //更新页面内容
}
}
// 改变状态 *在使用history API改变浏览器的url时,仍需要额外的步骤去触发 popstate 事件,例如调用 history.back() 和 history.forward() 等方法
history.back();
history.forward();
history 对比 hash
history优势:
pushState 设置的 url 可以是同源下的任意 url ;而 hash 只能修改 # 后面的部分,因此只能设置当前 url 同文档的 url。
pushState 设置的新的 url 可以与当前 url 一样,这样也会把记录添加到栈中;hash 设置的新值不能与原来的一样,一样的值不会触发动作将记录添加到栈中。
pushState 通过 stateObject 参数可以将任何数据类型添加到记录中;hash 只能添加短字符串。
pushState 可以设置额外的 title 属性供后续使用。
history劣势:
history 在刷新页面时,如果服务器中没有相应的响应或资源,就会出现404。因此,如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。
hash 模式下,仅 # 之前的内容包含在 http 请求中,对后端来说,即使没有对路由做到全面覆盖,也不会报 404。
105. 深拷贝和浅拷贝
浅拷贝和深拷贝都只针对于像Object, Array这样的复杂对象,
区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制
简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。
浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。