首页 > 编程语言 > 详细

javascript

时间:2021-03-30 21:55:58      阅读:22      评论:0      收藏:0      [点我收藏+]

块状元素 div h1 h2 table ul ol p
内联元素 span img input button
offsetWidth=(内容宽度+内边距+边框),无外边距
margin纵向重叠问题:
相邻元素的margin-top和margin-bottom会发生重叠 空白内容的p也会重叠
margin负值问题:
margin-top 和margin-left负值,元素向上、向左移动
margin-right负值,右侧元素左移,自身不受影响
margin-bottom负值,下方元素上移,自身不受影响

BFC理解和应用
什么是BFC?如何应用block format context ,块级格式化上下文,内部渲染不会影响外部
形成BFC的常见条件:
float不是none
position是absolute或fixed
overflow不是visible
display是flex inline-block等值
常见应用:
overflow:hidden的使用
圣杯布局和双飞翼布局目的:
三栏布局,中间一栏最先加载和渲染(内容最重要)
两侧内容固定,中间内容随宽度自适应
技术总结:使用float布局
两侧使用margin负值,以便和中间内容横向重叠
防止中间内容被两侧覆盖,一个用padding一个用margin
圣杯布局:left:自己左移,right:没有宽度,如何下面的凑上去
手写clearfix
.clearfix:after{
content:‘‘;
display:table;
clear:both;
}
.clearfix{
*zoom:1;
}

flex实现一个三点色子

absolute和relative定位
relative依据自身定位
absolute依据最近一层的定位元素定位

水平居中
inline元素 text-align:center
block元素 margin:auto
absolute元素 left:50%+margin-left 负值

垂直居中
inline元素 line-height的值等于height值
absolute元素 top:50%+margin-top负值 [需要知道元素尺寸]
absolute元素 transform: translate(-50%, -50%); [不需要知道元素尺寸,浏览器兼容性不太好]
absolute元素 top,left,bottom,right=0+margin:auto [不需要知道元素尺寸]

css图文样式
line-height 如何继承
写具体数值,如30px,则继承该值
写比例 ,如2/1.5,则继承该比例
写百分比,如200%,则继承计算出来的值

css响应式
rem是什么
px:绝对长度单位
em:相对长度单位,相对于本元素
rem:相对长度单位,相对于根元素,常用于响应式
方案:
媒体查询 media-query
rem

css响应式vw-wh
window.screen.height 屏幕高度
window.innerHeight 网页视口高度
document.body.clientHeight body高度

vh网页窗口高度的1/100
vw网页视口宽度的1/100
vmax取两者最大值
vmin取两者最小值

JS参数都是值传递

null存在栈中,但是typeof null=="object" ,属于特殊引用类型

const a=100+10 //110
const b=100+‘10‘ //‘10010‘
const c=true+‘10‘ //‘true10‘

100"100" //true
0
‘‘ //true
0false //true
false=‘‘ //true
null
undefined //true

//除了null之外,其他都一律用=,例如
const obj={x:100}
if(obj.anull){}
//相当于:
//if(obj.a
=null||obj.a===undefined)

truely和falsely变量
0、NaN、‘‘、null、undefined、false 是falsely变量,其他都是truely变量

this取什么值是执行的时候确定的,不是定义的时候确定的,
settimeout()=>{}箭头函数的this是上一级的

闭包可以进行数据隐藏

异步:
JS是单线程语言

event loop(事件循环、事件轮询)
js是单线程运行的
异步要基于回调来实现
event loop就是异步回调的实现原理
JS如何执行:从前到后,一行一行执行;如果某一行执行报错,则停止下面代码的执行;先把同步代码执行完,再执行异步

总结event loop
同步代码,一行一行放在call stack执行
遇到异步,会先记录下,等待时机(定时、网络请求)
时机到了,就移动到callback queue

如果call stack为空,event loop开始工作
轮询查找callback queue,如果有则移动到call stack
然后继续轮询查找

DOM事件和event loop
JS是单线程
异步(settimeout,ajax)使用回调,基于event loop
DOM事件也使用回调,基于event loop

promise
注意:catch正常返回resolved,里面有报错才返回reject

