一、ECMAScript原始值和引用值
在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值。
原始值
存储在栈(stack)中的简单数据段,即,它们的值直接存储在变量访问的位置。
引用值
存储在堆(heap)中的对象,即,存储在变量处的值是一个指针(point),指向存储对象的内存处。
原始值和引用值的存储
二、ECMAScript原始类型
ECMAScript有5种原始类型(primitive type),即Undefined、Null、Boolean、Number、String.
1>typeof运算符
typeof运算符有一个参数,即要检查的变量或值。例如:
var sTemp = "test string";
alert(typeof sTemp); //输出“string”
alert(typeof 86); //输出“number”
对变量或值调用typeof运算符将返回下列值:
变量或值类型 | 调用typeof运算符返回值 |
---|---|
undefined | undefined |
boolean | boolean |
number | number |
string | string |
null 或 引用型 | object |
2>Undefined类型
Undefined类型只有一个值,即undefined。当声明的变量未初始化时,该变量默认值是undefined。
例如:
var test;
alert(test); //输出"undefined"
alert(test == undefined); //输出"true"
alert(typeof(test)); //输出"undefined"
注意:值undefined并不同于未定义的值,typeof运算符不能区别这两种值。
例如:
var test1;
alert(test1); //输出"undefined"
alert(test2); //输出"undefined"
另外,只有typeof运算符可以用于未声明过的变量。
例如:
var test;
alert(test == undefined); //程序出错
当函数无明确返回值时,返回的值也是”undefined”,
例如:
function test()
{
var sTest = "hello";
}
alert(test() == undefined); //输出"true"
3>Null类型
Null类型只有一个值null,值undefined实际上是从值null派生来的,因此,二者被定义为相等。
alert(null == undefined); //输出"true"
虽然二者值相等,但二者的含义不同。
- undefined是声明了变量但未对其进行初始化时赋值;
- null用于表示尚未存在的对象,如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。
4>Boolean类型
Boolean类型有两个值,true和false。
即使false不等于0,0也可以在必要时转换为false,这样在Boolean语句中使用两者都是安全的。
var bFound = true;
var bLost = false;
5>Number类型
Number类型既可以表示32位的整数,还可以表示64位的浮点数。
直接输入的(而不是从另一个变量访问的)任何数字都被看做Number类型的字面量。
①整数(十进制、八进制、十六进制)
var iNumber1 = 88; //十进制数
var iNumber2 = 070; //八进制数,前导"0"
var iNumber3 = 0x1f; //十六进制,前导"0x"
alert(iNumber1); //输出"88"
alert(iNumber2); //输出"56"
alert(iNumber3); //输出"31"
alert(iNumber1 +iNumber12); //输出"144"
虽然所有整数都可以表示为八进制和十六进制,但所有数学运算返回的都是十进制结果。
②浮点数
要定义浮点值,必须包括小说点和小数点后一位数字。浮点数在用于计算之前,真正存储的是字符串。
例如:
var iNum=1; //整型
var fNum=1.0; //浮点型
③科学计数法
对于非常大或非常小的数,可以用科学计数法表示浮点数。
科学计数法格式:数字+e(E)+乘以10的倍数
var fNumber1=1100000000.0;
var fNumber1=1.1e9; //科学计数法表示
var fNumber2=0.000001123;
var fNumber2=1.123e-6; //科学计数法表示
ECMAScript默认把具有6个或6个以上的前导0的浮点数转换成科学计数法。
另外,也可以用64为IEEE754形式存储浮点值,这意味着十进制最多可以有17个十进制位。17位之后的值将被裁去,从而造成一些小的数学误差。
④特殊的Number值
特殊的Number值 | 值 | 含义 |
---|---|---|
Number.POSITIVE_INFINITY | Infinity | 当计算生成的数大于 Number.MAX_VALUE;意味着不再有数字值。 |
Number.MAX_VALUE | – | 最大值边界 |
一般的Number | – | – |
Number.MIN_VALUE | – | 最小值边界 |
Number.NEGATIVE_INFINITY | -Infinity | 当计算生成的数小于 Number.MIN_VALUE;意味着不再有数字值。 |
所有ECMAScript数都必须在Number.MAX_VALUE 和Number.MIN_VALUE这两个值之间。不过,计算生成的数值结果可以不落在这两个值之间。
isFinite()方法可以用来判断一个数字是否是无穷大。
例如:
var result = iNum * some_really_large_number;
if (isFinite(iResult)) {
alert("finite");
}
else {
alert("infinite");
}
还有一个特殊的Number值是NaN,表示非数(Not a Number),NaN不能参与算数计算。由于NaN与自身不相等,所以推荐使用isNaN()函数来判断。
alert(NaN == NaN); //输出 "false"
alert(isNaN("blue")); //输出 "true"
alert(isNaN("666")); //输出 "false"
对于isNaN()函数,当前值是Number或能转换成Number,则返回false;否则,返回true。
6>String类型
String是唯一没有固定大小的原始类型,由0或多个16位Unicode字符组成。字符串中每个字符都有特定的位置,首字母从位置0开始,第二个字符在位置1,依次类推。
字符串的值是由双引号或单引号声明的。
例如:
var sColor1 = "red";
var sColor2 = 'red';
三、类型转换
1、undefind与null的关系
- undefined派生于null,因此在使用”==”进行比较时,会返回true;
- 没有必要将变量显示声明为undefined
- 声明空对象时应将其赋值为null
2、各种类型转换为Boolean类型
转换前 | 转换方法 | 转换后 |
---|---|---|
非空字符串 | Boolean() | true |
非零数值 | Boolean() | true |
非空对象 | Boolean() | true |
空字符串 | Boolean() | false |
0 以及 NaN | Boolean() | false |
null 以及 undefined | Boolean() | false |
3、各种类型转换为Number类型
转换前 | 转换方法 | 转换后 |
---|---|---|
true | Number() | 1 |
false | Number() | 0 |
null | Number() | 0 |
undefined | Number() | NaN |
string-纯数字 | Number() | 十进制数(忽略前导0) |
string-包含浮点格式 | Number() | 浮点数值(忽略前导0) |
string-包含有效十六进制格式 | Number() | 相同大小十进制数 |
string-空字符串 | Number() | 0 |
string-其它格式字符串 | Number() | NaN |
parseInt()转换 — 转换整数:
- 查看位置0字符
a)不是有效数字,返回NaN;
b)是有效数字,继续执行步骤2; - 继续查看下一个位置的字符;
a)不是有效数字,把该字符之前的字符串转换成数字
b)执行步骤2;
例如:
var iNum1=parseInt("017"); //返回17,忽略前导0
var iNum1 = parseInt("12345red"); //返回 12345
var iNum1 = parseInt("0xA"); //返回 10
var iNum1 = parseInt("56.9"); //返回 56
var iNum1 = parseInt("red"); //返回 NaN
parseInt() 方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由 parseInt() 方法的第二个参数指定的,所以要解析十六进制的值,需如下调用 parseInt() 方法:
例如:
var iNum1 = parseInt("AF", 16); //返回 175
var iNum1 = parseInt("10", 2); //返回 2
var iNum2 = parseInt("10", 8); //返回 8
var iNum3 = parseInt("10", 10); //返回 10
如果十进制数包含前导 0,那么最好采用基数 10,这样才不会意外地得到八进制的值。
例如:
var iNum1 = parseInt("010"); //返回 8
var iNum2 = parseInt("010", 8); //返回 8
var iNum3 = parseInt("010", 10); //返回10
parseFloat() — 转换成小数
parseFloat() 方法与 parseInt() 方法的处理方式相似,从位置 0 开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字符串转换成整数。
不过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的。parseFloat() 会把这个小数点之前的字符转换成数字。这意味着字符串 “11.22.33” 将被解析成 11.22。
使用 parseFloat() 方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不是用八进制或十六进制。该方法会忽略前导 0,所以八进制数 0102 将被解析为 102。对于十六进制数 0xA,该方法将返回 NaN,因为在浮点数中,x 不是有效字符。(注释:经测试,具体的浏览器实现会返回 0,而不NaN。)
此外,prseFloat() 方法也没有基模式。
例如:
var fNum1 = parseFloat("12345red"); //返回 12345
var fNum2 = parseFloat("0xA"); //返回 NaN
var fNum3 = parseFloat("11.2"); //返回 11.2
var fNum4 = parseFloat("11.22.33"); //返回 11.22
var fNum5 = parseFloat("0102"); //返回 102
var fNum1 = parseFloat("red"); //返回 NaN
4、各种类型转换为String类型
转换成String类型存在以下两种方法:
String()函数 — 强制类型转换,可以把任何值转换成字符串。
toString()函数 — 转换成字符串
String()与toString()函数的区别:
①对 null 和 undefined 值,String()强制类型转换可以生成字符串而不引发错误;toString()转换出现错误。
var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //会引发错误
②Number类型的toString()存在默认模式和基模式。
默认模式中,toString() 方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),无论最初采用什么方法声明数字,toString()方法返回的都是数字的十进制表示。
var iNum1 = 10; var iNum2 = 10.0; alert(iNum1.toString()); //输出 "10" alert(iNum2.toString()); //输出 "10"
基模式中,可以以3种不同的形式输出数字,即二进制、八进制和十六进制。
var iNum = 10; alert(iNum.toString(2)); //输出 "1010" alert(iNum.toString(8)); //输出 "12" alert(iNum.toString(16)); //输出 "A"
本文章主要参考并总结W3School以及W3Cschool
W3School