一、语法
1.1 区分大小写
在JS
中一切(变量、函数名和操作符)都是区分大小写的。
1.2 标识符
标识符可以是按照下列格式规则组合起来的一个或多个字符:
- 第一个字符必须是一个字母、下划线或一个美元符号
- 其他字符可以是字母、下划线、美元符号或数字。
二、变量
定义变量时要使用var
操作符:
var message;
这里定义了一个变量,该变量可以保存任何值(像这样未经过初始化的变量,会保存一个特殊的值——undefined
),在定义的时候如果不使用var
操作符,那么定义的新变量将是全局变量。
三、数据类型
在ECMAScript
中有五种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number
和String
。还有一种复杂的数据类型——Object
,其本质上是由一组无序的名值对组成的。
3.1 typeof操作符
这里typeof
是用于检测数据类型,对一个值使用typeof
操作符可能返回下列某个字符串:
- “
undefined
”——如果这个值未定义 - “
boolean
”——如果这个值是布尔值 - “
string
”——如果这个值是字符串 - “
number
”——如果这个值是数值 - “
object
”——如果这个值是对象或null
- “
function
”——如果这个值是函数
3.2 Undefined类型
Undefined
类型只有一个值,即特殊的 undefined
,使用var
声明变量但未对其加以初始化时,这个变量的值就是undefined
。
包含undefined
值的变量与尚未定义的变量是不一样的:
var message;
//下面这个变量并没有声明
//var age;
console.log(message);//undefined
console.log(age);//产生错误
注意:对未初始化的变量执行typeof
操作符会返回undefined
值,而对未声明的变量执行typeof
操作符同样会返回undefined
值。
3.3 Null类型
Null
类型是第二个只有一个值的数据类型,这个特殊的值就是null
。使用typeof
操作符检测null
会返回“object
”。如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null
,而不是其他值。这样,只要检查null
值就可以知道相应的变量是否已经保存了一个对象的引用。
if(car != null){
//对car对象执行某些操作
}
实际上,undefined
值是派生自null
值的,所以它们是相等的:
alert(null == undefined);//true
3.4 Boolean类型
该类型有两个字面值:true
和false
(不等同于1、0
)。虽然此类型的字面值只有两个,但ECMAScript
中所有类型的值都有与这两个值等价的值,要将一个值转换为其对应的Boolean
值,可以调用转型函数Boolean()
:
var message = "Hello";
var messageAsBoolean = Boolean(message);
下表给出了各种数据类型及其对应的转换规则:
数据类型 | 转换为true 的值 |
转换为false 的值 |
---|---|---|
Boolean |
true |
false |
String |
任何非空字符串 |
"" (空字符串) |
Number |
任何非零数字值 |
0 和NaN
|
Object |
任何对象 | null |
Undefined |
不适用 | undefined |
这些转换规则对理解流控制语句(如if
语句)自动执行相应的Boolean
转换非常重要:
var message = "Hello";
if(message){//自动转型
alert("Value if true");
}
3.5 Number类型
var intNum = 10;//整数
var octalNum1 = 070;//八进制的56
var octalNum2 = 079;//无效八进制——解析为79
var octalNum3 = 08;//无效八进制——解析为8
var hexNum1 = 0xA;//十六进制的10
var hexNum2 = 0x1f;//十六进制的31
3.5.1浮点值
所谓浮点值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但不推荐这种写法。
var floatNum1 = 1.1;
var floatNum2 = 01;
var floatNum3 = .1;//不推荐
由于保存浮点值需要的内存空间是保存整数值的两倍,因此ECMAScript
会不失时机地将浮点值转换为整数值:
var floatNum1 = 1.;//小数点后面没有数字——解析为1
var floatNum2 = 10.0;//整数——解析为10
浮点值的最高精度是17
位小数,但在进行算术时其精度远远不如整数,如0.1
加0.2
的结果不是0.3
,而是0.30000000004
。
if(a + b == 0.3){
//不要这样做
}
3.5.2 数值范围
由于内存限制,ECMAScript
能够表示的最小数值保存在Number.MIN_VALUE
中,能表示的最大值保存在Number.MAX_VALUE
中。如果某次计算的结果得到了一个超出JS
数值范围的值,那么这个数值将被自动转成特殊的Infinity
值。具体来说,如果这个数值是负数,则会被转换成-Infinity
(负无穷),否则将被转换成Infinity
(正无穷)。
如果某个值是Infinity
(正或负),那么该值将无法继续参与下一次计算。可以使用isFinite()
函数来判断某个值是否是有穷的(如果是有穷则返回true
)。访问Number.NEGATIVE_INFINITY
和Number.POSITIVE_INFINITY
也可以得到负和正Infinity
的值。
3.5.3 NaN
-
这个值是一个非数值,是一个特殊的数值,这个数值用于一个本来要返回数值的操作数未返回数值的情况。零除以零返回
NaN
,整数除以零返回Infinity
,负数除以零返回-Infinity
。 -
NaN
本身有两个特点:首先,任何涉及NaN
的操作都会返回NaN
,这个特点在多步计算中有可能导致问题。其次,NaN
与任何值都不相等,包括NaN
本身。这里可以使用isNaN()
函数帮助我们确定这个参数是否“不是数值”。此函数在接收到一个数值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,如字符串或布尔值。而任何不能被转换为数值的值都会导致这个函数返回true
。
alert(isNaN(NaN));//true
alert(isNaN(10));//false(10是一个数值)
alert(isNaN("10"));//false(可以被转换成10)
alert(isNaN("blue"));//true(不能转换成数值)
alert(isNaN(true));//false(可以被转换成1)
alert(isNaN(false));//false(可以被转换成0)
说明:此方法确实也适用于对象,在后面进行说明。
3.5.4 数值转换
有三个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()
。第一个函数,即转型函数Number()
可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。三个函数对于同样的输入会有不同的结果。
1、Number()
函数的转换规则
- 如果是
Boolean
值,true
和false
分别被转换为1
和0
- 如果是数字值,只是简单的传入和返回
- 如果是
null
值,返回0
- 如果是
undefined
,返回NaN
- 如果是字符串,遵循下列规则
- 如果字符串中只包含数字(包括带正号或负号的情况),则将其转换为十进制数值。如
“123”
转换为123
,“011”
转换为11
(前导零被忽略) - 如果字符串中包含有效的浮点格式,如
“1.1”
,则将其转换为对应的浮点值(也会忽略前导零) - 如果字符串中包含有效的十六进制格式,如
“0xf”
,则将其转换为相同大小的十进制整数值 - 如果字符串是空的(不包含任何字符),则将其转换为零
- 如果字符串中包含除上述格式之外的字符,转换为
NaN
- 如果字符串中只包含数字(包括带正号或负号的情况),则将其转换为十进制数值。如
- 如果是对象,则调用对象的
valueOf()
方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN
,则调用对象的toString()
,然后再次依照前面的规则转换返回的字符串值。
2、parseInt()
函数的转换规则
由于Number()
函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt()
函数。此函数在处理字符串时,会忽略字符串前面的空格,直至找到一个非空字符。如果第一个字符不是数字字符或负号,此函数会返回NaN
。也就是说,此函数转换空字符串会返回NaN
(Number()
对空字符返回零)。如果第一个字符是数字字符,此函数会继续解析第二个字符,直到解析完所有的后续字符或者遇到了一个非数字字符。如“123blue”
会被转换为123
,“22.5”、“22.1”
都会被转换为22
。如果字符串中第一个字符是数字字符,此函数能够是被出各种整数的格式。
var num1 = parseInt("123blue");//123
var num2 = parseInt("");//NaN
var num3 = parseInt("0xA");//10
var num4 = parseInt("22.5");//22
var num5 = parseInt("070");//56
var num6 = parseInt("70");//70
说明:在ECMAScript 5
和3
中此函数对八进制的解析存在分歧:
var num7 = parseInt("070");//ECMAScript 3认为是56,ECMAScript 5认为是70
也就是说,ECMAScript 5
中,此函数已经不具有解析八进制的能力。针对这种情况,我们推荐指定基数,即指定使用哪种格式(进制)解析:
var num1 = parseInt("AF", 16);//175
var num2 = parseInt("AF");//NaN
3、parseFloat()
函数的解析规则
与parseInt()
函数类似,此函数也是从第一个字符开始解析每个字符。也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。字符串中的第一个小数点是有效的,而后面多余的小数点就是无效的了,于是,后面的字符串将被忽略。如“22.5.6”
将被转换为22.5
。除了第一个小数点有效之外,此函数与parseInt()
的第二个区别在于它始终都会忽略前导的零。此函数可以识别前面讨论过的所有的浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串则始终会被转换为零。由于此函数值解析十进制值,因此它没有第二个参数用来指定基数的用法。如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),此函数会返回整数。
var num1 = parseFloat("123blue");//123
var num2 = parseFloat("0xA");//0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.5.3");//22.5
var num5 = parseFloat("0908.5");//908.5
var num6 = parseFloat("3.125e7");//31250000
3.6 String类型
字符串可以由双引号或单引号表示,但是左右引号必须匹配。
3.6.1 字符字面量
String
数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。
字面量 | 含义 |
---|---|
\n |
换行 |
\t |
制表 |
\b |
空格 |
\r |
回车 |
\f |
进纸 |
\\ \\ |
斜杠 |
\' |
单引号 |
\" |
双引号 |
\xnn |
以十六进制代码nn 表示的一个字符(其中n 为0~F )。例如\x41 表示“A”
|
\unnnn |
以十六进制代码nnnn 表示的一个Unicode 字符(其中n 为0~F )。如\u03a3 表示希腊字符Σ
|
这些字面量可以出现在字符串中的任意位置,而且被当作一个字符来解析。
3.6.2 字符串的特点
在ECMAScript
中,字符串是不可变的,即字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后用另一个包含新值的字符串填充该变量。
var lang = "Java";
lang = lang + "Script";
说明:上述代码的执行过程是,首先创建一个能容纳十个字符的新字符串,然后在这个字符串中填充“Java”
和“Script”
,最后异步是销毁原来的字符串“Java”
和“Script”
,因为这两个字符串已经没用了,这个过程是在后台发生的,这也是旧版本浏览器中拼接字符串很慢的原因,现在已经解决了。
3.6.3 转换为字符串
要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()
方法。
var age = 11;
var ageAsString = age.toString();//"11"
var found = true;
var foundAsString = found.toString();//"true"
数值、布尔值、对象和字符串值(字符串使用此方法返回其本身的一个副本)都有toString()
。但null
和undefined
值没有这个方法。在多数情况下,调用此方法不用传递参数,但是在将数字转换为字符串时,可以传入相关的基数,而输出的字符串可以是某个值的八进制、十进制(默认)、十六进制表示。
在不知道要转换的值是不是null
或undefined
的情况下,还可以使用转型函数String()
,这个函数能够将任何类型的值转换为字符串,转换规则如下:
- 如果值有
toString()
方法,则调用该方法并返回相应的结果 - 如果值是
null
,则返回“null”
- 如果值是
undefined
,则返回“undefined”
3.7 Object类型
在ECMAScript
中,Object
类型是所有它的实例的基础。Object
的每个实例都有下列属性和方法:
-
constructor
:保存用于创建当前对象的函数。 -
hasOwnProperty(protoName)
:用于检查给定的属性在当前对象中(而不是在原型中)是否存在,其中参数必须以字符串形式指定。 -
isPrototypeOf(object)
:用于检查传入的对象是否是传入对象的原型。 -
propertyIsEnumerable(propertyName)
:用于检查给定的属性是否能够使用for-in
语句来枚举。参数也必须以字符串形式指定。 -
toLocaleString()
:返回对象的字符串表示,该字符串与执行环境的地区对应 -
valueOf()
:返回对象的字符串、数值或布尔值表示。通常与toString()
方法的返回值相同。
网友评论