ECMAScript 的原始类型

本文介绍了ECMAScript的6种数据类型,包括5种原始类型(Undefined、Null、Boolean、Number和String)和复杂数据类型Object。详细阐述了各原始类型的特点、判断方法及转换规则,如typeof运算符的使用、数值转换函数等,还提及了浮点数计算误差和NaN的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ECMAScript不支持任何创建自定义类型的机制,所有值最终都会是以下6种数据类型之 一。
ECMAScript数据类型具有动态性,因此在没有定义其他数据类型的必要了。

isNaN也可以用于对象。
在基于对象调用isNaN()函数时,会首先调用对象valueOf()方法,然后确定该方法的值是否可转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测返回值。
这个过程也是ECMAScript中内置函数和操作符的一般执行流程。

原始类型

如前所述,ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String,还有一种复杂数据类型Object。Object本质上由一组无序的名值对组成的。
ECMA-262 把术语类型(type)定义为值的一个集合,每种原始类型定义了它包含的值的范围及其字面量表示形式。

ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。

“undefined” ------->如果这个值未定义。
"null’---------->如果这个值是布尔值。
“string” -------->如果这个值是字符串。
“number”------->如果这个值是数值
“object”--------->如果这个值是对象或者null。
“function”------->如果这个值是函数。

var msg = "something";
alert(typeof(msg)); //"string"
alert(typeof(99)); //"number"

您知道吗?

typeof操作符的操作数可以是变量,也可以是数值。
记住typeof是一个操作数,而不是一个函数。圆括号可有可无。

有时typeof会返回一些令人疑惑,但是技术上却正确的值。比如:

alert(typeof(null)); //""object

因为特殊值null被认为是一个空的对象引用。
Safari5及之前的版本、Chrome7及之前版本在对正则表达式用typeof时,会返回"function"。其他浏览器会返回**“object”**。

从技术上讲,函数在ECMAScript中是对象,不是一种数据类型。函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的。


原始类型的详细介绍

1、Undefined类型
Undefined只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化,这个值就是undefined。
如(推荐):

var message;
alert(message == undefined);

等价于:

var message = undefined;
alert(message == undefined);

一般不存在需要显示地把一个变量设置为undefined。
字面值undefined的主要目的是用于比较。
ECMA-262第3版本之前没有定义undefined。
第3版引入是为了正式区分空对象和未初始化的变量。

包含undefined和未定义的变量还是不一样的。如下:

var msg;
//var age;
alert(msg);//undefined
alert(age);//尚未声明的变量age

对于未声明的变量,只能执行一个操作:即使用typeof操作符检测其数据类型(对未经声明的变量调用delete不会导致错误,但是没有意义,在严格模式会错误。)

var msg;
//var age;
alert(typeof(msg));//undefined
alert(typeof(age));//undefined

结果:对未声明和未初始化的变量执行typeof操作符都会返回undefined;有逻辑上的合理性。
因为这两种变量在技术角度上看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作
即便未被初始化的变量会自动赋予undefined,但显式初始化变量依然是明智的选择。如果能做到这一点,那么当typeof操作符返回"undefined"时, 我们就知道呗检查的变量没有声明,而不是未被初始化。


2、Null类型
只有一个值的数据类型,即null。从逻辑上null是一个空对象指针,这正是为什么在使用typeof操作符的结果为"object"的原因。

var car = null;
alert(typeof(car));//"object"

如果定义的变量是用来保存对象,最好将变量初始化为null。这样只要检查null值就可以知道相应的变量是否保存了一个对象的引用。

如下:

if(car != null){
	//对car进行操作
}

undefined是派生自null值的。因此ECMA-262规定它们的相等性测试为true。

alert(null == undefined);//true
alert(null === undefined);//false

here,位于null和undefined之间的相等操作符(==)h总是返回true。
but,这个操作符出于比较会修改操作数。
它们的用途完全不同。

总结您知道的或者不知道的!