Promise.resolve().then(()=>{
    console.log(1)
    throw new Error("error1)
}).catch(()=>{
    console.log(2)
}).then(()=>{
    console.log(3)
})
//结果 1  2  3  因为如果不在catch里面reject,返回的依然是resolve

async/await
执行async函数,返回的是promise对象
await相当于promise的then(是接收resolve的,reject要用reject捕获)
try..catch可捕获异常,代替了promise的catch

async

async function async1(){
    console.log()    2
    async async2()   
    console.log()     5
}
async function async2(){


    console.log()     3
}
console.log()    1
async1()
console.log()     4

for of的使用

宏任务和微任务
宏任务 :settimeout,setinterval,ajax,dom
微任务 : Promise async/await
微任务执行时机比宏任务要早
(宏任务:DOM渲染后触发,如settimeout
微任务:DOM渲染前触发,如promise
)
微任务是ES6语法规定的,宏任务是由浏览器规定的
异步的任务,微任务是在micro task queue ,宏任务是在web api里面
event-loop和DOM渲染的关系
1.Call Stack空闲
2.执行当前的微任务
3.尝试DOM渲染
4.触发Event Loop

event-loop
js是单线程
先执行同步代码,再执行异步代码

property和attribute
property:修改任务属性,不会体现到html结构中
attribute:修改html属性,会修改html结构
两者都有可能引起DOM重新渲染

property能够从attribute中得到同步;
attribute不会同步property上的值;
attribute和property之间的数据绑定是单向的,attribute->property;
更改property和attribute上的任意值,都会将更新反映到HTML页面中;

BOM
如何识别浏览器类型

知识点
navigator
const ua=navigator.userAgent
const isChrome=ua.indexOf(‘Chrome‘)
console.log(isChrome)

screen
console.log(screen.width)
console.log(screen.height)

location
console.log(location.href)
console.log(location.protocol)
console.log(location.pathname)
console.log(location.search)
console.log(location.hash)

history
history.back()
history.forward()

事件绑定和事件冒泡
const p1=document.getElementById(‘p1‘)
const body=document.body
bindEvent(p1,‘click‘,e=>{
e.stopPropagation()
alert(‘激活‘)
})
bindEvent(body,‘click‘,e=>{
alert(‘取消‘)
})

事件代理(无限下拉图片列表,如何监听每个图片的点击)
事件代理解决了元素过多,不易于每个元素都绑定事件
1.代码简洁
2.减少浏览器内存占用
3.不要滥用

const div=document.getElementById(‘div3‘)
bindEvent(div,‘click‘,event=>{
event.preventDefault()
const target=event.target
if(target.nodeName===‘A‘){
alert(target.innerHTML)
}
})

事件代理源码(代理和非代理结合)
function bindEvent(elem,type,selector,fn){
if(fn==null){
fn=selector
selector=null
}
elem.addEventListener(type,event=>{
const target=event.target
if(selector){
if(target.matches(selector)){
fn.call(target,event)
}
}
else{
fn.call(target,event)
}
})
}

const div=document.getElementById(‘div3‘)
bindEvent(div,‘click‘,function(event){ //注意这里不要用箭头函数因为会指向window,如果要用需要使用event不能使用this
event.preventDefault()
const target=event.target
if(target.nodeName===‘A‘){
alert(target.innerHTML)
}
})

ajax
xmlHttpRequest
//get请求
const xhr=new XMLHttpRequest()
xhr.open("POST","/api",false)
xhr.onreadystatechange=function(){
if(xhr.readyState=4){
if(xhr.status
=200){
alert(xhr.responseText)
}
}
}
xhr.send()
const postData={
userName:‘zhangsan‘,
password:‘xxx‘
}
xhr.send(JSON.stringify(postData))

跨域
加载图片js可无视同源策略
技术分享图片

//注意jsonp跨域的callback函数需要写在全局函数,后端返回callback({}) [按我的理解是返回方法名,调用前端的方法]

jquery实现jsonp
$.ajax({
url:‘http://localhost:88882‘,
dataType:‘jsonp‘,
jsonpCallback:‘callback‘,
success:function(data){
console.log(data)
}
})

function ajax(url){
const p=new Promise((resolve,reject)=>{
const xhr=new XMLHttpRequest()
xhr.open(‘GET‘,url,true)
xhr.onreadystatechange=function(){
if(xhr.readyState=4){
if(xhr.status
=200){
resolve(
JSON.parse(xhr.responseText)
)
}else if(xhr.status===404){
reject(new Error(‘404 not found‘))
}
}
}
xhr.send(null)
})
return p
}
const url=‘/data/test.json‘
ajax(url).then(res=>console.log(res)).catch(err=>console.log(err))

实现ajax
1.jquery的ajax
2.fetch(但是兼容性不是很好)
3.axios

Restful API
传统API设计:把每个url当做一个功能使用
Restful API设计:把每个url当做一个唯一的资源(尽量不用url参数,用method表示操作类型)

http常见header

request headers
response headers

request headers:
accept、accept-encoding、accept-languange、connection、cookie、host、user-agent、content-type

response headers:
content-type、content-length、content-encoding、set-cookie

缓存:
哪些资源可以被缓存:静态资源(js css img)

http 缓存cache-Control:
Response Headers中
控制强制缓存的逻辑
cache-control的取值:max-age、no-cache(浏览器不缓存)、no-store(客户端不采用缓存)、private(手机什么的不允许)、public

expires
已经被cache-control代替

http 缓存-协商缓存
服务端缓存策略
服务器判断客户端资源,是否和服务端资源一样,一样则返回304,否则返回200和最新的资源

资源标识,在Response Headers中,有两种:
Last-Modified资源的最后修改时间
Etag资源的唯一标识(一个字符串)

Last-Modified和Etag
优先使用Etag,Last-Modified只能精确到秒级
如果资源被重复生成,而内容不变,则Etag更精确

不同刷新操作,不同的缓存策略
正常操作:强制缓存有效,协商缓存有效
手动刷新:强制缓存失效,协商缓存有效
强制刷新:强制缓存失效,协商缓存失效

window.addEventListener(‘load‘,function(){
//页面的全部资源加载完才会执行,包括图片、视频等
})

document.addEventListener(‘DOMContentLoaded‘,function(){
//DOM渲染完即可执行,此时图片、视频可能没有加载完
})

性能优化
加载更快
减少资源体积:压缩代码
减少访问次数:合并代码,SSR服务器端渲染,缓存
使用更快的网络:CDN

让渲染更快
CSS放在head,JS放在body
尽早开始执行JS,用DOMContentLoaded触发
懒加载
对DOM查询进行缓存
频繁的DOM操作,合并到一起插入DOM结构(创建一个文档片段,此时还没有插入到DOM树中,const frag=document.createDocumentFragment())
节流throttle,debounce

SSR
服务器端渲染:将网页和数据一起加载,一起渲染
非SSR(前后端分离):先加载网页,再加载数据,再渲染数据

防抖

节流

安全
XSS跨站请求攻击
预防:替换<>标签

XSRF跨站请求伪造
使用post接口
增加验证,例如密码\短信验证

var和let const的区别
var是es5语法,let const是es6语法;var有变量提升
var和let是变量,可以修改;const是常量,不可修改
let const有块级作用域,var没有

typeof能判断哪些类型
undefined string number boolean symbol
object(typeof null ===‘object‘)
function

手写深度比较isEqual
function isObject(obj){
return typeof obj=‘object‘ && obj !null
}
function isEqual(obj1,obj2){
if(!isObject(obj1)|| !isObject(obj2)){
return obj1=obj2
}
if(obj1
=obj2){
return true
}
const obj1Keys=Object.keys(obj1)
const obj2Keys=Object.keys(obj2)
if(obj1Key.length!==obj2Keys.length){
return false
}
for(let key in obj1){
const res=isEqual(obj1[key],obj2[key])
if(!res){
return false
}
}
return true
}

split()和join()区别

const arr=[10,20,30,40]
const popRes=arr.pop()
console.log(popRes,arr)
// pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度

    const shiftRes=arr.shift()
    console.log(shiftRes,arr)
    //shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
    const pushRes=arr.push(50)
    console.log(pushRes,arr)
   // push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度此方法更改数组的长度。
    const unshiftRes=arr.unshift(5)
    console.log(unshiftRes,arr)
    //unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。

纯函数
1.不改变源数组(没有副作用)
2.返回一个数组

// // 纯函数:1. 不改变源数组(没有副作用);2. 返回一个数组
// const arr = [10, 20, 30, 40]

// // concat
// const arr1 = arr.concat([50, 60, 70])
// // map
// const arr2 = arr.map(num => num * 10)
// // filter
// const arr3 = arr.filter(num => num > 25)
// // slice
// const arr4 = arr.slice()

// // 非纯函数
// // shift pop(返回删除的那个值) unshift push (返回长度)
// // forEach
// // some every
// // reduce
// // splice

// const arr = [10, 20, 30, 40, 50]

// // slice 纯函数
// const arr1 = arr.slice()
// const arr2 = arr.slice(1, 4)
// const arr3 = arr.slice(2)
// const arr4 = arr.slice(-3)

// // splice 非纯函数
// const spliceRes = arr.splice(1, 2, ‘a‘, ‘b‘, ‘c‘)
// // const spliceRes1 = arr.splice(1, 2)
// // const spliceRes2 = arr.splice(1, 0, ‘a‘, ‘b‘, ‘c‘)
// console.log(spliceRes, arr)

const res = [10, 20, 30].map(parseInt)
console.log(res)

// 拆解
[10, 20, 30].map((num, index) => {
return parseInt(num, index)
})

ajax请求get和post的区别
get一般用于查询操作,post一般用户操作
get参数拼接在url上,post放在请求体内
安全性:post易于防止CSRF

jsonp为什么本质不是ajax
jsonp是通过script标签进行,ajax是通过XMLHttpRequest

new Object()和Object.create()区别
{}等同于new Object(),原型Object.prototype
Object.create(null)没有原型
Object.create({})可指定原型

解析url参数
function query(name){
const search=location.search
const p=new URLSearchParams(search)
return p.get(name)
}

传统方式,分析search
function queryToObj(){
const res={}
const search=location.search.substr(1)
search.split(‘&‘).forEach(paramStr=>{
const arr=paramStr.split(‘=‘)
const key=arr[0]
const val=arr[1]
res[key]=val
})
return res
}

使用urlsearchParams
function queryToObj(){
const res={}
const pList=new URLSearchParams(location.search)
pList.forEach((val,key)=>{
res[key]=val
})
return res
}

数组拍平function flat(arr){
const isDeep=arr.some(item=>item instanceof Array)
if(!isDeep){
return arr
}
const res=Array.prototype.concat.apply([],arr)
return flat(res)
}

数组去重
function unique(arr){
const res=[]
arr.forEach(item=>{
if(res.indexOf(item)<0){
res.push(item)
}
})
}
function unique(arr){
const set=new Set(arr)
return [...set]
}

Object.assign不是深拷贝

牛客网:

sort排序
从小到大升序:return a-b
从大到小降序:return b-a

Math.round(x)
如果参数的小数部分大于 0.5,则舍入到下一个绝对值更大的整数
如果参数的小数部分小于 0.5,则舍入到下一个绝对值更小的整数

阻止默认事件:
e.preventDefault()
e.returnValue = false (IE)
阻止冒泡:
e.stopPropagation()
e.cancelBubble = true (IE)

document.getElementById("button1").disabled = true;
document.getElementById("button1").setAttribute(“disabled”,”true”);

stopImmediatePropagation() 取消事件冒泡同时阻止当前节点上的事件处理程序被调用,影响当前的事件***

stopPropagation() 取消事件冒泡,不影响事件***

cancelBubbe() 取消事件冒泡

returnValue() 取消事件默认行为

jquery获取窗口元素高度

height() - 设置或返回元素的高度
innerWidth() - 返回元素的宽度(包含 padding)
innerHeight() - 返回元素的高度(包含 padding)
outerWidth() - 返回元素的宽度(包含 padding 和 border)
outerHeight() - 返回元素的高度(包含 padding 和 border)

数组遍历的几种方法:for of for in forEach map everyone some filter

优化:SplitChunksPlugin

基本的值类型有 (null,undefined,boolean,number,string,symbol),

引用类型 object ,常见的引用类型如 array ,function

jquery中文文档 https://jquery.cuishifeng.cn/
蓝湖 https://lanhuapp.com/web/#/item
swiper https://www.swiper.com.cn/
去格式化 https://www.23bei.com/tool-162.html

javascript

原文:https://www.cnblogs.com/lceihen/p/14598864.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!