-
js 的数据类型(null和undefined区别)
基本类型:string, number, null, undefined, Boolean, symbol,bigint
引用类型:Object -
判断变量类型
常用的变量类型有11种:Number,String,Boolean,Object,Array,Json,Function,undefined,Null,
Date,RegExp,Error
1.使用typeof能判断出四种,分别是number,string,boolean,object,剩余的均被检测为object
2.p instaceof Person. 判断Person指向的原型对象在不在p的原型链上。这种变量判断可以检测出9种,undefined和null被检测为object。
3.使用Object.prototype.toString.call()
Object.prototype.toString可以取得对象的内部属性[[class]],并根据这个内部属性返回诸如"[object Number]"的字符串.那么我们就可以通过call获取内部属性[[class]]
判断空数组:arr.length == 0
判断空对象:Object.keys(obj).length == 0 -
强制转换成数字,注意undefined会被转成NaN,null会被转成0
字符串隐式转换,+是字符串拼接,其他符号转换成数字计算。
if隐式转换成boolean: null, undefined, ‘’",0,NaN转为false
== 和 ===
==:只比较值
===:值和类型都比较
包装类型是特殊的引用类型。每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而可能调用一些方法来操作这些数据。就对那些不是new出来的,在调用方法时候包装。用完即销毁。包装类型共包括Boolean、Number和String三种.
包装类型 -
原型和原型链
每一个构造函数都有一个prototype,叫原型对象(祖宗),存放一些共享的方法。对象身上有__proto__,叫对象原型,指向原型对象。
原型对象里有consturctor指向构造函数.
创建新对象
将构造函数的原型对象prototype和对象的对象原型__proto__连起来
新对象和函数this绑定
执行构造函数代码
返回对象
原型链。
this指向实例对象或者调用者。
-
闭包。是个函数。它的局部变量可以被另一个函数访问。比如函数里面写函数,外层函数就是一个闭包。它延伸了变量的作用范围。
在函数定义的地方,从内到外找变量对象。
应用:利用for循环创建n个立即执行函数,接收i。 -
函数内部this指向
改变this指向。
1.call方法。fun.call(obj,arg1)。第一个参数是指向的位置,后面是普通参数。可以写继承,将父构造函数指向子类,从而子类拥有父类的属性。
2.apply方法。fun.apply(obj,[args]).第二个参数是数组。
3.bind方法。不会调用函数,参数与call一样。返回一个新函数(改变指向后的。应用,按钮定时器,改变定时器内部ths指向到按钮。
7.事件捕获从外到内,冒泡从内到外。事件在冒泡阶段触发。
事件委托,子级的事件给父级处理。e.target获取事件捕获阶段最内层元素,点samll就是small。
可以避免给每个元素都添加事件,只需给父元素绑定事件就好。
-
cookie和storage
cookie是服务器存在客户端的文本文件4kb,一般存放身份信息。
webStrorage: 相对于cookie存放的数据大一些5MB。
sessionStorage本地存储回话数据,会话结束后数据销毁。
localStorage持久的本地存储。
cookie和web storage -
数组常见的方法
会改变数组: shift,unshift,pop,push,splice,reverse,
不改变数组: concat, slice,map,filter,reduce
obect.assgn,展开运算符…也是浅拷贝
但他们是浅拷贝,改为引用类型就能看出。
用JSON.parse(JSON.stringify(list))可实现深拷贝
浅拷贝深拷贝 -
new对象时内部发生了什么
首先创建一个新对象
新对象的和__proto__和构造函数的prototype链接
函数的this和新对象绑定
执行构造函数
返回新对象 -
防抖和节流(插眼)
-
requestAnimationFrame优势,隐藏元素不重绘,节省内存。刷新频率60帧每秒。
-
let/var.const
for循环里面有定时器函数或者回调函数,用var定义i容易出错。用let可以形成块级作用域。
-
排队打饭没带卡,先让出队列,让后面人继续。我先去拿卡。
异步任务不阻塞主任务的进度。
promise解决回调地狱。
resolve函数执行后,then才会执行。then的参数就是resolve传出来的。
Promise.all所有成功,返回成功结果的数组。失败,返回最先失败的那个err。
Promise.race返回最快的那个。async和await
async 是“异步”的意思,await 是等待的意思。await 只能出现在 async 函数中。async返回一个 promise对象。
await 后面本质是一个promise对象,await promise对象,得到的值就是resolve传出来的。
失败的情况用try…catch
async,await
await后面的代码可以当做是then的内容,是个微任务。
13582674
同步任务:1358
微任务:2,6,7
宏任务:4 -
箭头函数和普通函数
function变为箭头。箭头函数匿名的,不能作为构造函数。没有prototype属性。箭头函数的this不是动态的,定义时确定。 -
js是单线程的
1.同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。
2.当Event Table中指定的事情完成时,会将这个函数移入Event Queue。
3.主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
4.上述过程会不断重复,也就是常说的Event Loop(事件循环)。
js运行机制
注意,setImmediate可能和定时器发生循环。定时器1=>setImmediate=>定时器2
晓舟报告。
- 继承的方式。
原型链,构造函数call,实例继承,extends