前言
虽然一直都在用js,没有正经看过几本js的书。久仰红宝书大名(《JavaScript高级程序设计》),这段时间有空,每天坚持看一点。在此记录下一些阅读笔记。
为了方便阅读与检索,所有笔记也是按红宝书的章节顺序来。
第一章 JavaScript简介
这一章没有什么特别要记录的,主要是介绍了一下JavaScript,有兴趣可以看一下。
第二章 在HTML中使用JavaScript
这章也没有什么要记录的,在html中使用JavaScript已经是家常便饭的事了。还有一些如Cdata这样的历史遗留问题,由于浏览器越来越规范,这些问题终究会淡去,稍作了解即可。
第三章 基本概念
1. isNaN() 检测对象
在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值调用toString()方法,在测试返回值。
以上是红宝书中的原话,有个地方需要纠正一下,“则基于这个返回值调用toString()方法”,这里应该是基于原对象继续调用toString()方法。
isNaN()检测对象并不常用,这里做个简单记录,稍作了解即可。但是对象的这种转换形式很常见,先调用valueOf,再调用toString。在之后的 "==" 中也会提到。
2. Number、parseInt 和 parseFloat (数值转换)
2.1 Number() 函数转换规则
- true和false分别转换为1和0
- 如果是数值,原样返回
- 如果是null,返回0
- 如果是undefined,返回NaN
- 如果是字符串,遵循下列规则:
- 如果字符串只包含数字(包括整数和小数,开头可以有加号和减号,数值前后可以包含空格),则转化为十进制数值(前导0将被忽略,小数后面的0会被忽略):
Number('+1') // 1 Number('1') // 1 Number(' 1 ') // 1 数值前后可以包含空隔 Number('1 1') // NaN 数字间包含空格会被转换为NaN Number('-1') // -1 Number('010') // 10 Number('00.10') // 0.1 Number('.1') // 0.1 Number('0.1.1') // NaN 多个小数点将被转换NaN
- 如果字符串,是有效的十六进制,例如"0xf",会被转换为相应的十进制整数
- 如果字符串是空,则转换为0
- 如果字符串包含除上述格式之外的字符,贼将转换为NaN。
- 如果是对象,先调用对象的valueOf()方法,然后依照漆面的规则转换返回的值。如果转换结果为NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串。
2.2 parseInt() 函数转换规则
- 空字符串,true,false,null,undefined 皆返回NaN
- 如果是整数,原样返回
- 如果是小数,只截取整数部分
parseInt(1.9) // 1
- parseInt解析字符串与Number相似,但是parseInt会从左到右解析所有数字字符,直到遇到非数字字符。
// parseInt和Number转换字符比较
// 都为整数时相同
parseInt('1') // 1
Number('1') // 1
// 小数
parseInt('1.1') // 1
Number('1.1') // 1.1
// 数字后带字符
parseInt('1a1') // 1
Number('1a1') // NaN
// 数字前带字符
parseInt('a1') // NaN
Number('a1') // NaN
// 忽略前后空格
parseInt(' 1 ') // 1
Number(' 1 ') // 1
// 数字中间带空格
parseInt('1 1') // 1
Number('1 1') // NaN
- parseInt对象的转换,与Number相同
parseInt包含第二个参数,该参数表示待转换数值的进制
parseInt('10', 2) // 2
parseInt('10', 8) // 8
parseInt('10', 10) // 10
parseInt('10', 16) // 16
2.3 parseFloat() 函数转换规则
与parseInt()函数类似,parseFloat()也是第一个字符(位置0)开始解析每个字符。而且也是一直即系到字符串末尾,或者解析到遇见一个无效的浮点数字符为止。也就是说字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,"22.34.5"将会被转换为22.34。
parseFloat()可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但是十六进制格式的字符串始终会被转换成0.由于parseFloat()只解析十进制值,英雌它没有用第二个参数指定基数的用法。最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),parseFloat()会返回整数。
parseFloat('1234blue') // 1234
parseFloat('0xA') // 0
parseFloat('22.5') // 22.5
parseFloat('22.34.5') // 22.34
parseFloat('0908.5') // 0908.5
parseFloat('3.125e7') // 31250000
2.4 总结
这3个方法平时比较常用,在看红宝书之前也没有考虑过这么多。虽然看上去复杂,但是平时用的多的话也就习惯于自然,记不起就测试一下。这些规则也就稍作了解,留个印象即可。
3. toString()和String()
这两个方法主要区别是,toString不能用于null和undefined,否则会报错。而String()可以将null转换为"null",将undefined转换为"undefined"。
4. 位运算相关操作
位运算一直都是一知半解,当初上课没有好好听。主要还是平时用不太到,到至今还是一知半解的状态。这次好好看了一下红宝书的位运算,算是又帮助复习了一遍。
5. 关系操作符
变量比较时的自动转换,一直令人比较诟病的地方吧。对于这方面可以稍作了解,但是尽量不要尝试去用这些特性。比如用数字类型和对象类型做比较,你明确知道对象类型会进行转换,你也尽量不要用。手动将不同的类型转化为同类型后再做比较。还有就是尽量用 === 和 !== ,不要用 == 和 !=
6. switch的case
算是一个一直忽略的小知识吧,switch的case是全等比较。