基本概念
ECMAScript
DOM
BOM
script
defer
async
变量
1 | |
严格模式下,不能定义eval和arguments的变量
数据类型
Undefined、Null、Boolean、Number、String、Object
typeof操作符
Undefined
undefined,在var声明却没有赋值的时候,变量的值就是undefined
Null
只有一个null,undefined派生自null,
1 | |
Boolean:
true false
Number:
八进制用0开头,十六进制用0x开头,最小值Number.MIN_VALUE,最大值Number.MAX_VALUE;NaN,非数值
1 | |
Number()、paraseInt()、parseFloat()
String
Object
1 | |
操作符
位操作符
1 | |
相等操作符
1 | |
with
1 | |
switch
比较的时候使用的是全等操作符
函数
参数
很松散,定义的参数不一定在调用时传参,也可以在函数内使用argument(这个类似数组)访问传入的参数,
作用域
没有块级作用域
1 | |
var定义的变量会绑定到当前的环境,如果没有用var定义,则会将变量变成全局变量
object类型
1 | |
Array
1 | |
Date
1 | |
RegExp
1 | |
Function
内部属性
arguments
arguments.callee,指向拥有这个arguments对象的函数
this
在全局环境中调用函数时,函数中的this就是window
caller属性
显示函数的调用者,严格模式下不能使用
length属性
函数期望接收的参数的个数
prototype属性
基本包装类型
对基本类型的包装,自动创建的基本包装类型的对象,只存在于一行代码执行瞬间。
1 | |
Boolean
建议不要用,因为基本包装类型在需要真值时都会被转成true
Number
1 | |
String
1 | |
Global对象
1 | |
Math对象
面向对象
创建对象
工厂模式
1 |
|
构造函数模式
1 |
|
原型
创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,并指向原型对象,原型对象中的constructor属性指向该函数。
1 | |
当原型对象包含引用类型的时候,修改对象中的该属性,会影响其他对象的对应的属性值。
继承
原型链
当一个类型的原型对象指向另一个类型的实例,此时原型对象将包含指向另一个原型的指针
function Father(){
this.property = true;
}
Father.prototype.getFatherValue = function (){
return this.protoperty;
}
function Son(){
this.sonproperty =false;
}
Son.prototype = new Father();
Son.prtotype.getSonValue = function(){
return this.sonproperty;
}
var instance = new Son();
alert(instance.getFatherValue());
问题
- 包含引用类型的原型属性会被所有实例共享
- 创建子类型实例的时候,不能向超类型的构造函数中传递参数,如果在子类定义时就将属性赋了值,对象实例问就不能再更改自己的属性了。这样就变成了类拥有属性,而不是对象拥有属性了,所以原型链并不实用。
借用构造函数
1 | |
问题
- 方法都在构造函数中定义,函数无法复用,
- 在超类的原型中定义的方法,对子类型是不可见的
很少单独使用借用构造函数
组合继承
1 | |
这是javascript中常用的继承模式
寄生组合继承
组合继承会调用俩次超类型的构造函数。
1 | |
普遍认为最理想的继承范式
函数表达式
1 | |
匿名函数
1 | |
闭包
常用的场景是在函数里面定义函数,内部函数的作用域包含外部函数的作用域。
1 | |
模仿块级作用域
1 | |
私有变量
1 | |
静态私有变量
1 | |
模块模式
1 | |