一些零碎的知识
W3C
W3C是指万维网联盟(World Wide Web Consortium)。是Web技术领域最具权威和影响力的国际中立性技术标准机构。
== 和 ===
===是严格运算符。
当符号两边数据类型不同时,直接返回false。
当符号两边数据类型相同并且是基本数据类型时,比较其值。
当符号两边数据类型相同是对象时,比较是否指向同一对象。
==是非严格运算符。
当符号两边数据类型相同时,按严格运算符处理。
当符号两边数据类型不同时,基本数据类型会被转成数值,对象会被转换成基本数据类型。然后再进行比较。undefine和null与其他类型数据比较返回false,相互比较返回true。
关于javaScript的运行机制
1.javaScript运行在一个单独的线程内,并且只能单线程运行。因为javaScript被设计用来操作DOM和响应事件,如果采用多线程则会造成很复杂的同步问题。
2.javaScript的任务或者说方法有两种类型:同步任务和异步任务。其中同步任务在任务栈中按代码顺序执行。异步任务会先被放在一个任务表中(task table,callbackQueue)挂起,当满足执行条件则向任务队列中(task Queue)添加一个事件。当任务栈中任务全都执行完后,主线程取出任务队列中事件对应的回调(也就是被挂起的任务)放到任务栈中执行。
主线程从任务队列中读取事件,这个过程是不断循环的。所以这种机制又叫做EventLoop。
原型链
javascript中对象可以分为两种:实例对象和函数对象。其中函数对象的prototype属性指向这个函数对象的原型。原型是实例对象。原型中的constructor属性指向这个函数对象。通过这个函数对象new出来的对象是实例对象。其_proto_属性指向函数对象的原型。在访问实例对象的某个属性或者方法的时候会从下往上遍历原型链,找到就返回,否则返回undefined。
模拟访问控制
利用方法的块作用域和闭包。
function obj() {
var name = "dk";
return {
getName:function () {
return name;
}
};
}
var mObj = obj();
alert(mObj.getName());
ES6中的class
class可以看成语法糖。相当于ES5中的函数对象。class中的constructor相当于函数体。在其中定义的方法相当于propotype上定义的方法。和ES5一样,所有实例对象共享一个原型对象。
要在class中实现私有方法,一种办法是方法名前加符号区分,这样还是能在外面调用。一种是方法写在class外面。
在构造方法中可以用new.target判断构造方法是怎么被调用的,如果不是通过new调用则返回null,否则返回当前类对象。当存在继承关系时返回子类对象。利用这个特性可以写出必须继承才能使用的类。
存在继承关系时,子类的构造方法必须调用父类的构造方法(super),否则无法获得this。
传统diff算法
本质是两颗DOM树对子节点逐一进行比较,然后得出哪些节点有增删的情况。
step1.取出变化前/变化后Dom树根节点的所有子节点。
stpe2.for循环对子节点逐一进行比较。若出现两者子节点不同(包括属性和是否存在,是否删除)则记录不同。
step3.若两个子节点相同,则递归比较其所有子节点,重复step1。