基本语法
基本语法包括数据类型,操作符,语句,函数
数据类型
5种简单数据类型(基本数据类型)Undefined、Null、Boolean、Number、String
和一种复杂数据类型Object,是所有对象的基础
typeof 操作符检定给定变量的数据类型
JavaScript不区分整数和浮点,Number类型可用于保存所有数值
操作符
常用 : 算数操作符,布尔操作符,赋值操作符
布尔操作符:与或非 && || !
控制语句
常用 : if语句 for语句 switch语句
函数
函数用来封装多条语句
函数可以在任何时候返回任何值
函数的参数以数组形式传递,可以接受任意参数,可以通过arguments对象来访问这些参数。
变量和作用域
JavaScript包含基本类性值和引用类型值。
基本类型在内存中是实际的值,引用类型在内存中就是一个指针,指向一个对象,多个引用类型可能同时指向同一个对象。
检测基本类型用typeof 检测对象类型使用instanceof
所有变量都存在与作用域当中,作用域决定了变量的生命周期。
函数的局部环境有权访问函数作用域中的变量和父环境到全局变量
JavaScript没有块级作用域
引用类型
Object : 基础类型,其它所有类型都从Object继承
Array : 数组类型,每一项可以保存任何数据
转换方法 栈方法 队列方法 重排序方法 操作方法 位置方法 迭代方法 归并方法
Date : 日期类型
RexExp : 正则表达式
面对对象程序设计
创建自定义类型最常见的方式是组合使用构造函数模式与原型模式,构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性。
// 构造函数
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}
// 原型
Person.prototype = {
constructor: Person,
sayName: function() {
return this.name;
}
}
// 实例化
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //输出"Shelby,Count,Van"
alert(person2.friends); //输出"Shelby,Count"
alert(person1.friends === person2.friends); //输出false
alert(person1.sayName === person2.sayName); //输出true
继承
原型链是实现继承的主要方法
将父类实例赋值给子类构造函数的原型
// 父类
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
};
// 子类
function SubType() {
this.subproperty = false;
}
SubType.prototype = new SuperType();
//给子类添加新方法
SubType.prototype.getSubValue = function() {
return this.subproperty;
};
//重写父类的方法
SubType.prototype.getSuperValue = function() {
return false;
};
// 实例化
var instance = new SubType();
console.log(instance.getSuperValue()); //输出false
函数表达式
执行代码之前会先读取函数声明
递归
函数表达式递归
var factorial = (function f(num) {
if (num <= 1) {
return 1;
} else {
return num * f(num - 1);
}
});
var anotherfactorial=factorial
factorial=null
console.log(anotherfactorial(3)) //输出6
闭包
一个函数可以访问另一个函数作用域中的变量,那么前者就叫做闭包。
创建闭包最常见的方式就是在函数内部创建函数
闭包可以封装变量或者模拟块级作用域
闭包的缺陷:
function createFunctions () {
var result = new Array()
for (var i=0 ; i<10 ; i++) {
result[i] = function() {
return i
}
}
return result
}
//想要的效果是每个函数都返回自己的索引值,但实际上每个函数都返回10
//本质是子函数对父函数的引用是父函数运行结束之后的状态,要使用运行时候的状态就应该在加上自执行
function createFunctions {
var result= new Array();
for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
};
}(i);
}
return num;
}
封装
JavaScript并没有块级作用域的概念,只有全局作用域和函数作用域,那么如果想要创建块级作用域的话,我们可以通过闭包来模拟。
创建并立即调用一个函数,就可以封装一个块级作用域。该函数可以立即执行其中的代码,内部变量执行结束就会被立即销毁。
function outputNumbers(count) {
(function() {
for (var i = 0; i < count; i++) {
alert(i);
}
})();
// i在外部不可用,便有了类似块级作用域
alert(i); //报错
}
静态私有变量
(function() {
//私有变量和私有函数
var privateVariable = 10;
function privateFunction() {
return false;
}
//构造函数
MyObject = function() {};
//公有/特权方法
MyObject.prototype.publicMethod = function() {
privateVariable++;
return privateFunction();
};
需要注意的是,这个模式在定义构造函数时没有使用函数声明,在严格模式下会导致错误
总结
以上是我从《JavaScript高级程序设计》阅读后的总结,并不是我想象中的高级设计,完全是ES5跳坑指南啊( `д′)
最近刚开始看ES6,越来越嫌弃ES5了,闭个毛线包啊,立即执行毛线啊,let不好吗!
(ノಠ益ಠ)ノ彡┻━┻