What Is JavaScript?
JavaScript in HTML
- 使用
src
属性的<script>
元素内不能包含其他js代码,包含的话也不会被执行。 - 引用外部脚本时要确保其来源可信。
- 在不使用
defer
和async
属性的前提下,script
元素按其在页面中出现的顺序被执行。 - 实际中延迟脚本并不总是按顺序执行,因此如果可能的话最好仅使用一个延迟脚本。
- 在HTML5中
defer
和async
属性都仅支持外部脚本。 - 部分较老的浏览器并不支持
defer
属性,因此最好还是将需要延迟执行的脚本放在页面末尾。 - 异步脚本无法保证按其出现的顺序执行,页面加载时也无需等待异步脚本下载和执行,因此异步脚本中最好不要包含对DOM的操作。
Language Basics
语句末尾可以省略分号,但并不推荐。
控制语句中最好使用代码块,即使只有一行。
在ES3中,使用关键字会引起
Identifi er Expected
错误,而使用保留字可能会也可能不会引起上述错误,具体取决于所使用的解析引擎。在ES5中,关键字和保留字可以被用作对象的属性名,但考虑到兼容问题并不推荐。
尽管改变变量的数据类型是合法的,但并不推荐。
代码块内并不被视为局部作用域,因此在代码块内声明的变量是全局变量而不是局部变量。
在函数内可以通过省略
var
简单地定义一个全局变量,但并不推荐,因为局部定义的全局变量很难维护,而且在严格模式下上述操作会引起ReferenceError
。尽管换行和缩进并不是必要的,但采用如下方式定义多个变量可增加可读性:
1
2
3var message = "hi",
found = false,
age = 29;typeof
是一个操作符而不是函数,因此并不需要括号,当然用了也可以。ES中的函数被视为对象,但由于其相比于一般的对象确实多了一些特殊的属性,因此使用
typeof
将其区分开是必要的。无论对于未定义变量还是为初始化变量,
typeof
总是返回undefined
。因此,推荐总是在定义变量的同时将其初始化,以便明确到底是为定义变量还是未初始化变量。NULL
值是一个空的对象指针。在进行算术运算时八进制和十六进制数字均被视为十进制数字。
NaN
的含义是“Not a Number”,在ES中任何数除以0均会得到NaN
,以允许其他代码继续执行。任何包含NaN
的运算均会返回NaN
。NaN
不等于任何值,包括其自身。在调用
paseInt
时最好指定基数。paseFloat
只解析十进制数字,因此没有基数模式。JavaScript使用UTF-16编码,所以
length
返回的是字符串中16位字符的数目,而这有可能与字符串中实际字符的数目不符。和Java一样,JS中的字符串同样是不可变的,一旦创建后便无法修改。
++
和--
适用于任何数据类型,包括浮点数,布尔值,字符串和对象,而不仅仅是整数。一元加号应用于非数字值时,作用相当于
Number()
,即将其转换为数字。一元减号类似,只是在转换为数字后还将其变为负数。在ES中使用位运算时,64位数字会被转换为32位数字,执行位运算之后32位结果再被存回64位数字。这使得ES中位运算的工作方式与其他语言类似,而这种转换的一个奇怪的副作用是,在位运算中
NaN
和Infinity
都被视为0。逻辑右移,移走的位填充为0;算术右移,移走的位填充与符号位有关,例如如果为负数,则移走的位填充为1。在C语言中,无符号数执行的所有移位操作都是逻辑的,而对于有符号数,采用哪种方式取决于编译器。算术左移和逻辑左移是相同的,而算术右移和逻辑右移,取决于符号位。在ES中,有符号右移和无符号右移分别用
>>
和>>>
表示。有符号右移把32位数字中的所有数位整体右移,同时保留该数的符号(即相当于符号位不参与移位操作),移位后用符号位的值填充空位,类似于算术右移。无符号右移将无符号32位数的所有数位整体右移,并用0填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理,类似于逻辑右移。
Variables, Scope, and Memory
引用值实际上是一个指向储存在堆中的对象的指针,当它被复制到另一个变量时,两个变量便都指向同一个对象,因此两个变量的变化将会保持同步。
ES中函数的参数都是通过值来传递,即传值而非传引用。当被传递的变量是对象时,传递的虽然是指向该对象的指针,但指针仍是值,而不是引用,只是将指针赋值给了一个作为参数的局部变量而已。可将ES中的函数参数视为局部变量。
1
2
3
4
5
6
7
8function 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’;
*