第一章 JavaScript简介

  • 从一个简单的输入验证器发家
  • Netscape公司开发,Brendan Eich, LiveScript
  • 微软的JScript
  • TC39 指定标准,ECMA-262, ECMAScript(读 ek-ma-script)

Javascript

三部分:核心(ECMAScript),文档对象类型DOM,浏览器对象类型BOM

ECMAScript不一定非要在浏览器上使用,它只是一种对程序语言的标准规定。ActionScript、JavaScript都实现了ECMAScript。

版本问题

  1. Netscape的JavaScript1.1,删除针对浏览器的代码,支持Unicode
  2. 编辑加工,为了与ISO/IEC-16262保持严格一致
  3. 真正修改,字符串处理、错误定义、数值输出,正则表达式、新控制语句、try-catch异常处理的支持
  4. ECMA TC39主导,检验修订,包含了强类型变量、新语句和新数据结构、真正的类和经典继承,定义了与数据交互的新方式
  5. 同时,TC39下属的一个小组提出ECMAScript 3.1的替代建议,ES3.1获得的支持超过了TC39,4版在正式发布前被放弃(P4),ECMA 3.1成为第5版,增加了JSON对象,继承的方法和高级属性定义,严格模式

ECMAScript兼容是什么?

想要成为ECMAScript的实现,该实现必须做到:
1. 支持ECMA-262描述的所有“类型、值、对象、属性、函数以及程序语法和语义
2. 支持Unicode字符标准
3. (可选)添加没有描述的“类型、值、对象、属性、函数”
4. (可选)支持ECMA-262没有定义的“程序和正则表达式语法”

Web浏览器对ECMAScript的支持(P4)

DOM:Document Object Model

针对XML但经过扩展用于HTML的应用程序接口
把整个页面映射为一个多层节点结构,HTML或XML页面由节点组成,节点又包含着不同类型的数据。
DOM创建了表示文档的树形图,开发人员可以进行删除添加修改节点。

为什么使用DOM?

无需重新加载页面,就可以修改外观和内容

因为Netscape和微软在开发DHTML掐架,浏览器互不兼容,负责制定Web通信标准的W3C(World Wide Web Consortium万维网联盟)着手规划DOM

DOM级别(P6)

DOM1:DOM Core(如何映射文档结构)和DOM HTML(添加针对HTML的对象和方法)组成

DOM不是只针对JavaScript

DOM2: 扩充了鼠标和用户界面事件、范围、遍历,通过对象接口增加了对CSS支持。新模块:DOM视图,DOM事件,DOM样式,DOM遍历和反额为

DOM3:引入了以统一方式加载和保存文档的方法,新增了验证文档的方法,对核心扩展,开始支持XML1.0

其他语言DOM标准:SVG,MathML, SMIL

BOM 浏览器对象类型

BOM只处理浏览器窗口和框架,扩展包括
* 弹出新浏览器窗口的功能
* 移动缩放和关闭浏览器窗口的功能
* 提供浏览器信息的navigator对象
* 提供加载页面详细信息的location对象
* 提供用户显示器分辨率的screen对象
* 对cookies的支持
* 像XMLHttpRequest和IE的ActiveXObject这样自定义的对象
BOM没有标准遵循,每个浏览器有自己的实现。window和navigator制式事实标准,HTML5在解决

第三章 基本概念

语法
  • 区分大小写
  • 标识符:第一个字符必须是一个字母、下划线、或一个美元符号,其他字符可以是ASCII或Unicode字母字符,但不推荐
  • 惯例,驼峰大小写格式,第一个小写
严格模式(P20)

ECMAS 5中 "use strict",执行结果会有很大不同

分号

如果语句省略分号,则有解析器确定语句的结尾。分号可以避免很多错误,如不完整输入,压缩错误,增进代码的性能

关键字和保留字

变量

松散类型:可以用来保存任何类型的数据

未初始化的变量,保存为undefined

省略var操作符的,会创建一个全局变量

数据类型

6种
1. undefined
2. null:空的对象引用
3. boolean
4. number
5. string
6. object:无序的名值对组成

typeof返回值
  • undefined —— 未定义
  • boolean —— 布尔值
  • string —— 字符串
  • number—— 数值
  • object —— 对象或null
  • function —— 函数

typeof是一个操作符不是函数

undefined值是派生自null值的,因此null == undefined 是true

Boolean类型(P26)

转型函数Boolean()
true: 非空字符串,非零数字(包括无穷大),任何对象,n/a(not applicable 类型Undefined)
false:空字符串,0和NaN,null, undefined

注意自动转换的发生!

Number类型(P27)

八进制:第一位是0,然后是八进制数字序列(0~7),如果字面的数值超出了范围(出现89),会自动当成十进制数值解析
十六进制:前两位必须是0x,后面跟(0~9及A~F),可大写可小写

进行算术计算时,所有八进制和十六进制表示的数值最终都将被转换成十进制.

+0和-0相等

浮点数值

保存浮点数值需要的内存空间是整数的两倍,抓紧一切机会保存整数。所以如果小数点后没有数字就会保存为整数。

极大或极小的数值,可以用e表示的浮点数值表示,等于这个数乘以10的指数次幂。

var floatNum = 3.125e7; // ==31250000
0.0000003 == 3e-7

