以下内容可能存在个人理解的部分,并非完全参照原文
如有疑问,请以书中内容为准
第一章 JavaScript简介
这里需要注意的是JavaScript不等同于ECMAScript,JavaScript包含ECMAScript、DOM和BOM
另外DOM也不是JavaScript专有的,也有其他语言实现了DOM(QML好像就是类似DOM的实现)
第二章 在HTML中使用JavaScript
把JavaScript插入到HTML中需要用到<script>
元素
这里需要注意的要点有:
- 所有
<script>
元素会根据它们在html文件中的先后顺序依次被解析。如果引用多个JavaScript文件时要注意它们之间的依赖关系 - 在
<script>
中使用defer属性的脚本会被延迟到整个页面都解析完毕再运行(即先下载后运行) - 使用async属性可以让脚本使当前脚本不必等待其他脚本,也不必阻塞文档呈现,一旦脚本可用,就会异步执行,但不能保证执行顺序
- 如果不适用defer和async可以将
<script>
元素放到页面最后,即</body>
标签前面,这样也可以使脚本在页面加载后解析运行
在现实当中延迟脚本不一定会按顺序执行,所以最好只包含一个延迟脚本
可以使用
<noscript>
在不支持脚本的浏览器中使用代替的内容,在启用了脚本的情况下,浏览器不会显示<noscript>
中的内容
第三章 基本概念
这一章内容很多很杂
3.1 语法
ECMAScript的语法大量借鉴了C以及其他类C语言,而且ECMAScript比它们更加宽松。
ECMAScript中的一切都区分大小写
3.2 关键字和保留字
debugger是ES5新增的关键字
ES6之后使用了let、class、import、const、super、extends,这些在ES5都是保留字
3.3 变量
ECMAScript中的变量可以保存任何类型的数据。
声明但未初始化的变量会保存一个特殊的值——undefined
var msg;
console.log(msg); // undefined
注意,用var
定义的变量将成为定义该变量作用域中的局部变量
如果在函数内使用var
定义一个变量,这个变量在函数退出后就会被销毁
function test(){
var msg = 'test';
}
test();
alert(msg); //error
3.4 数据类型
ECMAScript中有5种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number、String
还有一种复杂数据类型——Object
注意
Object
是复杂数据类型而不是简单数据类型
ECMAScript不支持自定义类型,所有值都是上面6种类型之一
使用typeof
操作符可以检测变量的数据类型,并返回一个字符串:
-
"undefined"
——如果这个值未定义 -
"boolean"
——如果这个值是布尔值 -
"string"
——如果这个值是字符串 -
"number"
——如果这个值是数值 -
"object"
——如果这个值是对象或null -
"function"
——如果这个值是函数
typeof
是操作符而不是函数,因此可以使用typeof(msg)
也可以使用typeof msg
typeof null
会返回"object"
,因为null
会被认为是一个空的对象引用
正则表达式现在会返回"object"
从技术角度讲,函数在ECMAScript中是对象不是数据类型,然而为了区分函数和其他对象,因此让
typeof
操作符返回"function"
Undefined
Undefined类型只有一个值,就是undefined
不需要显示地把一个变量初始化为undefined
,虽然我感觉没人这么傻
对于未声明的变量和未初始化的变量,typeof
都会返回"undefined"
显示地初始化变量便可以使用
typeof
来判断变量是否被声明
Null
Null类型也只有一个值,这个值为null
undefined
值派生自null
,因此会出现比较奇怪的情况
alert(null == undefined); //true
用严格等可以将它们区分开
alert(null === undefined); //false
推荐将准备保存对象的变量初始化为
null
Boolean
Boolean类型的字面值true
和false
是区分大小写的,True和False不是Boolean值
可以调用函数Boolean()
将其他值转换为Boolean类型,转换规则:
数据类型 | 转换为true | 转换为false |
---|---|---|
string | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 不存在 | undefined |
Number
除了以十进制表示,整数还可以通过八进制或十六进制的字面值来表示
其中八进制第一位必须是0,如果字面值中的数值超过了范围,该值将被当作十进制数值解析
var octalNum1 = 070; // 八进制的56
var octalNum2 = 079; // 无效 解析为79
var octalNum3 = 08; // 无效 解析为8
十六进制前两位必须为0x,字母A~F可以大写也可以小写
var hexNum1 = 0xA; // 十六进制的10
var hexNum2 = 0x1f; // 十六进制的31
在进行计算时,所有八进制和十六进制的数值最终都会被转换成十进制
八进制字面量在严格模式下会报错
浮点数小数点前面可以没有整数,但不推荐
var floatNum = .1; //有效,但不推荐
由于保存浮点数值需要的内存空间是保存整数的两倍,ECMAScript会尽量将浮点数转换为整数
var floatNum1 = 1.; // 小数点后没有数字 解析为1
var floatNum2 = 10.0; // 整数 解析为10
可以使用e表示法(科学计数法),e可以大写也可以小写
var floatNum = 1.125e7; // 等于11250000
浮点数的最高精度是17位小数,但在计算时其精度远远不如整数
例如,0.1+0.2的结果不是0.3而是0.30000000000000004
if (a + b == 0.3){ // 不要这么做
alert("a+b=0.3");
}
永远不要测试某个特定的浮点数值
ECMAScipt中的最小值保存在Number.MIN_VALUE
中,在大多数浏览器中为5e-324
最大值保存在Number.MAX_VALUE
中,在大多数浏览器中为1.7976931348623157e+308
如果某个数超出JavaScript数值范围,这个数将被转换成Infinity
,负数转换成-Infinity
可以使用isFinity
来确定一个数是不是有穷的
alert(isFinite(Number.MAX_VALUE + Number.MAX_VALUE)); // false
访问
Number.NEGATIVE_INFINITY
和Number.POSITIVE_INFINITY
也可以得到负和正的Infinity
NaN(Not a Number)是一个特殊的数值,表示本来要返回数值的操作数未返回数值的情况(不会抛出错误)
NaN有两个特点:
- 任何涉及
NaN
的操作都会返回NaN
-
NaN
与任何值都不想等,包括NaN
本身
isNaN()
函数可以帮我们确定一个数是否“不是数值”,非数值类型会先转换为数值类型再判定
alert(isNaN(10)); // false
alert(isNaN("10")); // false
alert(isNaN("blue")); // true(不能转换为数值)
alert(isNaN(true)); // false
有三个函数可以把非数值转换为数值:Number()
、parseInt()
和parseFloat()
Number()
在转换字符串时比较复杂而且不够合理,因此在处理整数时常用的是parseInt()
函数
var num1 = Number("hello"); // NaN
var num2 = Number("66hello"); // NaN
var num3 = Number("070"); // 70
var num4 = Number(""); // 0
var num5 = Number("0xA"); // 10 解析为16进制
var num6 = parseInt("hello"); // NaN
var num7 = parseInt("66hello"); // 66
var num8 = parseInt("070"); // 70 ES3会理解为8进制,ES5之后会忽略前导0解析为10进制
var num9 = parseInt(""); // NaN
var num10 = parseInt(22.5); // 22
var num11 = parseInt("0xA"); // 10
为了消除parseInt()
函数可能导致的困惑,可以提供第二个参数,指定转换使用的基数(即多少进制)
var num1 = parseInt("0xAF", 16); // 175
var num2 = parseInt("AF", 16); // 175
var num3 = parseInt("AF"); // NaN
推荐在任何时候都指定转换使用的基数,一般情况下为10
而parseFloat()
会始终忽略前导0
var num1 = parseFloat("1234blue"); // 1234
var num2 = parseFloat("0xA"); // 10
var num3 = parseFloat("22.5"); // 22.5
var num3 = parseFloat("22.34.5"); // 22.34
var num3 = parseFloat("0908.5"); // 908.5
var num3 = parseFloat("3.125e7"); // 31250000
能解析为整数的数parseFloat()
会返回整数
String
字符串可以用双引号""
可以用单引号''
表示
ECMAScript中的字符串是不可变的,一旦创建值就不能改变
如果要改变某个变量保存的字符串,要先销毁原来的字符串,然后再用一个包含新值的字符串填充该变量
var lang = "Java";
lang = lang + "Script";
在实现第二行代码时,操作过程如下:
- 首先创建一个能容纳10个字符的新字符串
- 然后在这个字符串中填充"Java"和"Script"
- 销毁原来的字符串"Java"和字符串"Script"
可以使用toString()
方法来把一个值转换为字符串
var age = 11;
var ageString = age.toString(); // "11"
var found = true;
var foundAsString = found.toString(); // "true"
null
和undefined
没有toString()
方法
再调用数值的toString()
方法时可以传入一个参数来决定输出数值的基数
如果值可能是null
和undefined
,还可以使用String()
函数
- 如果值有
toString()
方法则使用该方法 - 如果是
null
则返回"null"
- 如果是
undefined
则返回"undefined"
Object
对象可以通过执行new
操作符后跟要创建的对象类型的名称来创建
在ECMAScript中,Object类型是所有其它实例的基础,即Object类型具有的方法和属性也同样存在于更具体的对象中
Object的每个实例都具有下列属性和方法:
-
constructor
:保存着构造函数 -
hasOwnProperty(propertyName)
:检查属性在当前对象实例(而不是原型)中是否存在 -
isPrototypeOf(object)
:检查传入的对象是否为当前对象的原型 -
propertyIsEnumerable(propertyName)
:检查给定的属性是否能使用for-in语句枚举 -
toLocaleString()
:返回对象的字符串表示,该字符串与执行环境的地区对应 -
toString()
:返回对象的字符串 -
valueOf()
:返回对象的字符串、数值或布尔值表示,通常与toString()
方法的返回值相同
ECMA-262中对象的行为不一定适用于JavaScript中的其他对象,比如BOM和DOM都属于浏览器中的宿主对象,不一定继承Object
第三章还有一些东西 留到下次再整理