植树节的下一天(3月13日)前端学习记录
什么是URL,URL的结构是什么
URL是统一资源定位符,用来定位互联网上资源,也叫网址
结构
scheme://host.domain:port/path/filename?abc = 123 #456789,
scheme - 定义因特网协议类型:http,https,ftp,file等,常见的是http,而https则是进行加密的网 络传输
host - 定义域主机(http的默认主机是www)
domain - 定义因特网域名,比如baidu.com
port - 定义主机端口号(http的默认端口号是80)
path - 定义服务器上的路径
filename - 定义文档/资源的名称
query - 查询参数
fragment - 即#后边的hash值,一般用来定位到某个位置
scheme://host.domain:post/path/filename?query#123456
从URL输入到页面展现到底发生什么?
-
DNS 解析:将域名解析成 IP 地址
浏览器不能通过域名来找到对应的服务器,所以要将域名转换成ip地址
-
TCP 连接:TCP 三次握手
syn = 1 seq = x
syn = 1 ack = x+1 seq = y
ack = y+1 seq = z
-
发送 HTTP 请求
-
服务器处理请求并返回 HTTP 报文
-
浏览器解析渲染页面
-
断开连接:TCP 四次挥手
FIN =1 SEQ = U
ACK = 1 ack = u+1 seq = v
FIN = 1 ACK = 1 seq = w ack = u+1
ACK = 1 seq = u+1 ack = w+1
CSS选择器
- 类型选择器(h1{})
- 通配选择器(*{})
- 类选择器(.wrapper{})
- ID选择器(#unique{})
- 标签属性选择器(a[title]{})
- 伪类选择器(p:nth(1)-child)
- 伪元素选择器
- 后代选择器(article p{})
- 子代选择器(article>p{})
- 相邻兄弟选择器(h1+p{})
- 通用兄弟选择器(h1 ~ p{})
Vue响应式原理(源码分析)
非常好的文章,可重复阅读:juejin.cn/post/684490…
typeof 与 instanceof 有什么区别?
typeof 操作符返回一个字符串,表示为经计算的操作数的类型
typeof 可以精准判断出原始类型,但是不能精准地判断null和引用类型
typeof null
引用类型数据,用typeof来判断的话,除了function会被识别出来之外,其余都输出object
**typeof** NaN === 'number' *// 尽管它是 "Not-A-Number" (非数值) 的缩写*
判断一个变量是否存在
if(a){
// Uncaught ReferenceError: a is not defined
}
if(typeof a !=='undefined'){
}
instanceof
instanceof 运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,但判断对象一定要是对象实例
JS 浅拷贝、深拷贝
这里的东西要重点记录一下,因为一直以来我对浅拷贝的概念理解都是错误的!!!
js的深拷贝与浅拷贝是针对引用类型来说的,
浅拷贝:对一个对象进行浅拷贝,该对象下的基本类型属性会开辟新的空间,引用类型属性还是指向同一块内存空间。属于只进行了一层的复制,浅拷贝的对象和原对象一定程度上是会相互影响的
对象引用的直接赋值不是浅拷贝!!!!!
深拷贝:无限层级的复制,深拷贝的对象不会和原对象产生影响。
浅拷贝
-
使用Object.assign进行浅拷贝
const obj = { name:'wang', obj1:{ a:1 } } const newObj = Object.assign({},obj) obj.name = 'xxx' console.log(obj==newObj);//false console.log(obj.name==newObj.name);//true 原始变量直接比较值,但事实上是开辟了新空间 console.log(obj.obj1==newObj.obj1);//true 浅拷贝只能复制一层,更深层的只能复制地址 -
数组的slice和concat方法
const arr = ['Wang','is','handsome'] const newArr = arr.slice(0)//slice(start,end)两个参数都是可选,只有一个参数的情况下从start切割到尾,不会改变原数组,返回选中的元素 console.log(arr,newArr);// ['Wang','is','handsome'] ['Wang','is','handsome'] console.log(arr==newArr);//falseconst arr = [1,2,3,4] const newArr = [].concat(arr) console.log(arr==newArr);//[1,2,3,4] [1,2,3,4] console.log(arr,newArr);//false -
数组静态方法Array.from
const arr = ['lin','is','handsome'] const newArr = Array.from(arr) arr[2] = 'rich' console.log(newArr) console.log(arr=newArr)//两者指向不同的地址 -
扩展运算符
const arr = ['lin', 'is', 'handsome'] const newArr = [...arr] arr[2] = 'rich' // 改变原来的数组 console.log(newArr) // ['lin', 'is', 'handsome'] // 新数组不变 console.log(arr == newArr) // false 两者指向不同地址
深拷贝
-
一行代码版本
JSON.parse(JSON.stringify(obj))
优点很明显非常的方便,缺点也很明显,会忽略掉undefined,symbol和function函数,无法解决循环引用的问题
const obj = { a: undefined, b: Symbol('b'), c: function () {} } const newObj = JSON.parse(JSON.stringify(obj)) console.log(newObj) // {} 什么也没有 因为都忽略掉了 const obj = { a: 1 } obj.obj = obj const newObj = JSON.parse(JSON.stringify(obj)) // 报错 日常使用需要深拷贝简单对象的时候,会首选这个方法
手写深拷贝
function deepClone (target) { if (target === null) return target // 处理 null if (target instanceof Date) return new Date(target) // 处理日期 if (target instanceof RegExp) return new RegExp(target) // 处理正则
if (typeof target !== 'object') return target // 处理原始类型
// 处理对象和数组 const cloneTarget = new target.constructor() // 创建一个新的克隆对象或克隆数组 for (const key in target) { // 递归拷贝每一层 cloneTarget[key] = deepClone(target[key]) } return cloneTarget }
function deepClone (target) { if (target === null) return target // 处理 null if (target instanceof Date) return new Date(target) // 处理日期 if (target instanceof RegExp) return new RegExp(target) // 处理正则 if (typeof target !== 'object') return target // 处理原始类型 // 处理对象和数组 const cloneTarget = new target.constructor() // 创建一个新的克隆对象或克隆数组 for (const key in target) { // 递归拷贝每一层 cloneTarget[key] = deepClone(target[key]) } return cloneTarget }
POST和GET的区别
1)GET的数据在URL是可见的。POST请求是不显示在URL中的 2)GET请求对长度是有限制的,POST请求长度是无限制的 3)GET请求的数据可以收藏为书签,POST请求到的数据不可收藏为书签 4)GET请求后,按后退按钮、刷新按钮无影响,POST数据会被重新提交 5)GET的编码类型:application/x-www-form-url。POST编码类型:有很多种, 列举以下几种(不止):
encodeapplication/x-www-form-urlencoded
multipart/form-data
复制代码
6)GET历史参数会被保留在浏览器里,psot不会保存在浏览器中的。 7)GET只允许ASCII.post没有编码限制,允许发二进制的。 8)GET与POST相比,GET安全性较差,因为所发的数据是URL的⼀部分