第一章 JavaScript简介
- 从一个简单的输入验证器发家
- Netscape公司开发,Brendan Eich, LiveScript
- 微软的JScript
- TC39 指定标准,ECMA-262, ECMAScript(读 ek-ma-script)
Javascript
三部分:核心(ECMAScript),文档对象类型DOM,浏览器对象类型BOM
ECMAScript不一定非要在浏览器上使用,它只是一种对程序语言的标准规定。ActionScript、JavaScript都实现了ECMAScript。
版本问题
- Netscape的JavaScript1.1,删除针对浏览器的代码,支持Unicode
- 编辑加工,为了与ISO/IEC-16262保持严格一致
- 真正修改,字符串处理、错误定义、数值输出,正则表达式、新控制语句、try-catch异常处理的支持
- ECMA TC39主导,检验修订,包含了强类型变量、新语句和新数据结构、真正的类和经典继承,定义了与数据交互的新方式
- 同时,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希腊字符
* 一个转义序列表示一个字符
转换为字符串
- toString(): 数值、布尔值、对象和字符串都有这个方法,null和undefined没有。可以传递基数
- 如果不确定是否是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. 逻辑或 ||
- 5.