第二章 在HTML中使用javaScript
- <script></script> 建议集中放在body标签的底部,提高页面的加载速度
- <script></script> 可以引用本地以及制定url的js文件
- <script></script> 的def将js脚本的解析顺序放在</html>之后。仅适用于引用url脚本
- <script></script> 的asyn将异步下载js脚本、而不是同步下载。仅适用于引用url脚本
第三章 基本概念
- js使用与java一致的驼峰命名规则
- 每条语句单列,强烈建议使用 ;号分割语句
- js内的变量是弱类型的
- var a;//声明一个变量,未初始化。a此时为undefined。undefined是js中内置的一个常量和null类似
- var a = “hello js”//申明一个变量,并且拥有初始化
- 强烈建议任何变量的赋值和生命都带var关键字。避免 a = “hello word"这样的声明方式
- typeof是内置操作符,可以获取变量的类型:
- typeof a;
- typeof("hi js");
- js中类型:
- Null类型:null取值。 Undefined类型:undefined取值。Boolean类型:true和false两种取值。这些都是js内的常量
- Number类型:整型(二进制、十进制、八进制、十六进制)、浮点型
- 字符串转换成数据类型:Number("3.13");parseInt("1");parseFloat("1.2");
- 值/数值转换成字符串:a.toString();或者string(a);
- Object类型: var a = new Object();(建议) var b = new Object;(不建议)
- 操作符:绝大多数操作符合java、c等主流语言类似。仅关注=== 与 ==即可。
- === 绝对相等操作符。类型和值都需相等。比如"1" == 1 不成立。
- ==近似相等。通过隐式类型转换后相等即可。比如"1" == 1 成立。
- !== 非全等。比如"1" = 1 成立。
- != 完全不等。比如"1" = 1 不成立。
- 控制语句:
- if; do while; while; for;switch;break;continue等语句和java、c相同。
- 增加了枚举对象属性的for in语句。 for(var pro in object){console.log(pro);}
- 函数:
- function关键字生命函数
- 函数生命无须添加返回值
- js的函数申明了php很像
- 强烈建议在函数形参方面不适用js arguements特性。忘掉这段特性
- js没有语言级别的函数重载
- js允许函数嵌套定义。
第四章 变量、作用域和内存问题
- js将变量类型分为值类型和引用类型
- 值类型: Number、Undefined、Boolean、Null、String。java中String是引用类型
- 引用类型:对象。
- typeof操作符用来区分基本类型。instanceof用来区分对象是哪种类的实现。
- 作用域链:js解析变量的顺序是从作用域链前端开始搜索、一直搜索到作用域链的后端。作用域链的最前端是当前函数栈、作用链的末端是全局环境栈。
- js不存在块级作用域。java、c、php都有块级作用域。
- js的垃圾收集: 引用计数和标记清除。
第五章:引用类型
- js并非完全面向对象的、其不支持接口的概念。
- 创建对象的方式有两种:
- var o = new Object();//常规方式创建
- var o ={name:"hi",age:9};//字面量方式创建。通过字面量创建对象,并不会调用构造方法
- 通过object.pro的方式访问对象中的方法和属性。
- js内置Array类型
- var array = new Array();//常规
- var array = [1,2,3,4];//字面量
- Array类型是动态数组
- push()方法像数组末尾添加元素
- pop()删除数组末尾元素
- shift()删除数组首端元素
- unshift()想数组手端添加元素
- 通过push、pop、shift、unshift能够使Array具备栈和队列的能力。
- reverse()翻转
- sort()排序
- sort(funtion(arg1, arg2){});定制排序规则
- 更多Array操作随用及查
- js的Function类型
- Function类型就是js中的类、等同于其他面向对象中的Class。每个函数都是Function的实力;(每个对象都是Class的实例子)
- 函数名称是指向函数对象的指针。(建议不要用到该属性)
- 函数声明具备“函数声明提升”的效果;函数表达式不具备“函数申明提升的效果”。
- 函数声明提升:js解释器会将函数生命提升到顶部。尽管你在文件的末尾定义的函数,也能在任何位置使用该函数。
- Function内部有两个非常特殊的属性:constructor 和 prototype
- js的Number、Boolean、String都有与其对应包装引用类型。这些基本类型->包装引用类型的转变是解释器自动完成的。相当于语法糖。
- Global 和Math对象的相关API、随用随查。
第六章 面向对象程序设计
- js提供两类对象:
- 原生引用类型,比如Array、Date、Global、Object等
- 自定义引用类型。
- js提供两种方法创建自定义引用类型
- new Object()方法
- 字面量定义对象。该种方法不会触发构造函数调用
- js的面向对象可以看成数一组无顺序属性的集合(属性名:属性值)。属性值可以是基本类型、引用类型、函数。js对象的概念和散列表非常相似。
- js内部并没有提供class的关键字。js是通过直接定义类的构造函数来定义对象类型的。
//定义对象的构造函数、首字母需要大写
function Person(name, age, address){
this.name = name; //定义对象属性
this.age = age;
this.address = address;
this.sayName = function(){ //定义对象方法
return "hello" + this.name;
}
//创建对象
var person = new Person("tu",18,"bupt");
- prototype的概念
- 所有Function中都存在一个prototype属性。
- prototype属性是一个指向对象的指针。指向的对象成为原型对象。由相同构造方法创建的所有实例子共享同一个原型对象。
- js提供原型的概念用以抽象出相同类、不同实例之间的共有的属性和方法。如下图所示,person1对象和person2对象共享相同的属性和方法。
- prototype作用基本等价于其他oop中类成员变量、类成员函数的概念


- js中定义引用类型的默认模式:构造函数中定义属性值;原型中定义公共方法


第七章 函数表达式
-
js支持两种方式创建函数:
- 函数声明方式
hello("hello","world"); // 函数声明自带函数声明提升功能 function hello(arg1, arg2){ console.log("函数声明方式"); }- 匿名函数:匿名函数的this对象指向window
var hello = function(arg1,arg2){ console.log("匿名函数形式") } hello("hello","word");//匿名函数不具备函数提升功能 -
闭包:某函数能访问另外一个函数作用域中的对象成为闭包
function wrapper(arg1, arg2){ return funtion(arg3, arg4){ var sum = arg1 + arg2; //该函数内部,访问了wrapper函数的arg1和arg2参数 return sum/(arg3+arg4); } }理解闭包,其实就是开解函数作用域链的过程。内部函数持有外部函数的作用域
- 进一步理解闭包
result中的每个函数都返回10。因为result[i]这个匿名函数的作用域链中持有的是引用
- 符合预期的闭包

- 闭包产生内存泄漏的风险:
- 进一步理解闭包

