基本概念
(本书)推荐使用分号
推荐在控制语句中完全使用代码块
创建全局变量
省略 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
:
空字符串(
""
)0
、NaN
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 ,则会转为
1
或0
。如果是
null
,返回0
。如果是
undefined
,返回NaN
。如果是字符串,
八进制前缀可能会不被判定 。
空字符串转为
0
。无法转换则为
NaN
。
parseInt()
会从第一个非空字符进行识别,如果第一个字符不代表数值,则返回 NaN
。比如 parseInt("1234blue")
会转为 1234
。
parseInt()
会识别所有进制前缀,而 parseFloat()
会忽略所有前导零。
明确进制转换:parseInt(value, radix)
。
String
使用 length
属性获得字符串长度 。
几乎每个值都有 toString()
方法,同时,可以明确进制:toString(radix)
。
String()
函数能将所有类型转为字符串,包括 null
和 undefined
。
赋值
需要注意的是,在赋值语句也有返回值,返回的是值:
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 没有函数重载,如果同函数被定义多次,后定义的函数会覆盖先定义的函数。