赞
踩
前端思维导图 | 优点 |
---|---|
大可爱html+css+js+node | 全面可下载 |
千峰html+css | 简洁漂亮 |
千峰js | 简洁漂亮 |
<script>
alert("Hello,World!");
</script>
<script src="main.js"></script>
驼峰命名法
值本身
,因此也叫值类型,存放到栈(空间)名称 | 类型 | 值 |
---|---|---|
String | 字符串型 | ‘123’ |
Number | 数值型 | 123 |
Boolean | 布尔型 | true/false |
Null | null型 | 空 |
Undefined | Undefined型 | 未定义 |
Symbol | Symbol型 | Symbol() 生成唯一值 |
Bigint | 整数型 | 大整数 |
地址
,因此也叫引用数据类型,存放到堆(空间)
名称 | 类型 | 值 |
---|---|---|
Object | 对象 | { “key”:“value” } |
Array | 数组 | […] |
Function | 函数 | fn() |
Date | 日期函数 | new Date() |
Math | 数学公式 | Math |
RegExp | 正则 | new RegExp(“正则表达式”, “匹配模式”) |
typeof
obj:不适用复杂类型判断,多显示objectconsole.log(typeof "123") // string
console.log(typeof 123) // number
console.log(typeof true) // boolean
console.log(typeof undefined) // undefined
console.log(typeof null) // object => 所有值均32位,最低的3位表示数据类型,null全部为0,而object前三位是000
instanceof
Object :不适用基本类型判断console.log([1, 2] instanceof Array) // true
console.log(function(){} instanceof Function) // true
console.log({a:1} instanceof Object) // true
console.log(new Date() instanceof Date) // true
console.log(new RegExp() instanceof RegExp) // true
constructor
:直接找到元素的构造函数类型const str = '111' const num = 666 const sym = Symbol(66) const arr = [1,2,3,5] const date = new Date() const func = function(){} const reg = new RegExp() const map = new Map() const set = new Set() // null和undefined没有constructor,obj.constructor => Object() { [native code] } console.log(str.constructor === String) // true console.log(num.constructor === Number) // true console.log(sym.constructor === Symbol) // true console.log(arr.constructor === Array) // true console.log(date.constructor === Date) // true console.log(func.constructor === Function) // true console.log(reg.constructor === RegExp) // true console.log(map.constructor === Map) // true console.log(set.constructor === Set) // true
prototype
.toString.call(obj):最准确,推荐使用Object.prototype.toString.call("") // "[object String]"
Object.prototype.toString.call(123) // "[object Number]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
Object.prototype.toString.call(42n) // "[object BigInt]"
Object.prototype.toString.call({ a: 1 }) // "[object Object]"
Object.prototype.toString.call([1, 2]) // "[object Array]"
Object.prototype.toString.call(new Date()) // "[object Date]"
Object.prototype.toString.call(function () {}) // "[object Function]"
逻辑需要
对数据进行显示转换转换类型 | 方法 | 含义 |
---|---|---|
String | String(数据) | 转换为字符串 |
变量.toString(进制) | 转换为对应进制字符串 | |
Number | Number(数据) | 转换为数字 |
parseInt(数据) | 只保留整数 | |
parseFloat(数据) | 可以保留小数 | |
Boolean | Boolean(数据) | 转换为布尔值 |
运算符
被执行时,系统自动转换
+
:一元操作符转换成Number;任何数据和字符串相加结果都是字符串- * /
:把数据转成数字类型转换类型 | 原始数据类型 | 转换后的值 |
---|---|---|
String | 数字类型 | 'n' |
null | 'null' | |
undefined | 'undefined' | |
布尔类型 | true变'true',false变'false' | |
Number | 空字符/null | 0 |
非空字符串 | 数字/NaN(有非数字) | |
true/false | 1/0 | |
undefined | NaN | |
NaN | typeof NaN => "number" | |
Boolean | String | 非空字符串为true,空字符串为false |
Number | 非零数字为true,0和NaN为false | |
Object | 任何对象为true,null为false | |
Undefined | 无true,Undefined为false |
运行环境
对数据类型隐式转换的影响:很多内置函数期望传入的参数数据类型是固定的,如:alert(value)期望传入string类型参数,如果传入number或object等非string类型的数据,就会发生数据类型的隐式转换
类型 | 与原数据是否指向同一对象 | 第一层数据为基本数据类型 | 原数据中包含子对象 |
---|---|---|---|
赋值 | 是 | 改变原数据 | 改变原数据 |
浅拷贝 | 否 | 不改变原数据 | 改变原数据 |
深拷贝 | 否 | 不改变原数据 | 不改变原数据 |
深拷贝方法
- JSON:JSON.stringify(),JSON.parse()
- Object.assign()
- jQuery 方法 $.extend()
- 递归
类型 | var | let | const |
---|---|---|---|
作用域 | 函数作用域 | 块作用域 | 块作用域 |
重新赋值 | 是 | 是 | 否 |
声明不赋值 | 是 | 是 | 否 |
变量提升 | 是 | 否 | 否 |
重复声明 | 是 | 否 | 否 |
全局声明变量为window对象属性 | 是 | 否 | 否 |
尽量避免使用var,优先使用const,未来会修改的变量使用let
const必须初始化,声明时大写变量,不能修改变量声明的值,可以修改对象内部属性
let无需初始化,不可以修改变量声明的值
=>
简化定义…
解决适合与this无关的回调 :定时器、数组回调
不适合与this有关的回调: 事件回调 、对象的方法
判断箭头函数
全局变量
function Person(name, age) {
this.name = name;
this.age = age;
this.species = '人类';
this.say = function () {
console.log("Hello");
}
}
let per1 = new Person('xiaoming', 20);
数据
操作方法
(事件处理函数)prototype
属性查找原型,是函数类型数据的属性__proto__
属性查找原型,这个属性指向当前对象构造函数的原型对象,是对象类型数据的属性,可以在实例对象上使用js每个函数类型数据,都有一个prototype属性指向原型对象
原型对象又有个constructor属性,指向它的构造函数
命名冲突
缓存
不被垃圾回收机制回收资源分配的最小单位
,具有一定独立功能的程序关于某个数据集合上的一次运行活动CPU执行的最小单位
,可以理解为子任务
主线程
上排队执行的任务。只有前一个任务执行完毕,才能执行下一个任务任务队列
的任务。只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程异步任务分为宏任务和微任务,任务队列也分为宏任务队列和微任务队列:
宏任务:运行环境提供的异步操作,如:setTimeOut、setInternal、DOM监听、UI rendering、ajax、事件绑定等
微任务:js 语言自身的异步操作,如:Promise的then、catch、finally和process的nextTick等
在一个宏任务周期中会执行当前周期所有微任务,都执行完毕进入下一个宏任务周期,所以任务执行顺序为:同步任务>微任务>宏任务
解决回调函数this指向的方法:
- 箭头函数
- let self = this
setTimeout(function () {
console.log('第一次打印');
setTimeout(function () {
console.log('第二次打印');
setTimeout(function () {
console.log('第三次打印');
}, 1000)
}, 2000)
}, 3000)
对象的状态不受外界影响
。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变一旦状态改变,就不会再变
,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的新建就立即执行
,无法中途取消链式写法
,即then方法后面再调用另一个then方法const promise = new Promise((resolve,reject)=>{
//异步代码
setTimeout(()=>{
// resolve(['111','222','333'])
reject('error')
},2000)
})
promise.then((res)=>{
console.log('success',res) // success
}).catch((err)=>{
console.log('fail',err) // error
})
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
const databasePromise = connectDatabase();
const booksPromise = databasePromise.then(findAllBooks);
const userPromise = databasePromise.then(getCurrentUser);
Promise.all([
booksPromise,
userPromise
])
.then(([books, user]) => pickTopRecommendations(books, user))
调用者
普通函数:没有调用者,this默认指向window
箭头函数:this指向外包裹函数;如果没有外包裹函数,this指向window
特殊情况:严格模式下,this指向window就变为undefined
let obj1 = {
name : 'james',
getName1 : function(a,b,c) {
console.log(`getName ${this.name}`); // getName davis
console.log(`参数:${a},${b},${c}`); // 参数:1,2,3
}
}
let obj2 = {
name : 'davis',
getName2 : function() {
console.log(`getName ${this.name}`);
}
}
obj1.getName1.call(obj2)
obj1.getName1.call(obj2,1,2,3)
call 在函数调用时改变函数this指向,第一个参数临时改变this指向并
立即执行
call 支持传入多个参数
let obj1 = {
name : 'james',
getName1 : function(a,b,c) {
console.log(`getName ${this.name}`); // getName davis
console.log(`参数:${a},${b},${c}`); // 参数:1,2,3
}
}
let obj2 = {
name : 'davis',
getName2 : function() {
console.log(`getName ${this.name}`);
}
}
obj1.getName1.apply(obj2,[1,2,3])
apply 在函数调用时改变函数this指向,第一个参数临时改变this指向并
立即执行
apply 支持传入两个参数,第二个参数只能是数组
形式
高级用法:Math.min/max.apply(false, arr)
let obj1 = {
name : 'james',
getName1 : function(a,b,c) {
console.log(`getName ${this.name}`); // getName davis
console.log(`参数:${a},${b},${c}`); // 参数:1,2,3
}
}
let obj2 = {
name : 'davis',
getName2 : function() {
console.log(`getName ${this.name}`);
}
}
let fn = obj1.getName1.bind(obj2,1,2,3)
fn()
bind 第一个参数改变this指向,
不自动执行
,调用返回函数永久
改变this指向
bind 可以传入多个固定参数
function debounce(fn, delay){
let timer = null;
return function(){
clearTimeout(timer);
timer = setTimeout(()=> {
fn.apply(this, arguments);
}, delay)
}
}
function throttle(fn, delay){
let canUse = true
return function(){
if(canUse){
fn.apply(this, arguments)
canUse = false
setTimeout(()=>canUse = true, delay)
}
}
}
BOM 对象和方法 | 含义 |
---|---|
alert(“提示”) | 提示信息 |
confirm(“确认”) | 确认信息 |
prompt(“输入”) | 弹出输入框 |
open(“url”,“black/self”,“新窗口大小”) | 打开网页 |
close() | 关闭当前网页 |
DOM 元素选择方式 | 含义 |
---|---|
getElementById | 通过ID获取 |
getElementsByClassName | 通过类名获取 |
getElementsByTagName | 通过标签名获取 |
document.documentElement | 获取 html |
document.body | 获取 body |
querySelector | 通过选择器获取一个元素(开发常用) |
querySelectorAll | 通过选择器获取一组元素(开发常用) |
独占一行
容器的 100%
div 、p、h1~h6、hr
表单:form、fieldset、legend
列表:ul、ol、li、dl、dt、dd
表格:table、caption、thead、tbody、tfoot、th、tr、td
语义化标签:header、footer、main、nav、section、article、pre
在一行
内容的宽度
宽、高无效,但是水平方向上的内外边距可以设置,垂直方向无效
a、span、abbr、small、b、strong、em、br、cite、i、code、label、q、select、sub、sup、textarea、var
在一行
,中间有空白间隙
内容的宽度
img、input
标签类型 | 排列方式 | 宽高边距设置 | 默认宽度 |
---|---|---|---|
块级元素 | 独占一行 | 均可单独设置 | 容器的100% |
行内元素 | 与相邻行内元素在一行 | 宽、高无效, 水平方向上的内外边距可以设置,垂直方向无效 | 自身内容的宽度 |
行内块元素 | 与相邻的行内(块)元素在一行, 中间有空白间隙 | 均可单独设置 | 自身内容的宽度 |
名称 | 含义 |
---|---|
width | 宽度 |
height | 高度 |
padding | 元素内容与元素边框距离(填充) |
margin | 元素边框间距(盒子间距) |
只给同级元素中的一个元素设置 margin-top/bottom
给每一个元素添加父元素,然后触发 BFC 规则(不推荐)
使用伪元素 ::before,::after
触发 BFC (overflow、float、display、position)
给父元素设置 margin、padding (不推荐)
盒子实际宽度 = border _ 2 + padding _ 2 + 内容宽度(width)
盒子实际高度 = border _ 2 + padding _ 2 + 内容高度(height)
盒子实际宽度 = width = border _ 2 + padding _ 2 + 内容宽度
盒子实际高度 = height = border _ 2 + padding _ 2 + 内容高度
高度塌陷
,使页面布局正常显示(1)添加高度:父元素添加 height/border/padding
(2)额外标签:浮动元素后添加一个空块级元素含属性 clear:both
(3)单伪元素:父元素添加 .clearfix::after{content:‘’; display:block;clear:both}
(4)双伪元素:父元素添加 .clearfix::after,.clearfix::before // 顺便清除外边距塌陷
(5)overflow :父元素添加 overflow:hidden
.clearfix::after{
content: '';
display: block;
height: 0;
clear: both;
visibility: hidden;
}
基本选择器 | 使用 |
---|---|
通配符 | 统一调配所有属性,用* 调用 |
class | 元素中定义 class 属性,用 .类名 调用 |
id | 元素中定义id属性,用 #id名 调用 |
element | 用 标签名 调用 |
群组 | 同时选择 多个类名,逗号隔开 |
层次选择器 | 使用 |
---|---|
包含/后代 | 元素被包含在前一个元素内,选择此父元素内所有后代,用 父元素 后代元素 调用 |
子 | 匹配元素的孩子,用 父元素 > 子元素 调用 |
相邻兄弟 | 修改兄元素后第一个紧邻的弟元素样式,用 兄元素 + 弟元素 调用 |
通用兄弟 | 修改兄元素后所有弟元素样式,用 兄元素 ~ 弟元素 调用 |
链接伪类 | 含义 |
---|---|
a:link | 未访问 |
a:visited | 访问后 |
a:hover | 悬停时 |
a:avtive | 点击时 |
:target
调用目标伪类 | 含义 |
---|---|
<a href="#id" >操作者 | 事件触发对象 |
<p id="id" >指向者 | 事件实施对象 |
E:target | 查找点击操作者 |
UI元素状态伪类 | 含义 |
---|---|
E:hover | 鼠标指针移到元素上 |
E:active | 元素激活时 |
input:focus | 表单元素获取焦点时 |
input:enabled | 所有启用的表单元素 |
input:disabled | 所有禁用的表单元素 |
input:checked | 复选或单选按钮选中状态的表单元素 |
结构伪类 | 含义 |
---|---|
E:first-child | 查找兄弟元素中的第一个元素 |
E:last-child | 查找兄弟元素中的最后一个元素 |
E:nth-child(n) | 查找兄弟元素中的第n个元素 |
E:nth-last-child(n) | 查找兄弟元素中倒数第n个元素 |
E:first-of-type | 查找同类型 兄弟元素中的第一个元素 |
E:last-of-type | 查找同类型 兄弟元素中的最后一个元素 |
E:nth-of-type(n) | 查找同类型 兄弟元素中第n个元素 |
E:nth-last-of-type(n) | 查找同类型 兄弟元素中倒数第n个元素 |
E:only-child | 查找只有一个子元素的元素 |
E:only-of-type | 查找只有一个同类型子元素的元素 |
E:empty | 查找元素内部无任何文本和标签的元素 |
E:root | 查找 HTML 页面中的根元素(html) |
E:first-letter | 查找元素首字母 |
E:first-line | 查找元素首行 |
E:selection | 查找选中文本(修改字体/背景颜色) |
否定伪类 | 含义 |
---|---|
E:not(F) | E元素中除了F以外的所有元素 |
伪元素 | 含义 |
---|---|
E::after | content 在元素之后显示 |
E::before | content 在元素之前显示 |
E::first-letter | 定义指定元素首字母 |
E::first-line | 定义指定元素首行 |
E::selection | 定义被用户选取的部分(修改字体/背景颜色) |
属性值 | 含义 |
---|---|
E[attr] | 包含指定属性 的元素 |
[attr = “val”] | 包含完全匹配属性值 的元素 |
[attr ^ = val] | 包含 val 片段开头 的元素 |
[attr $ = val] | 包含val 片段结尾 的元素 |
[attr * = val] | 包含 val 片段 的元素 |
[attr ~ = val] | 包含属性值字符 的元素,val 单独存在或与其他属性值空格隔开 |
[attr | = val] | 包含起始片段完全匹配 的元素,起始值是 val 或 val- 开头 |
选择器 | 优先级 |
---|---|
important! | 无条件优先 |
内联样式 | 1000 |
id选择器 | 100 |
class、伪类、属性 | 10 |
标签伪元素 | 1 |
float | 含义 |
---|---|
none | 默认无浮动 |
left | 左浮动 |
right | 右浮动 |
// 给父级元素添加了一个 ::after 伪元素,通过清除伪元素的浮动,达到撑起父元素高度的目的
.clearfix::after{
content: '';
display: block;
height: 0;
clear: both;
visibility: hidden;
}
<div style="clear: both"></div> // 易造成结构混乱,不利于后期维护
position | 类型 | 是否脱标 | 参照系 | 是否常用 |
---|---|---|---|---|
static | 静态定位 | 否 | 标准流 | 很少 |
relative | 相对定位 | 否 (占位) | 自身位置 | 单独使用 |
absolute | 绝对定位 | 是(不占位) | 带定位的父级 | 搭配父级定位元素 |
fixed | 固定定位 | 是(不占位) | 浏览器可视区 | 单独使用 |
sticky | 粘性定位 | 否 (占位) | 浏览器可视区 | 单独使用 |
网页布局总结:
层级:标准流(海底) ==> 浮动盒子(陆地) ==> 定位盒子(天空)
区别:
① 标准流:块盒子上下排列
② 浮动:块盒子左右排列
③ 定位:盒子堆叠,默认后来居上,z-index 值调整堆叠顺序
自适应
浏览器窗口的弹性布局flex盒子属性 | 含义 |
---|---|
flex-direction | 主轴方向 |
flex-wrap | 换行 |
flex-flow | 前两条简写形式 |
justify-content | 主轴对齐方式 |
align-items | 侧轴对齐方式 |
align-content | 多根轴线对齐方式 |
justify-content | 含义 |
---|---|
flex-start | 当前行的最左边 |
flex-end | 当前行的最右边 |
center | 当前行的中间位置 |
space-between | 两端对齐(距离均分,首尾贴边) |
space-around | 两端环绕(距离均分,首尾一半) |
space-evenly | 两端均分(距离均分,首尾同均) |
align-items | 含义 |
---|---|
flex-start | 当前行的最上边 |
flex-end | 当前行的最下边 |
center | 当前行的中间位置 |
stretch | 子元素无高度或 auto,默认拉伸 |
baseline | 以子元素第一行文字的基线对齐 |
项目盒子 | 含义 |
---|---|
order | 项目的排列顺序,数值越小排列越靠前,默认为0 |
flex-grow | 项目的放大比例,默认为0 |
flex-shrink | 项目的缩小比例,默认为1 |
flex-basis | 主轴是否有多余空间 |
flex | 前三者简写,默认为0 1 auto |
align-self | 单个项目个性对齐方式 |
代码 | 类型 | 含义 |
---|---|---|
display:grid/inline-grid | 创建网格容器 | 使其直系子元素成为网格项目 |
grid-template-columns | 设置列 | 设置列宽 和数量(repeat()) |
grid-template-rows | 设置行 | 设置行高 和数量(repeat()) |
grid-gap | 设置行间距和列间距 | grid-row-gap与grid-column-gap的简写 |
place-items | 设置项目位置 | align-items和justify-items的简写 |
place-content | 设置grid位置 | align-content和justify-content的简写 |
功能 | 代码 | 含义 |
---|---|---|
划分列数 | column-count | 值的大小代表列数多少 |
调整列宽 | column-width | 列宽过小无影响,列宽过大改变列数 |
调整间距 | column-gap | 一般不调整,默认即可 |
列间隔线 | column-rule | 类似border |
检索列高 | column-fill | 检索列高是否均分,或占满父元素高度 balance(默认)/auto(自动撑满) |
跨列标题 | column-span | 子元素设置all即可(前五全部设置父元素) |
父级容器 - display:table
子级容器 - display:table-cell
触发条件 | 触发值 |
---|---|
根元素 | html |
float | left、right、inherit |
position | absolute、fixed |
overflow | hidden、auto、scroll |
display | flex、inline-flex、grid、inline-block、table-cell |
高度塌陷:父元素自适应高度,子元素浮动后脱标(脱离标准流),父元素高度为 0
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, minimum-scale = 1.0, maximum-scale = 1.0, user-scalable = no">
度量单位 | 含义 | 参照物 |
---|---|---|
px | 像素 | / |
% | 百分比 | 父元素 |
em | 相对于父元素字体大小 | 父元素字体 |
rem | 相对根元素字体大小 | 根元素字体 |
vw | 相对于视口的宽度,1vw 等于视口宽度的1%(总视口宽度为100vw) | 视口宽度 |
vh | 相对于视口的高度,1vh 等于视口高度的1%(总视口高度为100vh) | 视口高度 |
rpx | 小程序独有,把所有设备的屏幕,在宽度上等分为750份 | 750rpx |
Web Storage | 数据生命周期 | 存放数据大小 | 与服务器端通信 | 易用性 |
---|---|---|---|---|
Cookie | 可设置失效时间,默认是关闭浏览器后失效 | 4K左右 | 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 | 原生Cookie接口不友好,需要程序员自己封装 |
localStorage | 除非被清除,否则永久保存 | 5MB左右 | 仅在客户端保存,不参与和服务器的通信 | 原生接口可以接受,也可以再次封装 |
sessionStorage | 仅在当前会话下有效关闭页面或浏览器后被清除 | 5MB左右 | 仅在客户端保存,不参与和服务器的通信 | 原生接口可以接受,也可以再次封装 |
border-radius:水平半径/垂直半径
四个值:左上/右上/右下/左下
三个值:左上/右上和左下/右下
两个值:左上和右下/右上和左下
一个值:4角生效
@keyframes animationname{
keyframes-selector{
cssStyles;
}
状态码 | 类别 | 原因短语 |
---|---|---|
1xx | Information(信息状态码) | 接受的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务端错误状态码) | 服务器处理请求出错 |
1xx | 信息状态码 |
---|---|
100 | (继续) 接受的请求正在处理 |
2xx | 成功状态码 |
200 | (成功) 服务器已成功处理请求,服务器提供了请求网页 |
201 | (已创建) 请求成功并且服务器创建了新的资源 |
202 | (已接受) 服务器已接受请求,但尚未处理 |
3xx | 重定向状态码 |
300 | (多种选择) 表示要完成请求,需要进一步操作,通常用来重定向 |
301 | (永久移动) 资源已被分配了新的 URL |
302 | (临时移动) 资源临时被分配了新的 URL |
303 | (查看其他位置) 表示资源存在另一个URL,用GET方法获取资源 |
304 | (未修改) 自从上次请求后,请求网页未修改过。服务器返回此响应时,不会返回网页内容 |
4xx | 客户端错误状态码 |
400 | (错误请求) 服务器不理解请求的语法 |
401 | (未授权) 发送的请求需要身份验证 ,可能需要登录 |
403 | (禁止) 服务器拒绝请求 |
404 | (未找到) 服务器找不到请求的网页 |
5xx | 服务端错误状态码 |
500 | (服务器内部错误) 服务器遇到错误,无法完成请求 |
501 | (尚未实施) 服务器不具备完成请求的功能 |
502 | (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应 |
503 | (服务不可用) 服务器目前无法使用(由于超载或停机维护) |
不需要建立连接
,远地的主机在收到UDP报文后也不需要确认
。虽然UDP不提供可靠交付
,但因此省去很多的开销,使它的速度较快。实时性要求较高的服务,常使用UDP。对应的应用层的协议主要有 DNS、TFTP、DHCP、SNMP、NFS 等面向连接
的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的
运输服务,但因此增加了许多开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP、TELNET、HTTP、FTP 等
- TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态
- TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号
- TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号
- TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号
- 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些
本地hosts文件
是否保存对应ip地址,若有直接发起请求本地域名服务器
查找根域名服务器
查找,查找到对应的ip地址后把对应规则保存到本地的hosts文件浏览器渲染过程
)
大小
与位置
颜色
、背景
如:boder可以代替boder-width、boder-color、boder-style
区别 | HTTP | HTTPS |
---|---|---|
端口 | 80 | 443 |
证书 | 无需证书 | 需要证书(用于验证服务器身份) |
连接 | TCP 三次握手建立连接之后传输数据 | TCP 连接之后客户端与服务器进行 SSL 加密,确定对话密钥完成加密后传输数据 |
协议 | 超文本传输协议,信息明文传输 | ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全 |
安全性 | 较低 | 较高 |
协议
、域名
、端口号
只要有一个不一致就会引起跨域,跨域是浏览器的安全机制导致的,仅存在浏览器中绕过同源策略
限制,实现不同服务器之间通信的效果开发时可以通过配置代理服务器或者浏览器安装插件的方式临时解决,但上线后还是需要服务器做配置
利用script标签的src属性实现跨域,通过将前端方法作为参数传递到服务器端,然后由服务器端注入参数后再返回,实现服务器端向客户端通信。JSONP 使用简单且兼容性不错,但仅限于 get 请求
当请求违反了同源策略,就在请求头添加 Access-Control-Allow-Origin 属性,浏览器会判断响应中 Access-Control-Allow-Origin 值是否和当前的地址相同,匹配成功后才会做响应处理,否则继续报错。缺点是会忽略cookie,而且对浏览器版本有一定的要求
可以将前端项目部署到和接口同源的当前本地的服务器上。在vue.config.js 中进行代理配置,假设访问 http://localhost:9528/api/login 时会转换为间接访问 http://localhost:3000/api/login
一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信(同源策略对web sockets不适用)。web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。 只有在支持web socket协议的服务器上才能正常工作
<!-- 规定 html 字符编码 --> <meta charset="UTF-8"> <!-- 设置移动端的视区窗口 --> <meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;"> <!-- 移动端点击300ms 延时,可以对放大禁用 --> <meta name="viewport" content="user-scalable=no"> <meta name="viewport" content="initial-scale=1,maximum-scale=1"> <!-- 设置http头 --> <meta http-equiv="content-Type" content="text/html; charset=gb2312"> <!-- 图片403 --> <meta name="referrer" content="no-referrer" /> <!-- DNS 预解析 --> <meta http-equiv="x-dns-prefetch-control" content="on"> <link rel="dns-prefetch" href="//www.zhix.net">
区别 | 线程 | 进程 |
---|---|---|
规模 | 小 | 大 |
关系 | 组成进程 | 包含线程 |
资源 | 调度和分配资源的基本单位 | 拥有资源的基本单位 |
并发执行 | 同一进程不同线程 | 不同进程间 |
数据劫持
配合发布者-订阅者
模式的方式,通过Object.defineProperty()来劫持各个属性的getter和setter,在数据变动时,发布消息给依赖收集器(dep中的subs),去通知(notify)观察者,做出对应的回调函数,更新视图
- M:Model,数据模型(保存数据,处理数据业务逻辑)
- V:View,视图(展示数据,与用户交互)
- VM:View Model,数据模型和视图的桥梁
- MVVM设计模式最大的特点是支持
数据的双向传递
生命周期 | 含义 |
---|---|
beforeCreate | 创建之前,此时还没有data和Method |
Created | 创建完成,此时data和Method可以使用了; 在Created之后beforeMount之前如果没有el选项的话那么此时生命周期结束,停止编译,如果有则继续 |
beforeMount | 渲染之前 |
mounted | 渲染完成,且vm实例中已添加$el; 已替换DOM元素(双括号中的变量),此时可以操作DOM(但无法获取元素高度等属性,可借助nextTick()) |
beforeUpdate | data改变后,对应的组件重新渲染之前 |
updated | data改变后,对应的组件重新渲染完成 |
beforeDestory | 实例销毁之前,此时实例仍可使用 |
destoryed | 实例销毁后 |
属性
,其结果会被缓存,依赖的响应式属性变化
才会重新计算对象
,键是需要观察的表达式,值是对应回调函数,观察的数据改变
后进行对应回调
方法
,主要书写业务逻辑
类型 | api |
---|---|
wx | wx.request、wx.showModal、wx.showToast、wx.showLoading、 wx.chooseImage、wx.switchTab、wx.navigateo、wx.setStorageSync 等 |
uni | uni.request,uni.showModal、uni.showToast、uni.showLoading、 uni.chooseImage、uni.switchTab、uni…navigateo、uni.setStorageSync 等 |
类型 | 触摸事件名称 | 函数传参 | 函数接收参数 |
---|---|---|---|
wx | bindtap | <view bindtap="click" data-id="id"></view> | fn(e){ this.setData({ currentId:e.currentTarget.dataset.id }) } |
uni | @click | <view @click="click(id)"></view> | fn(id){ this.currentId = id } |
类型 | for循环 | if判断 | src动态接收图片 |
---|---|---|---|
wx | <view wx:for="{{currentList}}" wx:for-index="s_index" wx:for-item="s_item"></view> | <view wx:if="{{isShow}}"></view> | <image src="{{item.img}}"></image> |
uni | <view v-for="(s_item,s_index) in currentList"></view> | <view v-if="isShow"></view> | <image :src="item.img"></image> |
类型 | 代码 | 接收参数 |
---|---|---|
wx | <navigator url="/pages/live?id={{item.room_id}}"></navigator> | onLoad(options){} |
uni | <navigator :url="'/pages/live?id=' + item.room_id"></navigator> | onLoad(options){} |
类型 | 定义 | 调用 |
---|---|---|
wx | globalData:{baseUrl:“www.com”} | getApp().globalData.baseUrl |
uni | this.prototype.baseUrl = “https://www.ccc” | this.baseUrl |
类型 | 代码 |
---|---|
wx | this.setData({ list:this.data.list.concat(res.list) }) |
uni | this.list = […this.list,…res.list] |
类型 | 代码 |
---|---|
wx | <view catchtap="clickTab">我是按钮</view> |
uni | <view @click.stop="clickTab">我是按钮</view> |
参考:
《想进互联网大公司?那这些题你总得会吧?前端面试题2022及答案前端面试题2022及答案》
《前端面试八股文(详细版)—上》
《微信小程序与uni-app的区别》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。