1.1 数据类型
JavaScript的基本数据类型有undefined、null、boolean、number、string以及一种较为复杂的数据类型object。
由于JS的数据类型是松散类型的,因此需要使用typeof操作符对数据类型进行检测,这里着重提一下:
typeof null // "object"
typeof function // "function"
函数尽管不是一种数据 类型,但由于其特殊的属性,有必要与其他数据类型进行区分。
1.1.1 Undefined
在变量声明但未定义时,内部会自动为其赋值为undefined。不过,包含undefined值的变量与未声明的变量之间仍然存在一些差别,我们来看下面两段代码:
var message // 该变量声明后默认为undefined
// age 为未声明的变量
alert( message ) // "undefined"
alert( age ) // 发生错误
var message // 该变量声明后默认为undefined
// age 为未声明的变量
typeof message // "undefined"
typeof age // "undefined"
虽然在alert中age会产生错误,但在typeof中未声明的age也会返回undefined值,这是比较奇怪的现象!同时,typeof是唯一地能对未声明变量进行的操作。
1.1.2 Null
null值表示一个空对象的指针,undefined实际上派生自null值,在JS的相等性测试中,两者是相等的,注意这里的相等(==)与全等(===)不同。
null == undefined // true
1.1.3 Boolean
Boolean类型分为两种,即true和false,这里要注意大小写,Boolean是对大小写敏感的。
在不同数据类型中,Boolean类型有不同的表现形式,具体见下表。
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | " " ( 空字符串 ) |
Number | 非零数字和无穷大 | 0或NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
上表中Undefined一行中,n/a是not applicable的缩写,意为 “ 不适用 ”
1.1.4 Number
Number类型使用IEEE754格式来表示整数和浮点数。浮点数的最高精度是17位小数,但在进行计算时它的精度远远不如整数,如0.1+0.2的结果不是0.3,而是0.30000000000000004。
if ( a+b == 0.3 ) { // 返回false,因此不要做这种测试!
alert ( " you got 0.3 " )
}
在JavaScript中,存在能够保存的最大值Number.MAX_VALUE和最小值Number.MIN_VALUE,超过这两个值即为Infinity和-Infinity。
该类型中有一个特殊的数值,即NaN(Not a Number),该值是为了防止在数值计算中返回非数值的情况,其本身有两个特点。
- 涉及NaN的操作均会返回NaN;
- NaN与任何值都不想等,包括它自己。
数值转换:Number ( )、parserInt ( )、parserFloat ( )之间的比较。Number ( )可以接受任何数据类型,而parserInt ( )、parserFloat ( )只能接受字符串类型
- ** Number ( ) **
- true => 1
- false 或 null => 0
- undefined => NaN
- string => 若为数字(包括二进制、十进制、八进制、十六进制和浮点数),均转换成十进制对应的数字;若为空字符串(" "),转换为0;其他情况,均转换为NaN
- object => 先调用valueOf( )方法,依次按照之前的规则进行转换,若返回为NaN,则调用toString( )方法,再依次按照前面的规则进行转换
-
parserInt ( ) 和 parserFloat ( )
parserInt ( )从第一个不为空格的数字字符开始检测,直到检测到非数字字符为止,它可以解析不同进制的数值,并返回对应十进制的值,通过传入第二个参数,即进制值来实现;相比之下,parserFloat ( )只能解析十进制的浮点数,且能解析第一个小数点,遇到第二个小数点会自动忽略。
下面是一些常见的例子:
Number( "Hello World" ) // NaN
Number( undefined ) // NaN
Number( " " ) // 0
Number( "0000011" ) // 11
Number( true ) // 1
parseInt( "1234Joker" ) // 1234
parseInt( " " ) // 0
parseInt( "0xA" ) // 10
parseInt( 22.5 ) // 22
parseInt( "70" ) // 70
parseInt( "10", 2 ) // 2
parseInt( "10", 8 ) // 8
parseInt( "10", 10 ) // 10
parseInt( "10", 16 ) // 16
parseFloat( "0xA" ) // 0
parseFloat( "22.5" ) // 22.5
parseFloat( "22.4.5" ) // 22.4
1.1.5 String
String类型用于表示由零个或多个16位字符组成的Unicode字符组成的字符序列,即字符串。可以用(")或者('),但两边的引号类型要相等。字符串带有length属性,用于表示字符串的长度。
要想将别的数据类型如数值、布尔值、对象和字符串转换为字符串类型,可以使用toString( )方法,不过null和undefined值没有这个方法,需要使用转型函数String( )。
1.1.6 Object
简单来说,对象即为一组数据和功能的集合,关于对象的具体内容,会在后续文章中进行阐述
1.2 操作符
1.2.1 一元操作符
- 递增和递减操作符
这种操作符又各自分为两种,前置型和后置型,下面以递减为例
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; // 等于21
var num4 = num1 + num2; // 等于21
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于22
var num4 = num1 + num2; // 等于21
从上面的代码中可以看出,前置型操作符使用num-1进行运算,而后置型操作符则使用num进行运算。此外,这四个操作符对任何值均有效。
- 一元加和减操作符
加操作符对数值不会有任何影响,减操作符主要用于表示负数,这两个操作符应用于非数值类型的值时,其转换规则与Number( )相同,这里不再赘述。
1.2.2 布尔操作符
布尔操作符一共有三种:非(NOT)、与(AND)、或(OR)
- 逻辑非
数据类型 | 返回值 |
---|---|
空字符转、数值0、null、NaN、undefined | true |
对象、非空字符串、非0数值(包括Infinity) | false |
- 逻辑与
可以应用于任何数据类型,不一定返回布尔值,具体规则:
1.若第一个操作数是对象,则返回第二个操作数;
2.若第二个操作数是对象,则只有当第一个操作数返回true的情况下才返回该对象;
3.若两个操作数都是对象,则返回第二个操作数;
4.若第一个操作数是nulll,则返回null;
5.若第一个操作数是NaN,则返回NaN;
6.若第一个操作数是undefined,则返回undefined。
- 逻辑或
可以应用于任何数据类型,不一定返回布尔值,具体规则:
1.若第一个操作数是对象,则返回第一个操作数;
2.若第一个操作数求值为false,则返回第二个操作数;
3.若两个操作数都是对象,则返回第一个操作数;
4.若两个操作数都是null,则返回null;
5.若两个操作数都是NaN,则返回NaN;
6.若两个操作数都是undefined,则返回undefined。
逻辑与与逻辑或都属于短路操作,即如果第一个操作数能决定结果,那么不会对第二个操作数求值。
1.2.3 乘性操作符
乘性操作符总共有三种:乘法、除法和求模。这里只列举一些较为特殊的用法。
乘法:
- 若有一个操作数为NaN,则返回NaN;
- 若是Infinity与0相乘,则返回NaN;
- 若是Infinity与非0数相乘,则返回Infinity或者-Infinity
除法:
- 若是Infinity被Infinity除,则返回NaN;
- 若是0被0除,则返回NaN;
- 若是非零的有限数被0除,则返回Infinity或者-Infinity
1.2.4 加性操作符
特殊用法:
Infinity + Infinity // Infinity
-Infinity + -Infinity // -Infinity
Infinity + -Infinity // NaN
+0 + +0 // +0
+0 + -0 // +0
-0 + -0 // -0
另外,当加性运算符遇到字符串时,就会将其他数据类型转换成字符串类型,然后进行拼接。
"" + 123 + 456 // 123456
1.2.5 关系操作符
关系操作符主要有小于(<)、大于(>)、小于等于(<=)、大于等于(>=),这些操作符均返回一个布尔值。
需要注意:
- 若两边均为字符串,则比较两个字符串的编码值;
- 若又一个操作数为数值,则领一个操作数转换成数值再进行比较。
var res = "Brick" < "alphabet" // true
var res2 = "23" < "3" // true
还有一个比较有意思的现象,根据规则,NaN与任何值进行比较均返回false,所以:
var res1 = NaN < 3 // false
var res2 = NaN >= 3 // false
1.2.6 相等操作符
相等操作符可以分为两组,一种为相等和不想等(== 和 !=),另一种为全等和不全等(=== 和 !==)。== 和 != 会先转换数操作数(称为强制转型),然后再比较它们的相等性;而 === 和 !== 则要求相比较的两个操作数类型和值均相等。
下面列举一些相等操作符的特殊用法:
null == undefined // true
"NaN" == NaN // false
5 == NaN // false
NaN == NaN // false
NaN != NaN // true
false == 0 // true
true == 1 // true
true == 2 // false
undefined == 0 // false
null == 0 // false
"5" == 5 // true
"5" === 5 // false
除以上几种操作符以外,javascript还提供了条件操作符、赋值操作符、逗号操作符,由于这几种操作符较为简单,这里不进行详细介绍。
网友评论