JavaScript数据类型-原始类型

一、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运算符返回值
undefinedundefined
booleanboolean
numbernumber
stringstring
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_INFINITYInfinity当计算生成的数大于 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 以及 NaNBoolean()false
null 以及 undefinedBoolean()false

3、各种类型转换为Number类型

转换前转换方法转换后
trueNumber()1
falseNumber()0
nullNumber()0
undefinedNumber()NaN
string-纯数字Number()十进制数(忽略前导0)
string-包含浮点格式Number()浮点数值(忽略前导0)
string-包含有效十六进制格式Number()相同大小十进制数
string-空字符串Number()0
string-其它格式字符串Number()NaN

parseInt()转换 — 转换整数:

  1. 查看位置0字符
    a)不是有效数字,返回NaN;
    b)是有效数字,继续执行步骤2;
  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值