JavaScript分为ECMAScript,DOM,BOM
BOM:浏览器对象模型,它使得js有能力与浏览器进行‘对话’,如alert()就是它提供的
DOM:文档对象模型,通过它可以访问HTML文档的所有元素,如document.getelementByid()就是它提供的
变量提升:
就是将js中的变量或者函数提高到作用域的顶部,如先把var和function声明的变量前置,再去顺序执行代码
阻止冒泡
什么是冒泡:如果一个按钮绑定了一个‘click’事件,那么click事件会依次在它的父元素中触发
w3c的方法是 e.stopPropagation()
ie是e.cancelBubble=true
取消默认事件:
什么是默认事件:比如a的链接,input的submit这都属于默认行为,就是不设置方法,自带的方法行为
w3c的方法是:e.preventDefault()
ie是:e.returnValue=false
注意:如果event对象设置cancelable为false时,表示没有默认行为,以上两者不起作用
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
px,em和rem
px:表示绝对尺寸,中文名像素,它不能适应浏览器缩放时产生变化,一般不用与响应式网站
em:表示相对尺寸,它根据当前对象文本的font-size(如果当前对象文本的font-size也是em,则根据其父元素文本的font-size进行变化),使用em可以随网站的变化字体也跟着发生变化,但是使用em需要知道当前元素和父元素的font-size,如有遗漏,可能发生错误
rem:也叫相对尺寸,它参考对象时根元素的font-size,因此只需要确定一个font-size
em与px换算:
任意浏览器的默认字体高度都是16px
所有未调整的浏览器都符合1em=16px
唯一方便简化,在通常开发中会讲css的body选择器声明font-size=62.5%,因为10px=0.625em,这样12px等于1.2em,10px等于1em
盒子模型:
CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。
marign 外边距
border 边框
padding 内边距
content 内容
属性设置:width:内容的宽度
height:内容的高度
padding:内边距,边框到内容的距离
border:边框
margin:外边距,盒子边框到附近最近盒子的距离
js的类型
undefined,null,boolean,string,object,number
ES6新增了一种原始数据类型:Symbol,表示一种独一无二的值
var 和let,const
①var声明的变量会挂载在window上,let和const不会
②var生命的变量可以状态提升,let和const不能
③let和const声明形成块级作用域
④同一作用域下,let和const不能声明同名变量,但是var可以
⑤暂存死区
只要块级作用域内存在let/const命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
⑥
6.1const一旦声明不能修改,但是复合型数据,可以修改属性
6.2不能不赋值
JS截取字符串
三种:
① .substr(下标值,截取个数)
从输入下标向后面截取几个字符串,默认不写截取全部
注意:下标值可以是负数,长度也可以是负数(结果显示为空)
如果所截选长度超过字符串长度,将显示应有的数据,不会报错
②.substring()
参数必须为非负整数,否则返回整个字符串
③.slice(开始下标,结束下标-1)
var str='123456';
console.log(str.slice(1,2));
//结果为 2
私有(局部)变量可以用到闭包。
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
实现方式,就是在一个方法内再创建一个方法来对需要修改的数据进行操作如:
function add() {
var counter = 0;
return counter += 1;
}
add();
add();
add();
//不使用闭包,结果都是1
------------------------------
//js闭包
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
//结果为3
使用这种方式让局部变量常驻内存,且不使用全局变量,但是会造成内存泄漏(因为有一块内存一直被占用,不被释放)
最常见的闭包使用场景:
setTimeout,这也是为什么我们使用最开始学习js使用setTimeout需要考虑this指向的原因
var arr=[1,11,2,22,5,4,0];
arr.sort(
function(n1,n2){
return n1-n2;
});
alert(arr);//[0,1,2,4,5,11,22]
升序
------------------------------------------------
var arr=[1,11,2,22,5,4,0];
arr.sort(
function(n1,n2){
return n2-n1;
});
alert(arr);
降序
JS操作数据
①join()
将数组中所有元素转化为字符串并连接在一起
②reverse()
将数组中的元素颠倒顺序
③concat()
数组拼接,返回新数组,且原数组不受影响
④slice(开始下标,结束下标-1)
截取数组形成新数组,且原数组不受影响
注意:如果超过最大长度,只显示到最后结果
如果第二个下标为负数:如-1,则表示倒数第一个元素,-2表示倒数第二个元素
如果第一个参数为负数,则表示从倒数第几个下标开始,-2则表示从倒数第二个开始
⑤indexOf和lastIndexOf
查找指定元素的下标值,indexOf是从左到右,lastIndexOf是从右到左,如果没有找到返回-1
⑥splice()
删除元素,插入元素
第一个参数:删除或插入的起始位置
第二个参数:要删除的个数
第三个参数:插入到数组中的元素
注意:如果只有一个参数,默认删除参数后边的所有元素
该方法新建一个数组,并修改原数组
⑦push()
在数组末尾添加一个或多个元素
⑧pop()
从数组末尾删除一个元素(只能删除一个),并返回被删除的元素
⑨unshift()
把一个元素添加到数组的开头,并返回数组的新长度
⑩forEach()
遍历数组,数组每一个元素都执行一次回调函数
⑩①map()
调用数组的没有给元素传递给指定的函数
⑩②every()和some()
every()判断数组中的每一项是否都满足条件,只有所有项都满足条件,才返回true
some()判断数组中是否存在满足条件的项,只要有一项满足,就返回true
解构赋值
解构赋值是对赋值运算符的扩展,它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值
基本形式:
let [a,b,c]=[1,2,3];
//a=1
//b=2
//c=3
忽略形式:
let [a, ,b]=[1,2,3]
//a=1;
//b=3
不完全解构:
let [a=1,b]=[ ];
//a=1,b=undefined
剩余运算符:
let [a,...b]=[1,2,3]
//a=1,
//b=[2,3]
字符串解构
let [a, b, c, d, e] = 'hello';
// a = 'h'
// b = 'e'
// c = 'l'
// d = 'l'
// e = 'o'
解构默认值:
let [a=2]=[undefined]
//a=2
字符串扩展
ES6提供
①includes()
返回布尔值,表示是否找到了参数字符串
②startsWith()
返回布尔值,表示参数字符串是否出现在原字符串的头部
③endsWith()
返回布尔值,表示参数字符串是否出现在原字符串的尾部
ES7提供
④padStart()
头部补全
⑤padEnd()
尾部补全
ES5写法
parseInt(12.32)//12
parseFloat('123.43#')//123.43
ES6写法
Number.parseInt(12.32)//12
Number. parseFloat('123.43#')//123.43
这样做的目的,是逐步减少全局性方法,使得语言逐步模块化
let bar = { a: 1, b: 2 };
let baz = { ...bar }; // { a: 1, b: 2 }
keys()遍历出对象的key
let obj = {
name:"张三",
sex:"男",
age:20,
height:150
}
for ( let key of Object.keys(obj)){
console.log(key)
}
// name
// sex
// age
// height
————————————————
版权声明:本文为CSDN博主「阿泽啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41702660/article/details/82015313
values()遍历出对象的value值
let obj = {
name:"张三",
sex:"男",
age:20,
height:150
}
for ( let val of Object.values(obj)){
console.log(val)
}
// 张三
// 男
// 20
// 150
————————————————
版权声明:本文为CSDN博主「阿泽啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41702660/article/details/82015313
entries()遍历出对象的每一个值
let obj = {
name:"张三",
sex:"男",
age:20,
height:150
}
for ( let item of Object.entries(obj)){
console.log(item)
}
// (2) ["name", "张三"]
// (2) ["sex", "男"]
// (2) ["age", 20]
// (2) ["height", 150]
————————————————
版权声明:本文为CSDN博主「阿泽啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41702660/article/details/82015313
-------------------------------
let obj = {
name:"张三",
sex:"男",
age:20,
height:150
}
for ( let [key,val] of Object.entries(obj)){
console.log(key,val)
}
// name 张三
// sex 男
// age 20
// height 150
————————————————
版权声明:本文为CSDN博主「阿泽啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41702660/article/details/82015313
w3c和ie盒子区别
ie的content部分包含了border和padding
别的相同
如果想不考虑这两者的差异,可以使用box-sizing属性设置
content-box:标准盒模型:padding和border不被包含在定义的width和height中
border-box:IE盒模型:padding和border包含在width和height中,也就是说定义width值,就算你设置其他属性,盒子的宽度也不变,也就是说border和padding不影响实际宽度
相对定位绝对定位
首先需要知道一句话:子绝父相,也就是一般情况下都是父盒子相对定位,子盒子绝对定位
绝对定位:绝对定位是相对当前元素 最近的 已经定位的父元素(找不到,继续向上找,还找不到就相对body定位),会脱离标准文档流
相对定位:是根据当前元素的初始位置进行定位,不会脱离标准文档流
脱离标准文档流:大白话就是不会在浏览器上占位置,会浮动起来
常见的几种脱离标准文档流的方法:
float,flex,绝对定位
如何恢复,也就是清除浮动
①在父盒子添加一个无意义的使用clear:both的盒子
②在父元素中设置 overflow:hidden
如何让盒子在浏览器上水平垂直局中
①使用flex 父盒子 :justfy-content和align-items
② 查看另外三种方法
选择器以及它的优先级
css的基本选择器有三种
①元素选择器(就是标签)
②ID选择器
③类选择器
④行内样式(一般不用这个)
优先级:④>②>③>①
注意:在属性后面使用!important优先级立马最高
它是html5标准网页声明,如果你声明了这个,浏览器就会开启标准模式,按照w3c的标准渲染页面,否则将会使用怪异模式(浏览器使用自己的怪异模式解析渲染页面)
http的请求方式
请求方式有很多,
但通常情况下用到的也就四种
GET,PUT,POST,DELETE
对应着CRUD,上述四种请求就可以实现CRUD功能了
cookie、sessionStorage,localStorage
都是存储数据,但是cookie存储的少(cookie大小4K左右,Storage一般为5M或者更大),且需要依赖服务器
cookie有过期时间,localStorage默认永久保存
,sessionStorage保存在当前会话中,刷新页面不会被删除,关闭浏览器,关闭页面,跳转页面会清除
使用cookie需要自行封装(因为原生api相当不快乐),使用storage可以直接使用
CSS3的新特性:
过渡:transition
形装转换:transform,可以旋转,缩放,倾斜
box-shadow:阴影
HTML5新特性
语义化标签:如 article,details,main,footer
canvas和svg:
canvas图片放大会失真,svg图片放大不会失真,和分辨率无关
jquery选择器
基本选择器:标签,类,id
层级选择器:子代,后代,相邻
表单选择器:input,checked,button
简单过滤选择器::first,odd,even,eq
内容过滤选择器:$([select],div)
jquery中的attr和prop
prop用来操作固有属性
attr用来操作自定义属性
如radio标签的checked属性,因为这个属性本身自带,所以使用prop
Promise
①是异步编程的一种解决方案
②解决ajax死亡回调
③一般搭配async和await一起使用
Promise.all()全部执行完才执行
Promise.race()有一个成功就执行
MVVM
MVVM是Model-View-ViewModel的缩写
Model代表数据模型,也可以在Model中定义数据修改的业务逻辑
View代表UI组件,它负责将数据模型转换成UI
ViewModel是两者的桥梁,用于同步View和Model
在MVVM架构上,View和Model之间没有直接联系,惹事通过VM进行交互,而且Model和ViewMode交互是双向的,因此View的数据会同步到Model中,而Model数据的变化也会反映在View上
这样的好处就是程序员不需要再处理DOM操作,仅仅关注业务逻辑就行饿了
Vue实现双向绑定的原理:
Object.defineProperty()
key的用处:
在Vue或者React中,写循环时,往往会加上key,
因为Vue存在一个DOM复用机制,会尽量回收DOM元素进行复用,而这个机制本身也是高效的,但有时候可能会出现不可想象的问题,而加了key后,元素就有了一个标识,复用机制就不会复用带key的元素了,React也有这样子的机制
key最好用独一无二的值
v-if和v-show
v-if是通过控制dom节点的存在与否来控制元素的显隐;v-show是通过设置DOM元素的display样式,block为显示,none为隐藏;
也就是说,使用v-if如果条件不为真,元素不渲染,直接不存在,而v-show是存在只不过设置display为none
Vue定义统态路由
在router目录下的index.js中,对path属性加上/:id,使用router的params.id获取
$router和 $route的区别:
$router是是一个VueRouter的实例,可以导航到不同的路由里
$route是 $router跳转到的当前一个对象,里面包含path,query,name,params
vue-router的钩子函数
①全局钩子
主要包括beforeEach和afterEach
beforeEach函数有三个参数
to:router 即将进入的路由对象
from:当前导航即将离开的路由
next:Function,进入管道中的一个钩子,如果执行完了,则导航的状态就是confiremed(确认的);否则为false,终止导航。
afterEach函数不能传next()函数
这类钩子函数主要作用于全局,一般用来判断权限,以及页面丢失时候时需要执行的操作,如
②单个路由里面的钩子
主要用于写某个指定路由跳转时需要执行的逻辑
③组件路由
主要包括 beforeRouteEnter和beforeRouteUpdate,beforeRouteLeave这几个钩子都是写在组件里面的,也可以传三个参数(to,from,next),作用于前面类似
MVC和MVVM的区别:
都是一种设计思想,主要是mvc中Controller演变成mvvm中的viewModel。mvvm主要解决的mvc中大量的DOM操作使页面渲染性能降低,加载速度变慢,影响用户体验。和当Model频繁发生变化,开发者需要主动更新到View
Vue半场钩子动画
<transition
@before-enter="boforeEnter" 动画开始之前,一般获取起始位置
@enter="enter" 动画运行,一般设置动画的偏移量
@after-enter="afterEnter" 动画结束
>
transition>
.v-enter,.v-leave-to{
transfrom:translateX(150px);
}
.v-enter-active,.v-leave-active{
transition:all 0.5s ease;
}
<div id="app">
<input type="text" v-model="msg" />
{{msg | slice(自定义过滤器的名字)}}
div>
var vm new Vue({
el:"#app",
data:{
msg:''
},
filters:{
slice:function(value){
if(!value) return ''
return value.toString().slice(1);
}
}
})
全局定义过滤器
Vue.filter('slice',function(value){
if(!value) return ''
return value.toString().slice(1);
})
被keep-alive包裹的动态组件不需要再次发送HTTP请求,但是同样也存在一个问题就是被keep-alive包裹的组件我们请求获取的数据不会再重新渲染页面,这也就出现了例如:我们使用动态路由做匹配的话页面只会保持第一次请求数据的结果,所以需要我们在特定的情况下强制刷新某些组件
include 使该标签作用于所有name属性的值跟此标签 include的属性值一致的vue页面
exclude 使该标签不作用于所有name属性的值跟此标签 exclude的属性值一致的vue页面
export default {
name:'a', // include 或 exclude所使用的name
data () {
return{
}
},
}
路由:
// 保持 name为a和b的组件
<keep-alive include="a">
<router-view/>
keep-alive>
vue的两个核心是什么
数据驱动、组件系统
vue常用的修饰符
.prevent:提交事件不再重载页面
.stop:阻止单击事件冒泡
.self:当事件发生在该元素本身而不是子元素的时候会触发
.capture:事件监听,事件发生时会调用
.once:只触发一次
Vue的watch和computed
v-on绑定多个事件
如果是绑定多个事件,可以键值对的形式
如果是绑定多个相同事件,直接用逗号隔开即可
Vuex
state
Vuex使用单一状态树,即每个应用将仅仅包含一个store实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。
mutations 通过commit调用里面的方法,进行修改数据
mutations定义的方法动态修改Vuex的store中的状态或数据
getters
类似vue的计算属性,主要用来过滤一些数据
action
actions可以理解为通过将mutations里面处理数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view层通过store.dispath来分发action
组件访问State中数据的第一种方式:
this. $store.state.全局数据名称
方式二:
this. $store.getters.名称
方式 三:
使用mapState,mapGetters
vue等单页面应用及其优缺点
优点:vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件,核心是响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好。
缺点:不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件)来第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退。
React的生命周期
生命周期分为三个部分:创建阶段,运行阶段,销毁阶段
①创建阶段:创建的生命周期函数,在组件中只执行一次;
componmentWillMount:组件将要被挂载,此时还没有开始渲染虚拟DOM,
componmentDidMount:组件完成了挂载,此时,组件已经显示到了页面上,当这个方法执行完,组件就进入运行中
的状态
②组件运行阶段:根据组件的state和props的改变,有选择的触发0次或者多次;
componmentWillReceiveProps:组件将要接收新属性,此时,只要这个方法被触发,就证明父组件为当前组件传递了新的属性值;
shouldComponentUpdate:组件是否需要被更新,此时,组件尚未被更新,但是state和props肯定是最新的。
componentWillUpdate:组件将要被更新,此时,尚未开始更新,内存中的虚拟DOM树还是旧的
componentDidUpdate:此时,页面又被重新渲染,state和虚拟DOM和页面已经完全保持同步
③组件销毁阶段:一辈子只执行一次
componmentWillUnmount:组件将要被卸载,此时组件还可以正常使用
React中getChildContentType
React中Context特性的使用()