【面筋烧烤手册】20201206
原始数据类型 和 引用数据类型
原始数据类型 存在栈中 空间小 大小固定 频繁更换
- Undefined
- Null
- String
- Boolean
- Number
- Symbol
- BigInt
引用数据类型 存在栈和堆中 栈保存引用堆的指针
Object(Function Array Date)
数据类型判断
- typeof()只用于判断原始数据类型 引用数据类型全是Object
- a instanceof b 通过判断是否是b数据类型的实例 不能判断 数字、字符串、布尔 因为他们不是某一数据类型的实例
- a.constructor === b 判断实例的构造函数
- Object.prototype.toString.call(a)
隐式类型转换
- 字符串连接符与算术运算符
num+Number(xxx)
- 关系运算符:会把其他数据类型转换成number之后再比较关系
- 复杂数据类型在隐式转换时会先转成String,然后再转成Number运算
- 逻辑非隐式转换与关系运算符隐式转换搞混淆
事件流 事件捕获 事件冒泡 事件委托 监听事件(上层绑定 防止内存泄露)
- 事件流:
用户和网页的交互事件从页面中传播的顺序。
- 3种事件模型:
- DOM0:网页中定义监听函数或者JS指定监听
- IE模型:
事件处理:执行目标元素绑定的事件
事件冒泡:从目标元素一直冒泡到document,依次检查经过的节点是否绑定事件监听函数,有则执行
可以添加多个监听函数,按顺序执行- DOM2:事件捕获阶段:捕获的是从document一直向下传播的目标元素,检查经过的节点是否绑定函数事件,有则执行
- 事件委托 / 代理:
- 利用事件冒泡,因为冒泡会上传到父节点,并且父节点可以通过事件对象获取到目标节点,所以在父节点设置监听函数统一处理。
- 减少内存消耗,动态绑定,新增子节点不需要设置监听函数了
- 事件捕获 / 冒泡:
- 捕获:
window--document--html--body--目标元素
- 冒泡:
当前元素--body--html--document--window
可选参数useCapture,默认值为false,事件将在冒泡阶段中发生,如果为true 则事件将在捕获阶段中发生
- 事件监听
第一个参数是:事件的类型(如:“click”,“mousedown”);
第二个参数是:事件触发后调用的函数。
第二个参数是:布尔值 用于描述事件是冒泡还是捕获。true:表示捕获;false表示冒泡。(该参数是可选的)
element.addEventListener(event,function,useCapture);
原型和原型链
①所有
引用类型
都有一个__proto__
(隐式原型)属性,属性值是一个普通的对象
②所有函数
都有一个prototype
(原型)属性,属性值是一个普通的对象
③所有引用类型
的__proto__
属性指向它构造函数
的prototype
①一直往上层查找,直到到null还没有找到,则返回undefined
②Object.prototype.__proto__ === null
③所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象
静态方法 原型方法
function Person(){this.name = '小明';// 实例方法this.getName = function(){console.log('他的名字叫 ',this.name);};// 内部方法const getSex = function(){console.log('性别是男的');}}// 静态方法Person.sayHi = function(){console.log('Hi!');}// 原型方法Person.prototype.sayBye = function(){console.log('Bye!');}const p = new Person();p.getName(); // 实例方法只能被实例调用,内部方法只能被类调用Person.sayHi(); // 静态方法只能被类调用p.sayBye(); // 原型方法只能被实例调用
class 创建对象 实现继承 instance super
class Point{}
class ColorPoint extends Point{}
子类必须在constructor方法中调用super方法,否则新建实例时会报错,因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法,如果不调用super方法,子类就得不到this对象
classPoint{constructor(x, y) {this.x = x;this.y = y;}
}
classColorPoint extends Point{constructor(x, y, color) {//this.color = color; // ReferenceErrorsuper(x, y);this.color = color; // 正确}
}
上面代码中,子类的constructor方法没有调用super之前,就使用this关键字,结果报错,而放在super方法之后就是正确的,正确的继承之后,我们就可以创建实例了
let cp = new ColorPoint(25, 8, 'green');
cp instanceof ColorPoint // true
cp instanceof Point // true
作用域
作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
作用域链
寻找变量,一层一层往上找。
闭包
闭包就是有权访问另一个函数作用域内变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量
外面的this是外面
但是里面是window
箭头函数的this
具体参考this 指向详细解析(箭头函数)
绑定函数的源码
- bind
bind的特点:
- 接受调用传参和新建对象构造函数传参
- 如果是外部没有传入this就要新建一个this
- 和call接受的参数和实现的回调功能一样
- 返回的是一个新创建的原来传入的this克隆的对象
//函数的构造函数 : Function
//用es6解构rest的方式传参
Function.prototype.myBind = function(objThis,...params){//定义指向当前函数this的指针const thisTn = this;//因为最终返回的是一个函数,所以声明一个函数返回//用let表示块作用域let funcForBind = function(...secondParams){/*因为例如let sayClone = obj.say.bind(obj2,1,2,3);sayClone(4);这里还是可以进行传参,最终传的就是1,2,3,4,所以可以用解构 ...secondParams*///判断是不是新创建的对象 如果新创建的对象的话 this就是当前函数的this 不是新创建的话就是传进来的那个对象的上下文const isNew = this instanseof funcForBind;const thisArg = isNew ? this : objThis;//返回调用 并分别解构传入的参数params和创建对象传入的参数secondParamsreturn thisFn.call(thisArg,...params,...secondParams);}//因为bind返回的是克隆的对象,所以还要把原型链进行克隆funForBind.prototype = Object.create(thisFn.prototype);return funcForBind;
}
- call 和 apply
之前的例子:
//给obj2增加一个obj的call的函数,然后用传入的参数进行调用返回最终值
obj.say.call(obj2,1,2,3);
Function.prototype.myCall = function(thisArg,...arr){if(thisArg == null || thisArg == undefined){thisArg = window;}//定义一个不重复的方法名称const specialMethod = Symbol('anything');//将这个不重复的方法Function的指针给thisArg的specialMethod方法thisArg[specialMethod] = this;//调用函数并结果返回let result = thisArg[specialMethod](...arr);//delete 新增的属性delete thisArg[specialMethod];return result;
}
obj.say.myCall(obj2,1,2,3);
Function.prototype.myApply = function(thisArg,arr){if(thisArg == null || thisArg == undefined){thisArg = window;}//定义一个不重复的方法const specialMethod = Symbol('anything');//将这个不重复的方法的指针给thisArg的specialMethod方法thisArg[specialMethod] = this;//调用函数并结果返回let result = thisArg[specialMethod](...arr);//delete 新增的属性delete thisArg[specialMethod];return result;
}
obj.say.myApply(obj2,[1,2,3]);
GET POST区别
- 请求
请求次数。
GET发送一次接受一次
POST发送多次接收多次(先发header再发body)
- 参数
GET放在URL中,POST请求体中
- 编码
GET在URL上只能ASCII,POST支持更多
- 缓存
GET主动缓存,POST不行(除了流式传输)
- 应用场景
GET搜索关键字,分页操作。POST注册。
ajax五个请求 回调 和 promise区别 手写
ajax
创建HTTP请求异步对象
设置回调函数
open方法建立连接
send发送数据
回调函数对响应状态进行处理
promise封装
创建promise对象
新建请求
配置请求头部
设置 状态监听函数resolve / 错误监听reject
设置响应数据类型
发送HTTP请求
状态码
缓存
- 强缓存 Expires Cache-Control
1.0 Expires 过期时间点
1.1 Cache-Control 过期时间段 - 协商缓存 Last-Modified ETag
强缓存失效过后,给服务器发Tag,服务器来判断要不要,报304说明直接用协商缓存了
性能上,Last-Modified优于ETag,Last-Modified记录的是时间点,而Etag需要根据文件的MD5算法生成对应的hash值。
精度上,ETag优于Last-Modified。ETag按照内容给资源带上标识,能准确感知资源变化,Last-Modified在某些场景并不能准确感知变化,比如【面筋烧烤手册】20201206相关推荐
- 【面筋烧烤手册】CSS
文章目录 基础 1.CSS引入方式 2.CSS的引入方式的优先级 3.CSS的选择器 继承 通配符选择器 标签名选择器 类选择器 ID选择器 内联选择器 后代选择器(包含选择器) 子代选择器 相邻兄弟 ...
- 【面筋烧烤手册】HTTP数据传输专题
网络数据传输专题 1.Ajax请求五个步骤 由js脚本发起HTTP请求,根据返回的数据,获取相应部分,并不用刷新页面 例如:进行一次head请求 创建多适配对象 声明回调函数建立连接(配置请求方式) ...
- 【面筋烧烤手册】网络安全
HTTPS(对称+非对称+CA证书+hash) 对称加密 双方约定好一个key,来解密加密 约定key的过程可能被拦截 key太多了影响性能,一般服务器只有一个key 非对称加密 服务器存有公钥,私钥 ...
- 【面筋烧烤手册】JavaScript原型专题
JavaScript原型专题 文章目录 JavaScript原型专题 过于抽象 直接上自己画的图 注意点: prototype是函数属性,__proto__是实例化对象属性
- 血赚,一顿小烧烤就从阿里P8手上拿到这份内部SpringCloud手册
前言 Spring Cloud提供一整套微服务的解决方案,基于Spring Boot可实现快速集成,且开发效率很高,堪称中小型互联网公司微服务开发的福音.而且Spring Cloud发布新功能的频率非 ...
- 杭州旅游非官方手册V1.0
杭州旅游非官方手册–旅游局和导游永远不会告诉你的秘密V1.0 An Unofficial Short Introduction of Travelling in Hangzhou: The Secre ...
- 最新Java技术书单烧烤出炉,欢迎清点享用
最新Java技术书单烧烤出炉,欢迎清点享用 基础 <Head First Java>(推荐,豆瓣评分 8.7,1.0K+人评价): 可以说是我的 Java 启蒙书籍了,特别适合新手读当然也 ...
- 分布式训练使用手册-paddle 数据并行
分布式训练使用手册¶ 分布式训练基本思想¶ 分布式深度学习训练通常分为两种并行化方法:数据并行,模型并行,参考下图: 在模型并行方式下,模型的层和参数将被分布在多个节点上,模型在一个mini-batc ...
- 正则语法完全正则表达式手册_语法格式重点
20211202 https://blog.csdn.net/lc11535/article/details/103266263 该表达式打开re.U(re.UNICODE)标志. python –& ...
最新文章
- Azure AI的又一里程碑,Neural TTS新模型呈现真人般情感饱满的AI语音
- mysql 错误1930xc1_Mysql写入记录出现 Incorrect string value: '\xB4\xE7\xB1\xCA\xBC\xC7‘错误?(写入中文)...
- 港口物流系统设计与优化-SMU在线学习笔记
- JS刷新父窗口的几种方式
- python输入一个人的名字_怎样用c语言做到输入一个人的名字才会输出一个心?
- 最近流行的12个笑话,好笑又有道理
- jquery对象和DOM对象的相互转换详解
- qt连接mysql4.7数据库_QT4.7访问MySQL的驱动编译过程
- 在linux上安装jenkins
- Git使用教程:最详细、最浅显、一文读懂Git常用操作!
- UI设计灵感|插画在引导页中的应用
- error loading python dll_Error loading Python DLL python36.dll 的解决办法 及其他pyinstaller问题...
- Visual Studio 2010修改授权
- python线程数组_Python多线程
- 牛客竞赛,ZUST第17届公开赛,摸鱼记(A、DEFGH、J题解,3/7题代码)
- OpenSSH升级-无需替换旧版本文件
- Cocos2D场景编辑器
- vue集成wangeditor3.0版本 解决光标乱跳等问题
- Solaris adsl上网
- 性能测试模型-曲线拐点模型-压力曲线分析图
热门文章
- 【面筋烧烤手册】CSS