Introduction to ECMAScript
JavaScript程序设计之ECMAScript
1. 简介
解析型编程语言(脚本)
运行环境 – 浏览器
ECMAScript – 语言核心标准
DOM文档对象模型 – W3C标准,操作文档对象的API
BOM浏览器对象模型 – 操作浏览器对象的API
引入 – 内嵌代码,外联文件,靠近</body>标签
2. 调试器
浏览器 – F12
3. 基本语法
3.1 变量标示符
3.2 关键字和保留字
3.3 大小写敏感
3.4 严格模式
- 隐式声明或定义变量不可行,要带var关键字
- 对象属性不能够重名
- arguments属性不可用
- with语句不可用
3.5 注释
多行注释,以”/“开头,以”/“结尾,不可嵌套
单行注释,以”//“开头
4. 类型系统
4.1 基本类型
4.1.1 对象类型系统
4.1.2 标准类型
4.1.3 原始类型和引用类型
4.1.4 undefined
说明
值:undefined
已声明未赋值的变量
|
|
获取对象不存在的属性
|
|
无返回值的函数的执行结果
|
|
函数的参数没有传入
|
|
void(expression)
类型转换
值 | Boolean | Number | String |
---|---|---|---|
undefined | false | NaN | “undefined” |
4.1.5 Null
说明
值:null
表示对象不存在
|
|
类型转换
值 | Boolean | Number | String |
---|---|---|---|
null | false | 0 | “null” |
4.1.6 Boolean
说明
值:true,false
字面量或变量定义
|
|
条件语句导致系统执行的隐式类型转换
|
|
类型转换
值 | Number | String |
---|---|---|
true | 1 | “true” |
false | 0 | “false” |
4.1.7 String
说明
值:由单引号或双引号包裹的字符序列
|
|
类型转换
值 | Number | Boolean |
---|---|---|
“” | 0 | false |
“1a” | 1 | true |
4.1.8 Number
说明
值:整型直接量,八进制直接量(0-),十六进制直接量(0x-),浮点型直接量
|
|
类型转换
值 | String | Boolean |
---|---|---|
0 | “0” | false |
1 | “1” | true |
Infinity | “Infinity” | true |
NaN | “NaN” | false |
4.1.9 Object
说明
值:一组属性的集合
|
|
类型转换
值 | Number | Boolean | String |
---|---|---|---|
{} | NaN | true | “[object object]” |
4.2 类型识别
typeof
可以识别标准类型(Null除外)
不可以识别具体对象类型(Function除外)
|
|
instanceof
识别内置对象类型
识别自定义对象类型
不能识别原始类型
|
|
Object.prototype.toString
可以识别标准类型以及内置对象类型
不能识别自定义类型
|
|
constructor
可以识别标准类型(undefined和null除外,没有构造器)
可以识别内置对象类型
可以识别自定义类型
|
|
5. 内置对象
5.1 简介
标准内置对象
构造器对象
- 说明
- 实例化对象方法
- 属性方法
- 原型对象属性方法
- 实例对象属性方法
普通对象
- 说明
- 属性方法
5.2 Object
Object.create
Object.prototype.toString
Object.prototype.hasOwnProperty
5.3 Boolean
值 | 布尔 | |
---|---|---|
数字 | 0,NaN | false |
字符串 | “” | false |
undefined | false | |
null | false | |
对象 | true |
5.4 String
String.prototype.indexOf
String.prototype.replace
String.prototype.split
5.5 Number
Number.prototype.toFixed
5.6 Array
Array.prototype.splice
Array.prototype.forEach
5.7 Function
自定义对象构造器
Function.prototype.apply
Function.prototype.bind
子类构造器
函数调用
- ()
- apply,call
函数参数
- 形参个数不一定等于实参个数
- 值传递
- 通过参数类型检查事项函数重载
arguments
- length:实参个数
- 0…arguments.length-1:实参属性名称(key-value中的key)
- callee:函数本身
|
|
值传递
函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。
Javascript中参数列表对函数的功能是没有影响。参数列表只是为了我们更方便地使用函数而设置的,真正调用函数时,起作用的永远是一个存放参数的数组(可以通过arguments对象访问的数组)。
在定义同名函数的时候,后定义的函数只不过是覆盖了先定义函数的引用变量。
requirejs实现的函数重载
|
|
在其他地方加载方法
|
|
5.8 RegExp
RegExp.prototype.test
5.9 Date
5.10 Math
Math.floor
5.11 JSON
JSON.stringify
JSON.parse
5.8 全局对象
NaN
parseInt
eval
encodedURIComponent
6. 表达式与运算符
表达式
运算符
关系运算 ===
####关系运算 ==
逻辑运算 !
逻辑运算 &&
逻辑运算 ||
运算符优先级
7. 语句
for in
with
8. 变量作用域
变量作用域
- 生命周期
- 作用范围
- 静态作用域(词法作用域),由程序定义的位置决定
- 动态作用域,程序运行时刻决定
Javascript变量作用域
- 使用静态作用域
- 没有块级作用域
- ES5使用词法环境管理静态作用域
词法环境
组成
环境记录(形参、变量、函数等)
对外部词法环境引用(outer)一段代码开始执行前,先初始化词法环境
形参
变量定义 var x = undefined
函数定义构造过程
1234567891011> var x = 10;> function foo(y) {> var z = 30;> function bar(q) {> return x + y + z + q;> }> return bar;> }> var bar = foo(20);> bar(40);>>
问题
形参、函数定义、变量定义名称冲突
arguments
函数表达式
with
12345678910111213> var foo = 'abc';> with({> foo: 'bar'> }) {> function f() {> alert(foo); // 'bar'> };> (function () {> alert(foo); // 'bar'> })();> f();> }>>
try … catch
12345678910111213> try {> var e = 10;> throw new Error();> } catch(e) {> function f() {> alert(e);> };> (function () {> alert(e);> })();> f();> }>>
带名称的函数表达式
12345> (function A() {> A = 1;> alert(A); // <function>> })();>>
9. 闭包
|
|