无论什么情况,都没有必要的把变量的值显示地写成undefined。同样的规则对于null来说,却不适宜。 That is to say,只要在保存对象的变量还没有真正保存对象,就应该明确让该变量保存null值。 这样做的好处:不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。

看到这里有没有疲劳感!!
在这里插入图片描述
程序猿走起!!看到这样的你,是不是更有干劲了。
come on!!

更进一步去知道下一个boolean类型吧!!!


3、Boolean类型

Boolean类型是ECMAScript中使用最多的一种数据类型,它的值有两个,真(true)或假(false)。
注意
true和false与数字值不是一回事。

true不一定为1,false也不一定为0 。

var found = true;
var lost = false;

Boolean类型的字面值true和false是区分大小写的。that is to say,True 和False不是Boolean类型的值,而死标识符。
虽然Boolean值只有两个,但是所有的数据类型都有与这两个Boolean值等价的值
要讲一个值转换为其对应的Boolean值,可以调用转型函数Boolean(),如下所示:

var msg = "you are my friend";
var megsAsBoolean = Boolean(msg);

可以对任何数据类型调用Boolean()函数,而且总会返回一个Boolean值。
至少返回的值取决于要转换值的数据类型和实际值。
数据类型及转换规则
这些转换规则对理解流控制语句(如if语句),自动执行相应的Boolean转换非常重要,如下面的代码:

var msg="hello world";
if(msg){
	alert(Value is true!!);
}

上面的代码说明msg已经被自动转换为对应的Boolean值(true)。
由于存在这种自动执行的Boolean转换,因此确切的知道在流程控制语句中使用什么变量很重要
认真的程序猿在上面表格中没有看到Object这个类型。错误的吧一个对象而不是Boolean值,就有可能改变程序的流程。
我也是震惊了!!!

4、Number类型

这种数据类型使用IEEE754格式来表示整数和浮点数(浮点数值再某些语言中也被称为双精度数值)。为支持各种数值类型,ECMA-262定义了不同的数值字面量格式。
最基本的数值字面量是十进制数整数,如下写法:

var intNum = 55;

还有八进制和十六进制。
八进制的第一位必须是0,然后八进制的序列为0~7,。
超出范围会怎么样尼???

如果字面量中的数值超出了范围,就会忽略前导0,后面的数值被当做十进制解析。

var octalNum1 = 070;//八进制56
var octalNum2 = 079;//无效的八进制数值----->解析为79
var octalNum = 08;//无效的八进制,-----解析为8

注意:
八进制数值在严格模式下是无效的,会导致支持该模式下的JavaScript引擎抛出错误。


十六进制字面值的前两位必须是0x,后跟任何十六进制的数字(09,AF),字母可以是大写,也可以是小写。

var hexNum1=0xA;//十六进制的10
var hexNum2 = 0x1f;//十六进制的31

注意:
在进行算术运算时,所有的八进制和十六进制的数值最终都会被转换为十进制。

基于JavaScript中保存数值的方式,可以保存正零(+0)和负零(-0)。正零和负零被认为相等。

4.1、浮点数值:
所谓的浮点数,就是该数值含有一个小数点,并且小数点后必须至少有一位数字。虽然小数点前可以没有整数,但不推荐。

var floatNum1=2.2;
var floatNum3 = 0.1;
var floatNUM3=.3;//有效,不推荐

由于保存浮点数需要的内存空间是保存整数数值的两倍,所以ECMAScript会不时机将浮点数值转换为整数值。显然如果小数点后面没任何数字,那么这个数值及可以作为整数值来保存。同理,如果浮点数本身就是一个整数,那么该值就会被转换为整数。

var floatN1=1.0;//小数点后没有数字----解析为1
var floatN2 = 10.0;//整数,解析为10

对于那些极大或极小的数值,可以(e)学计数法表示浮点数的值。用e表示法,表示的数值等于e前面的数值乘以10的指数次幂。表示方法如下:
ECMAScript中e表示法的前面可以是一个整数也可以是一个浮点数,中间可以是一个大写或小写的E,后面是10的幂中的指数,该幂值将用来与前面的数值相乘。