最高精度是17位小数,但是,无法测试特定的浮点数值,这是基于IEEE754数值的浮点计算的通病

0.1 + 0.2 = 0.3000000000000000004

数值范围

ECMAScript表示的最小数值保存在Number.MIN_VALUE,大多数浏览器是5e-324, Number.MAX_VaLUE, 1.79….,如果超出范围,会转换成Infinity或-Infinity,

可以用isFinite()函数测试是否在范围内

NaN(Not a Number)

本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)

NaN与任何值都不相等
NaN == NaN //false

isNaN(), 不可以转换为数值的返回true , 对象也可以用,先调用对象的valueOf方法, 再调用toString()方法,再返回测试纸
isNaN('blue') //true

只有0/0 = NaN, 整数/0 = Inifinity, 负数/0= -Inifinity

数值转换
  • Number()
  • parseInt()
  • parseFloat()

转换规则

Number
* Boolean, true 1, false 0
* null, 0
* undefined, NaN
* 字符串

* 只包含数字:“011.1” -> 11.1
* 包含16进制, 转换成10进制
* 空的,转换为0
* 其他的,NaN

parseInt(“0xAF”, 16)
* 会忽略字符串前面的空格,“1234blue”会转为1234,blue放前面不可以。
* 16进制或8进制,会转为10进制。第二个参数是基数

* parseInt("AF")   //NaN
* parseInt("AF", 16) //175

parseFloat
* 第二个小数点无效
* 始终忽略前导的0,只解析十进制

* 1234blue  //1234
* 0xA //0
* 22.5   //22.5
* 22.34.5 //22.34
* 0908.5 //908.5
* 3.125e7 //31250000

String
包含特殊的字符字面量——转义序列,用于表示非打印字符,或者具有其他用途的字符

\n         换行
\t         制表
\b         退格
\r         回车
\f         进纸
\\         斜杠
\'         单引号
\"         双引号
\xnn       十六进制代码nn表示的一个字符,n为0~F,\x41表示A
\unnnn     十六进制代码nnnn表示一个Unicode字符,\u03a3希腊字符

* 一个转义序列表示一个字符

转换为字符串

  1. toString(): 数值、布尔值、对象和字符串都有这个方法,null和undefined没有。可以传递基数
  2. 如果不确定是否是null或undefined,可以使用String()。null返回”null”,undefined返回”undefined”

Object类型

每个实例都有下列属性和方法
constructor
hasOwnProperty(propertyName)
isPrototypeOf(Object)
propertyIsEnumerable(propertyName)
toLocaleString()
toString()
valueOf()

一元操作符

一元操作符:只能操作一个值的操作符
1. ++age(先+后执行), age–
num1– + num2 使用的是num1的初始值,此时的num1已经减一
例子:

var o = {
        valueOf: function(){
            return -1;  
        }
}
“2”++              3
"z"++              NaN
false++            1
1.1--              0.1000000000000000000009
o--                -2

2. +num, -num
+ 正,不影响。false和true转换成0和1, 字符串为NaN
- 负

-“01”       -1
-“1.1”      -1.1
-“z”        NaN
-false      0
-o          1

3. 位操作符(P39)
ECMAScript所有数值都以IEEE-754 64位格式存储,但是位操作符操作的时候,先将64位转换成32位的整数,然后执行操作,最后把结果转换回64位。
32位中的前31位用于表示整数。第32位用于表示数值的符号:0是整数,1是负数。(符号位),31位中的每一位都是2的幂。
负数,使用的格式是二进制补码。求-18,先求18的二进制码,把1替换0,0替换1,然后加1.

3.1 按位非   NOT,~
num1 = 25;     //二进制00000000000000000000000011001
~num1 = -26;   //二进制11111111111111111111111100110
本质是-num1-1,负数减一,但是NOT速度快
3.2 按位与   AND   &
1 & 1 = 1, 1 & 0 || 0 & 1 || 0 & 0 = 0
3.3 按位或   OR    |
1 | 1 = 1; 1 | 0 = 1; 0 | 1 = 1; 0 | 0 = 0
3.4 按位异或 XOR     ^
1 ^ 1 = 0, 其余同3.3
3.5 左移   <<
2 << 5    -----  64       10向左移动5位 1000000,后面多5个0,符号位不变
3.6有符号的右移    >>
64 >> 5   -----  2

3.7 无符号右移   >>>  所有数值的32位都向右移动
正数情况相同
负数,差别非常非常大
-64 >>> 5,   64 ---- 00000...01000000 --- 1111...10111111 + 1 --- 1111...101000000 --- 右移5位,补0 --- 000001111...10

4.布尔操作符

1. 逻辑非      !
    对象            false
    空字符串      true
    0                  true
    任意非0,Infinity          false
    null              true
    NaN            true
    undefined     true

    !!a,  !a无论如何会返回一个布尔值,!再对其求反
    2. 逻辑与          &&
    a && b
    如果a是对象,返回b
    如果b是对象,只有a为true时才会返回b
    如果a和b都是对象,返回b
    如果有一个是null,返回null
    如果有一个是NaN,返回NaN
    如果有一个是undefined,返回undefined

    短路操作,如果第一个a有结果,不会对b求值。

    __如果使用了未定义的值,&&会报错,中断下面代码的执行__

    3. 逻辑或           ||
  1. 5.