JavaScript学习总结
JavaScript学习总结 基础语法 js基础的语法和C/C++等众多语言类似,有8种基本类型: string number boolean null undefined object symbol bigint 以及流程控制和循环语句等: if switch for for .. in for .. of while do .. while JS Object 在js中,除了几个基本类型,其他基本都可以当成是Object。而Object这个对象就是JS中最基本的Object, 除了使用Object.create(null)创建的对象,其他对象都会默认使用Object.prototype作为自己的[[Prototype]]。如下是JS中几种主要Object的导图: Function JS中的function也是Object, 只不过是可以“执行”的Object。要注意的是,js中的this变量的处理与其他语言不太一样,this指向的是调用该函数的对象,比如a.hi(),调用hi()的时候,this指向的是a这个object, 而用b.hi()时则是指向b这个object。 This 在JS中,当调用Object里面的函数时,并不能用变量名直接访问对象的其他property,而是必须通过this变量。一般情况下,this就是指向调用对象的一个指针。 Arrow function JS的箭头函数() => xxx除了是简化的函数外,还有一点比较特殊:没有this,所以箭头函数会直接使用调用环境下的this。 Closure JS中闭包其实就是上下文或者说Environment的复制(估计解释型语言应该都是这样)再加上JS的垃圾回收机制(一个对象没有任何引用或者一组与Global无关的对象才会被自动回收)。Environment就是执行时的层级,其中记录了当前Block下的各种变量。比如: function a(){ let count = 0; return function(){ count++; } } let b = a(); 当如上代码执行时,会先创建一个a的Environment,然后再创建被返回的那个匿名函数的Environment,因为匿名函数被b引用,而a的Environment会被匿名函数引用,便形成了一个闭包。 Prototype JS中的prototype是Object的一个特殊的属性,当访问Object的属性或者函数时,如果没有找到相应的,则会去prototype中寻找,因此我们可以用prototype来实现继承关系。因为prototype本身也是一个Object,所以可以有很多层的继承。实例的__proto__属性是真正的prototype的一个setter/getter,对于真正的prototype,一般用[[Prototype]]表示。 在函数和Class中,有一个prototype的属性,注意这个属性并不是上面所讲的prototype。函数和Class的prototype属性是用来给实例的__proto__或者说[[Prototype]]赋值的,需要使用new操作符。比如: function User(){ this.name = "John"; } User.prototype = { name: "IIa" } let user = new User; console.log(User.prototype == user.__proto__); Class Class是JS为OOP设计的一个结构,跟其他OOP语言一样有成员、方法,可以继承,有静态变量和方法,但是如下特性还只在最近的浏览器版本中部分实现: 静态成员 私有成员或函数(#) JS的Class本质上也是一个Function, 只不过把constructor体现的更明显,其中super关键字也可以在普通Object中使用。 ...