Professional JavaScript for Web Developers 阅读笔记

What Is JavaScript?

JavaScript in HTML

  • 使用src属性的<script>元素内不能包含其他js代码,包含的话也不会被执行。
  • 引用外部脚本时要确保其来源可信。
  • 在不使用deferasync属性的前提下,script元素按其在页面中出现的顺序被执行。
  • 实际中延迟脚本并不总是按顺序执行,因此如果可能的话最好仅使用一个延迟脚本。
  • 在HTML5中deferasync属性都仅支持外部脚本。
  • 部分较老的浏览器并不支持defer属性,因此最好还是将需要延迟执行的脚本放在页面末尾。
  • 异步脚本无法保证按其出现的顺序执行,页面加载时也无需等待异步脚本下载和执行,因此异步脚本中最好不要包含对DOM的操作。

Language Basics

  • 语句末尾可以省略分号,但并不推荐。

  • 控制语句中最好使用代码块,即使只有一行。

  • 在ES3中,使用关键字会引起Identifi er Expected错误,而使用保留字可能会也可能不会引起上述错误,具体取决于所使用的解析引擎。

  • 在ES5中,关键字和保留字可以被用作对象的属性名,但考虑到兼容问题并不推荐。

  • 尽管改变变量的数据类型是合法的,但并不推荐。

  • 代码块内并不被视为局部作用域,因此在代码块内声明的变量是全局变量而不是局部变量。

  • 在函数内可以通过省略var简单地定义一个全局变量,但并不推荐,因为局部定义的全局变量很难维护,而且在严格模式下上述操作会引起ReferenceError

  • 尽管换行和缩进并不是必要的,但采用如下方式定义多个变量可增加可读性:

    1
    2
    3
    var message = "hi",
    found = false,
    age = 29;
  • typeof是一个操作符而不是函数,因此并不需要括号,当然用了也可以。

  • ES中的函数被视为对象,但由于其相比于一般的对象确实多了一些特殊的属性,因此使用typeof将其区分开是必要的。

  • 无论对于未定义变量还是为初始化变量,typeof总是返回undefined。因此,推荐总是在定义变量的同时将其初始化,以便明确到底是为定义变量还是未初始化变量。

  • NULL值是一个空的对象指针。

  • 在进行算术运算时八进制和十六进制数字均被视为十进制数字。

  • NaN的含义是“Not a Number”,在ES中任何数除以0均会得到NaN,以允许其他代码继续执行。任何包含NaN的运算均会返回NaNNaN不等于任何值,包括其自身。

  • 在调用paseInt时最好指定基数。

  • paseFloat只解析十进制数字,因此没有基数模式。

  • JavaScript使用UTF-16编码,所以length返回的是字符串中16位字符的数目,而这有可能与字符串中实际字符的数目不符。

  • 和Java一样,JS中的字符串同样是不可变的,一旦创建后便无法修改。

  • ++--适用于任何数据类型,包括浮点数,布尔值,字符串和对象,而不仅仅是整数。

  • 一元加号应用于非数字值时,作用相当于Number(),即将其转换为数字。一元减号类似,只是在转换为数字后还将其变为负数。

  • 在ES中使用位运算时,64位数字会被转换为32位数字,执行位运算之后32位结果再被存回64位数字。这使得ES中位运算的工作方式与其他语言类似,而这种转换的一个奇怪的副作用是,在位运算中NaNInfinity都被视为0。

  • 逻辑右移,移走的位填充为0;算术右移,移走的位填充与符号位有关,例如如果为负数,则移走的位填充为1。在C语言中,无符号数执行的所有移位操作都是逻辑的,而对于有符号数,采用哪种方式取决于编译器。算术左移和逻辑左移是相同的,而算术右移和逻辑右移,取决于符号位。在ES中,有符号右移和无符号右移分别用>>>>>表示。有符号右移把32位数字中的所有数位整体右移,同时保留该数的符号(即相当于符号位不参与移位操作),移位后用符号位的值填充空位,类似于算术右移。无符号右移将无符号32位数的所有数位整体右移,并用0填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理,类似于逻辑右移。

Variables, Scope, and Memory

  • 引用值实际上是一个指向储存在堆中的对象的指针,当它被复制到另一个变量时,两个变量便都指向同一个对象,因此两个变量的变化将会保持同步。

  • ES中函数的参数都是通过值来传递,即传值而非传引用。当被传递的变量是对象时,传递的虽然是指向该对象的指针,但指针仍是值,而不是引用,只是将指针赋值给了一个作为参数的局部变量而已。可将ES中的函数参数视为局部变量。

    1
    2
    3
    4
    5
    6
    7
    8
    function setName(obj) {
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
    }
    var person = new Object();
    setName(person);
    alert(person.name); //"Nicholas"

font-family: ‘Noto Serif SC’;

*

Powered by Hexo | Theme Hiker

Copyright © 2019 - 2021 Jingwang Li

UV : | PV :