第一章 JavaScript简介
- ES6之后,使用新语言特性会隐式触发严格模式,例如,如果使用ES6的class关键字或者创建ES6模块、类和模块中的所有代码都会自动切换到严格模式。
- 要尝试少量的JavaScript代码,最简单的方式就是打开浏览器的Web开发者工具。
- 尝试JavsScript代码的另一种方式是下载并安装Node。
第二章 词法结构
- 数字不能作为第一个字符,以便Javascript区分标识符和数值。
第三章 类型、值和变量
3.1 概述和定义
- JavaScript与静态语言更大的区别在于,函数和类不仅仅是语言的特性,他们本身就是可以被Javascript程序操作的值。与其他JavaScript非原始值一样,函数和类也是特殊的对象。
- JavaScript的对象类型是可修改的,而它的原始类型是不可修改的。
3.2 数值
- 浮点字面量可以包含小数点,它们对实数使用传统语法,实数值由数值的整数部分,小数点和数值的小鼠部分组成。
- 非数值在Javascript中有一个不同寻常的特性,它和任何值比较都不相等,也不等于自己。
- Javascript数值有足够大的精度,能够非常近似地表示0.1,但是无法精确地表示。
3.3 文本
- // 写在一行但表示两行的字符串
'two\nlines'// 写在三行但只有一行的字符串'one\ long\ line'// 写在两行实际也是两行的字符串'the newline character at the end of this line is included literally in this string' - 可以使用标准的全等 === 和不全等!== 操作符比较字符串。只有当这个字符串具有完全相同的16位值得序列时才相等。字符串也可以使用<、<=、>和>=操作符来比较。字符串比较是通过比较16位值完成得。
- JavaScript中的字符串是不可修改的。
- 字符串也可以被当成只读数组,使用方括号而非charAt()方法访问字符串中个别的字符。
- 板字符串有一个强大但不太常用的特性:如果在开头的反引号前面有一个函数名,那么模板字面量中的文本和表达式的值将作为参数传给这个函数。
3.4 布尔值
if(o!==null)...
if(o)...
第一种情况下,if语句的主体只有在o不是null时才会被执行。第二种情况没那么严格,只要o不是false或任何其他假性值(如null或undefined),if语句的主体就会执行。哪种if语句适合你的程序取决于你期待o中保存的什么值,如果需要区分null和0、"",那么就应该使用比较表达式。
3.5 null与undefined
-
null是一个语言关键字,求值为一个特殊值,通常用于表示某个值不存在。对null使用typeof操作符返回字符串"object",表明可以将null看成一种特殊对象,表示“没有对象”。但在实践中,null通常被当作它自己类型的唯一成员,可以用来表示数值,字符串以及对象“没有值”。多数编程语言都有一个与JavaScript的null等价的值,比如NULL、nil或None。
-
变量的值未经初始化时就是undefined,在查询不存在的对象属性或数组元素时也会得到undefined。另外,没有明确返回值的函数返回的值是undefined。对undefined应用typeof操作符会返回'undefined',表示这个值是该特殊类型的唯一成员。
3.7 全局对象
-
全局对象的属性是全局性定义的标识符,可以在JavaScript解释器启动后(或者每次浏览器加载新页面时),都会创建一个新的全局对象并为其添加一组初始的属性(比如undefined、Infinity和NaN等)。
-
全局对象有一个名为global的属性,其值为全局对象本身,因此在Node程序中始终可以通过global来引用全局对象。
-
在浏览器中,Window对象对浏览器窗口中的所有JavaScript代码而言,充当了全局对象的角色。
3.8 不可修改的原始值与可修改的对象引用
- JavaScript中原始值(undefined、null、布尔值、数值和字符串)与对象(包括数组和函数)有一个本质的区别。原始值是不可修改的,即没有办法改变原始值,对于数值和布尔值,这一点很好理解。对象不同于原始值,对象是可以修改的,即他们的值可以改变。
3.9 类型转换
- 这种包装对象是早期JavaScript的历史遗存,已经没有必要再使用他们了。
3.9.3 对象到原始值转换
- JavaScript内置类型除了Date类都实现了偏数值算法。Date类实现了偏字符串算法。
3.10 变量声明与赋值
1.声明变量的同时(如果可能)也为其赋予一个初始值是个好的编程习惯。
2.声明常量的一个常见(但也非常普遍性)的约定是全部字母大写,如H0或HTTP_NOT_FOUND,以区别于变量。
3.一种论调是只在值基本不会改变的情况下使用const,比如物理常数,程序版本号,或用于标识文件类型的字节序。另一种论调认为程序中很多所谓的变量实际上再程序运行时并不会改变,因此,全部使用const,发现需要改变再使用let,笔者倾向于第一种思路。
4.在函数体外部使用var,会声明一个全局变量。使用var多次声明同名变量是合法的,因为变量具有函数作用域而不是块作用域,这种重新声明其实是很常见的。
5.var声明最不同寻常的特性是作用域提升。