7.宏任务,微任务
都是异步任务,微任务:promise.then,async/await。宏任务:定时器
- Promise的then的回调(注意,new Promise()的函数参数是同步代码,then的回调才是异步)
- await下方的代码和赋值代码(注意,await后方的函数是同步代码)
执行宏任务的前提是执行玩所有微任务。
8.作用域
作用域链:内部可以访问外部的变量,外部不能访问内部变量
function fun(){
vara=20;
a=10;
console. log(a);fun();
10 变量再次赋值
function fun(){
a=10 ;
var a=20;
console. log(a);
20
if( typeof name== 'undefined' ){
var name ='b' ;
console. log( ' 111 '+name) ;
}else{
console. Log( ' 222 '+name) ;
}
111b
if(false ){
var a=10;
undefined
12.cookie一般由服务器端生成,用于标识用户身份。localstorage用于浏览器端缓存数据。生命周期永久。sessionstorage在页面或者浏览器关闭时销毁。
16.垃圾回收
标记清除,引用计数(内存泄漏)
17,数组字符串的一些方法
join 数组链接为字符串默认逗号分割。
split 字符串分割为数组
slice 字符串数组都有(切割左开右闭)
18.css预处理器
为css添加了可编程性,使css更加灵活,适应性更高。
优点,不需要考虑浏览器的兼容问题,写法更加简洁,可读性好。
19.for in for of
for … of遍历获取的是对象的键值,for … in 获取的是对象的键名
for … in会遍历对象的整个原型链,性能非常差不推荐使用,
for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象
22.求交集和并集
const union=(arr1,arr2)=>{
const result=arr1.concat(arr2,filter(item2=>arr1.every(item1=>item1!==item2)
return result
}
const inter=(arr1,arr2)=>{
const result=arr1.filter(item=>arr2.some(item2=>item1===item2));
return result;
}
23.浅拷贝,深拷贝
浅拷贝
Object.assign
Array.prototype.slice()
,Array.prototype.concat()返回一个新数组
- 使用拓展运算符实现的复制
- 深拷贝
-
.cloneDeep()
-
jQuery.extend()
-
JSON.stringify()
-
手写循环递归
function clone(target) {
let cloneTarget = {};
for (const key in target) {
cloneTarget[key] = target[key];
}
return cloneTarget;
};
module.exports = function clone(target) {
if (typeof target === 'object') {
let cloneTarget = Array.isArray(target) ? [] : {};
for (const key in target) {
cloneTarget[key] = clone(target[key]);
}
return cloneTarget;
} else {
return target;
}
};
24ts,js
ts是js的超集,ts能使用js的语法
ts需要静态编译,提供强类型和更多面向对象的内容
25.await原理
generate的语法糖,通过同步代码实现异步操作。
我对 ajax 的理解是,它是一种异步通信的方法,通过直接由 js 脚本向服务器发起 http 通信,然后根据服务器返回的数据,更新网页的相应部分,而不用刷新整个页面的一种方法。
27.
默认绑定
全局环境中定义person
函数,内部使用this
关键字
var name = 'Jenny';
function person() {
return this.name;
}
console.log(person()); //Jenny
上述代码输出Jenny
,原因是调用函数的对象在游览器中位window
,因此this
指向window
,所以输出Jenny
这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this
指向的也只是它上一级的对象
var o = {
a:10,
b:{
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();
这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this
指向的也只是它上一级的对象
var o = {
a:10,
b:{
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();
这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this
指向的也只是它上一级
var o = {
a:10,
b:{
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();
上述代码中,this
的上一级对象为b
,b
内部并没有a
变量的定义,所以输出undefined
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();
此时this
指向的是window
,这里的大家需要记住,this
永远指向的是最后调用它的对象,虽然fn
是对象b
的方法,但是fn
赋值给j
时候并没有执行,所以最终指向window
28.事件流 描述的就是页面接收事件的顺序 事件流主要分为两种,一种是事件冒泡流, 一种是事件捕获流 <div> -> <body> -> <html> -> document
事件模型可以分为三种:
原始事件模型(DOM0级)只支持冒泡,不支持捕获
标准事件模型(DOM2级)事件捕获阶段:事件从document
一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行事件处理阶段:事件到达目标元素, 触发目标元素的监听函数事件冒泡阶段:事件从目标元素冒泡到document
, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行
iE事件模型(基本不用)事件处理阶段:事件到达目标元素, 触发目标元素的监听函数。事件冒泡阶段:事件从目标元素冒泡到document
, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行
事件委托指当有大量子元素触发事件时,将事件监听器绑定在父元素进行监听,此时数百个事件监听器变为了一个监听器,提升了网页性能。事件委托就是在冒泡阶段完成 currentTarge指向事件绑定的元素,而 Event.target 则是事件触发的元素。
29.跨域
比如说前端域名a,后端域名b.server_name设置为a,然后设置相应的location以拦截前端需要跨域的请求,最后将请求代理返还b。a访问nginx的a是同源访问,而nginx对服务端转发的请求不会触发浏览器的同源策略。cors在服务器端设置几个响应头,jonsp