跳到主要内容

基本概念

(本书)推荐使用分号

推荐在控制语句中完全使用代码块

创建全局变量

省略 var 创建一个全局变量

function test() {
message = "hi"
}

test()
alert(message)

数据类型

五种基本数据类型:

  • Undefined

  • Null

  • Boolean

  • Number

  • String

可以用 typeof 来获取值类型:

var message = "some string"
alert(typeof message)
alert(typeof(message))
alert(typeof 95)

Undefined

Undefined 只有一种值:undefined ,表示未初始化。

没有声明一个变量而去使用会产生错误,而不是使用 undefined 值。

但是使用 typeof 获取未声明的变量会返回 undefined

Null

Null 只有一种值:null ,表示一个空对象指针。

使用 typeof 检测 null 值会返回 "object"

实际上 undefined 派生于 null 值,所以 null == undefined 返回 true

Boolean

不推荐拿 Boolean 值和数字比较。

可以用 Boolean() 来将其他类型的值转为 Boolean 。

以下值可以转为 true

  • 非空字符串

  • 非零数值、无穷大

  • 任何对象

以下值可以转为 false

  • 空字符串(""

  • 0NaN

  • null

  • undefined

在控制语句中,条件语句会自动把值转为 Boolean 。

Number

谨慎浮点数比较,比如:a + b == 0.3

最大值为 Number.MAX_VALUE ,最小值为 Number.MIN_VALUE 。如果超出了表示范围,JS 会转为 ±Infinity ,该值不能参与计算。

在 JS 中,产生 NaN 的运算不会报错 。NaN 不等于任何值,包括自身。

可以用 isNaN() 来检测一个值是否是数值,或者是否能转为数值( Boolean 类型可以转为数值)。isNaN() 可以用于对象,他会依次尝试使用对象的 valueOf()toString() 返回值。

可以用 Number()parseInt()parseFloat() 将其他类型的值转为数值。

对于 Number()

  • 如果是 Boolean ,则会转为 10

  • 如果是 null,返回 0

  • 如果是 undefined ,返回 NaN

  • 如果是字符串,

    • 八进制前缀可能会不被判定 。

    • 空字符串转为 0

    • 无法转换则为 NaN

parseInt() 会从第一个非空字符进行识别,如果第一个字符不代表数值,则返回 NaN 。比如 parseInt("1234blue") 会转为 1234

parseInt() 会识别所有进制前缀,而 parseFloat() 会忽略所有前导零。

明确进制转换:parseInt(value, radix)

String

使用 length 属性获得字符串长度 。

几乎每个值都有 toString() 方法,同时,可以明确进制:toString(radix)

String() 函数能将所有类型转为字符串,包括 nullundefined

赋值

需要注意的是,在赋值语句也有返回值,返回的是值:

var i = 0
alert(i = 5) // 5

减法

Infinity - Infinity 等于 NaN-Infinity 也一样。

Infinity - (-Infinity) 等于 Infinity

全等和不全等

使用 == 符号,JS 会先尝试能否将一个值转为另一个值的类型:

var result = ("55" == 55)   // true

使用 === 符号,两个值要求完全相等,比如:

null == undefined   // true
null === undefined // false

!== 为不全等符号 。

for 语句

在循环内部定义的变量也可以在外部访问到,因为 JS 不存在块级作用域。

for-in 语句

因为 js 中对象的属性没有顺序,所以 for-in 迭代的顺序是不可预测的,且受不同浏览器影响。

使用 for-in 要确保迭代对象不为 null 或者 undefined

label 语句

JS 支持 label 语句,可以在明确的循环位置进行 break 或者 continue

loop1:
for (var i = 0; i < 10; i += 1) {
for (var j = 0; j < 5; j += 1) {
if (...) {
break loop1
}
...
}
}

switch 语句

在 switch 中使用的是全等操作符(===),而不是相等(==)。

函数无返回值

无指定返回值的函数会返回 undefined

函数参数

JS 的函数的所有参数被封装在 arguments 数组中。函数的参数声明是为了提供使用便利 。

对于任何函数,在实参中,参数个数和参数类型都是随意的。

arguments 数组元素的值和参数的值是完全一致且同步的。如果 arguments 无法分配到所有参数,未分配的参数会被定义为 undefiend 。

函数重载

JS 没有函数重载,如果同函数被定义多次,后定义的函数会覆盖先定义的函数。