下面的这个很重要哦!!!!

浮点数的最高精度为17位小数,但在进行算术运算时精确到远远不如整数。例如0.1+0.2的结果不是0.3。

if(a+b=0.3){//永远不要这样做判断
	alert("You got 0.3!!!");
}

alert("0.1+0,2="+(0.1+0.2));//0.1+0,2=0.30000000000000004
alert("0.25+0.05="+(0.25+0.05));//0.25+0.05=0.3

永远不要测试某个特定的浮点数。

您知道,吗?

关于浮点数计算会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754数值浮点计算的通病,ECMAScript并非独此一家。其他使用相同数值格式的语言也有这个问题。

4.2、数值范围:
由于内存的限制,ECMAScript并不能保存世界上所有的数值。最小的数值Number.MIN_VALUE,在大多数的浏览器中,这个值为5e-324。
最大数值Number.MAX_VALUE,这个值是1.7976931348623157e+308。

如果JavaScript的值大于最大值,就会被自动转换为Infinity值。负数则为-Infinity(负无穷)。整数为正无穷。

alert(Number.MIN_VALUE);//5e-324
alert(Number.MAX_VALUE);//1.7976931348623157e+308
alert(Number.MAX_VALUE+Number.MAX_VALUE);//Infinity
alert(alert(Number.MAX_VALUE+1);//1.7976931348623157e+308

想知道一个数是不是存在最大值和最小值之间,可以使用isFinite()函数,在最大和最小之间,就会返回true。

var num = Number.MAX_VALUE;
var res=num +num ;
alert(isFinite(res));//false
//推荐
var ress = Number.MAX_VALUE+Number.MAX_VALUE;
alert(res);//false

使用Number.NEGATIVE_INFINITY和Number.POSTIVE_INFINITY也可以得到负和正Infinity的值。

4.3、NaN
即非数值的一个特殊的数值。这个数值用来表示一个本来要返回数值的操作数未返回的情况(这样就不会抛出错误了)。如在其他语言中,任何数值除以非数值都会导致错误,从而停止执行。但在ECMAScript中,都会返回NaN。因此不会影响代码的执行。

两个特点:

任何涉及NaN的操作都会返回NaN,在多步计算中有可能导致错误。
NaN与任何值都不相等。

alert(NaN == NaN);//false

针对这两个特点,ECMAScript定义了isNaN(),
这个参数可以接受一个参数,该参数可以是任意类型,而函数会帮我们返回这个参数是否“不是数值”。
该函数在接受到一个参数之后,会先尝试把参数转换为数值。。 某些不是数值的值会直接转换为数值。而任何不能被转换为数值的都会返回true。

alert(isNaN(NaN));//true
alert(isNaN(10));//false(10是一个数值)
alert(isNaN("10"));//false(可以被转换为数值10)
alert(isNaN("yee"));//true(不能被转为数值)
alert(isNaN(true));//false(可以被转换为数值1)

4.4 数值转换
有三个函数可以吧非数值转换为数值:Number()、parseInt()和parseFloat()。第一个函数,即转型函数Number()可以用于任何数据类型,而另外两个函数专门用于把字符串转换为数值。

var num1 = Number("hello ");//NaN
var num2 = Number("");//0
var num3= Number("0000011);//11
var num4=Number(true);//1

一元加操作符的操作与Number()函数相同。

由于Number()函数在转换字符串时比较复杂且不合理,所以一般使用parseInt()。parseInt()函数在转换字符串时,更多的是检查其是否符合数值模式。
会忽略字符串前面的空格,直至找到第一个非空格字符。

  1. 如果第一个字符不是数字字符或负号,parseInt()就返回NaN。也就是说,parseInt转换空字符时返回NaN(Number会返回0)。
  2. 若为一个非数值字符,会直接忽略非数值部分。如"1233eeedf",会返回1233。"22.54"会返回22,小数点并不是有效的数字字符。
  3. 如果字符串中的第一个字符是数字字符,parseInt()能识别出各种整数格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值