引言
ECMAScript有5种基本数据类型:
- Undefined
- Null
- Number
- String
- Boolean
可以使用typeof来检测变量的数据类型:
console.log(typeof var1);
typeof 用于确定变量的数据类型,返回有:
- “undefined”,表示变量未定义/或者未初始化;
var ck;
console.log(typeof ck);//输出undefined
console.log(typeof pk);//输出undefined
- “number”,变量为数字;
- “string”,变量为字符串;
- “boolean”,变量为boolean;
- “object”,变量为对象;
- “function”,变量为函数。
Undefined
Undefined类型只有一个值便是undefined,表示变量声明了但是未被初始化时,该变量的值便是undefined。如前所述,使用typeof操作符对于未初始化和未声明的变量均返回undefined,所以,一种推荐做法始终显式的初始化变量,若能做到这一点,便可以使用typeof来确定当返回undefined时,即表示变量未声明。
var var1;
console.log(var1 == "undefined");//输出true
Null
Null类型只有一个值null,其表示一个空的对象引用,因此使用typeof操作符,会返回”object”。
ECMA-262规定,对于undefined和null的相等性测试会返回true:
console.log(null == undefined);//输出true
console.log(null === undefined);//输出false
Boolean
Boolean类型有两种值,true和false。ECMAScript中将所有类型的值都可以通过调用一个转型函数Boolean()来将其转化为true或者false:
数据类型 | true | false |
---|---|---|
String | 任意非空字符串 | 空字符串”“ |
Number | 任意非0数字包括无穷大 | 0,NaN |
Object | 任何非空对象 | null |
Undefined | - | undefined |
Number
NaN
关注一下一个特殊的值NaN,MDN中NaN的解释是:
The global NaN property is a value representing Not-A-Number.MDN-JS-NaN
NaN values are generated when arithmetic operations result in undefined or unrepresentable values. Such values do not necessarily represent overflow conditions. A NaN also results from attempted coercion to numeric values of non-numeric values for which no primitive numeric value is available.
For example, dividing zero by zero results in a NaN — but dividing other numbers by zero does not.MDN-JS-isNaN
NaN表示一个本来要返回数值的算术操作或者是试图将一个非数值的变量强转为数值时没有能够返回数值的情况, 有一点要注意的是,NaN与任意其它值均是不想等的,包括和NaN自身比较,即:
console.log(NaN == NaN);//输出false
console.log(NaN === NaN);//输出false
console.log(0/0);//输出NaN
console.log(2/0);//输出Inifinity;
所以检测变量是否为NaN,应当使用isNaN函数来check。你可以认为isNaN函数相当于下面这个实现:
var isNaN = function(value) {
return Number.isNaN(Number(value));
}
可以发现,global下的isNaN函数会在比较之前先调用Number将其强制转换为数字,这可能会在某些情况下造成混乱,如下情况调用isNaN函数会返回true:
console.log(isNaN(‘NaN’)); // true
console.log(isNaN(undefined)); // true 注:Number(undefined)返回NaN
console.log(isNaN({})); // true
console.log(isNaN(‘blabla’)); // true
ES6新特性Number.isNaN函数,可以消除这种混乱,因为这个函数只有在所传参数确实为NaN,而并不是能够强转成NaN的情况下才返回true。对于上述几种情况,调用Number.isNaN均会返回false:
Number.isNaN('NaN'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN('blabla'); // false
数值转换
有三个函数可以进行数值转换,Number()、parseInt()和parseFloat()。
Number()
Number可以用于任何数据类型,它将可以转换为数字的参数转换为0,1或者对应数字,对于不能转换为数字的参数转换为NaN:
console.log(Number(true));//1
console.log(Number(false));//0
console.log(Number(null));//0
console.log(Number(undefined));//NaN
如果参数是字符串:(忽略前导空格以及前导0)
输入字符串 | 返回 |
---|---|
只包含数字 | 数字 (忽略前导0) |
有效的浮点数(只有一个小数点) | 浮点数 |
0x.. | 对应十六进制下的十进制数字 |
空字符串 | 0 |
上述情况之外 | NaN |
console.log(Number("123"));//123
console.log(Number("1.1"));//1.1
console.log(Number("0x10"));//16
console.log(Number("0010"));//10(忽略前导0,所以不可以转换8进制)
console.log(Number(""));//0
console.log(Number("1aa"));//NaN
console.log(Number("1..1"));//NaN
若参数是对象,则先调用对象的valueOf()方法,然后依据前面规则进行转换,如果不成功(是NaN),则调用toString()方法,再依据前面规则进行转换;(JS高程上写的,但是测试的结果是,如果对象有valueOf()方法,则均返回valueOf()方法返回值的转换结果,而不考虑toString()方法;若不存在valueOf()方法,存在toString()方法,则返回toString()方法的结果。)
var ck=
{
valueOf:function()
{
return "1aa";
},
toString:function()
{
return "123";
}
};
var pk =
{
valueOf:function()
{
return "123";
},
toString:function()
{
return "1aa";
}
};
var dk =
{
toString:function()
{
return "123";
}
}
console.log(Number(ck));//输出NaN
console.log(Number(pk));//输出123
console.log(Number(dk));//输出123
注:一元加操作符,效果与调用Number()一样。
parseInt()
parseInt也用于进行数值转换,其签名如下:
parseInt(string, radix);
radix表示转换的进制,默认是10进制,有效数值为2-36,其余参数parseInt()均会返回NaN。相比与Number(),parseInt()的转换更加常用,该方法的转换规则在于,忽略前导空格,若字符串的第一个字符不是数字或者负号,则返回NaN。若第一个字符是数字或者负号,会继续解析下一个数字,直到遇到一个非数字字符(若传入了进制参数,则还要考虑进制的影响,如16进制下a-f是正确的输入)。如下:
console.log(parseInt("a123"));//NaN
console.log(parseInt("123A"));//123
console.log(parseInt("a123",16));//41251
console.log(parseInt("a123",8));//NaN
console.log(parseInt("z",36);//35
console.log(parseInt("z",37);//NaN
parseFloat()与parseInt转换类似。
String
Unlike some other languages, JavaScript makes no distinction between single-quoted strings and double-quoted strings;
Javascript中的可以用单引号或者双引号都可以表示字符串。不像其他语言如c,单引号表示的是字符变量。
Javascript中的字符串是不可变的(与java类似),即字符串一旦创建,它的值就不能改变,若要改变某个变量中保存的字符串,首先会销毁原来的字符串,然后在用另一个包含新值的字符串填充该变量。
注:String后面会详细介绍。
Object
Javascript中的对象就是一组数据和功能的集合。创建对象的方法可以如下:
var obj = new Object();
var obj1 = {
name:"ck",
getName:function()
{
return this.name;
},
height:20
};
注:对象将在后面详细介绍。