代码改变世界

第三章基本概念--数据类型

2021-01-14 16:55  若藜520  阅读(260)  评论(0编辑  收藏  举报

1.ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。

2.typeof操作符

鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof就是负责提供这方面信息的操作符。对一个值使用typeof操作符可能返回下列某个字符串:

"undefined"——如果这个值未定义;

"boolean"——如果这个值是布尔值;

"string"——如果这个值是字符串;

"number"——如果这个值是数值;

"object"——如果这个值是对象或null;

"function"——如果这个值是函数。

3.Undefined类型

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

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

包含undefined值的变量与尚未定义的变量还是不一样的。看看下面这个例子:

var message; // 这个变量声明之后默认取得了undefined值

alert(message); // "undefined"

alert(age); // 产生错误

令人困惑的是:对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined值。来看下面的例子

var message; // 这个变量声明之后默认取得了undefined值

alert(typeof message); // "undefined"

alert(typeof age); // "undefined" 

4.Null类型

ull类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"object"的原因

undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true:alert(null == undefined); //true,也就是说判断一个已声明未初始化的变量等于null返回true

5.Boolean类型

该类型只有两个字面值:true和false。需要注意的是,Boolean类型的字面值true和false是区分大小写的。也就是说,True和False(以及其他的混合大小写形式)都不是Boolean值

所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean(),下表给出了各种数据类型及其对应的转换规则。

数据类型 转换为true的值 转换为false的值
String 任何非空的字符串 ""(空字符串)
Number 任何非0数值 0和NaN
Object 任何对象 null
Undefined undefined

6.Number类型

Number类型包括整数和浮点数

1)整数类型有八进制整数,十进制整数,十六进制整数等类型。

八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7)如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。

var octalNum1 = 070; // 八进制的56

var octalNum2 = 079; // 无效的八进制数值——解析为79

var octalNum3 = 08; // 无效的八进制数值——解析为8

十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F)。其中,字母A~F可以大写,也可以小写。

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

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

 

2)所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字

对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。如var floatNum = 3.125e7; // 等于31250000 

注意:浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远远不如整数。0.1加0.2的结果不是0.3,而是0.30000000000000004。如果这两个数是0.05和0.25, 或者是0.15和0.15都不会有问题。

 

3)数值范围

ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。

如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。

要想确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数值之间),可以使用isFinite()函数。

var result = Number.MAX_VALUE + Number.MAX_VALUE;

alert(isFinite(result)); //false

 

4)NaN

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

NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN,其次,NaN与任何值都不相等,包括NaN本身。如alert(NaN == NaN); //false  

ECMAScript定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”

alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10是一个数值)

 

5)数值转换

有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。

Number()函数的转换规则如下:

如果是Boolean值,true和false将分别被转换为1和0。

如果是数字值,只是简单的传入和返回。

如果是null值,返回0。如果是undefined,返回NaN。

如果是字符串,遵循下列规则:

如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);

如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);

如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;

如果字符串是空的(不包含任何字符),则将其转换为0;

如果字符串中包含除上述格式之外的字符,则将其转换为NaN。

如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

Number("123Blue")//NaN

Number("000011"); //11

 

parseInt()

它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

parseInt("a123Blue4"); //NaN

parseInt("123Blue4"); //123

parseInt()也能够识别出各种整数格式(即前面讨论的十进制、八进制和十六进制数)

var num3 = parseInt("0xA"); // 10(十六进制数)

var num4 = parseInt(22.5); // 22

var num5 = parseInt("070"); // 56(八进制数)

在使用parseInt()解析像八进制字面量的字符串时,ECMAScript 3和5存在分歧。例如://ECMAScript 3认为是56(八进制),ECMAScript 5认为是70(十进制)var num = parseInt("070"); 为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)如:var num = parseInt("0xAF", 16);

 

与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到字符串末尾。举例来说,"22.34.5"将会被转换为22.34。parseFloat("123.32Blue4")//123.32

7.String类型

1)定义

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(")或单引号(')表示

var firstName = "Nicholas";

var lastName = 'Zakas'; 

 

2)转义字符

字面量  含 义

\n   换行  

\t   制表

\b   空格

\r   回车

\f   进纸

\\   斜杠

\'   单引号('),在用单引号表示的字符串中使用。例如:'He said, \'hey.\''

\" 双引号("),在用双引号表示的字符串中使用。例如:"He said, \"hey.\""

\xnn以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A"

\unnnn以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ

3) 字符串的特点

ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,例如:var lang = "Java"; lang = lang + "Script"; 以上示例中的变量lang开始时包含字符串"Java"。而第二行代码把lang的值重新定义为"Java"与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。

 

4)转换为字符串

要把一个值转换为一个字符串有两种方式。

第一种是使用几乎每个值都有的toString()方法,数值、布尔值、对象和字符串值(没错,每个字符串也都有一个toString()方法,该方法返回字符串的一个副本)都有toString()方法。但null和undefined值没有这个方法。

var age = 11; var ageAsString = age.toString(); // 字符串"11" 

另外toString方法可以输入一个基数,返回整数的二进制,八进制,十进制,十六进制字符串表示

var num = 10;

alert(num.toString()); // "10"

alert(num.toString(2)); // "1010"

alert(num.toString(8)); // "12"

alert(num.toString(10));

// "10" alert(num.toString(16)); // "a"

 

另一种方法是使用String()函数

String()函数遵循下列转换规则:

如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;

如果值是null,则返回"null";

如果值是undefined,则返回"undefined"。

var value1 = 10;

var value2 = true;

var value3 = null;

var value4;

alert(String(value1)); // "10"

alert(String(value2)); // "true"

alert(String(value3)); // "null"

alert(String(value4)); // "undefined"

 

8.Object类型

ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。var o = new Object();

即在ECMAScript中,(就像Java中的java.lang.Object对象一样)Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。Object的每个实例都具有下列属性和方法。

constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()。

hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))。

isPrototypeOf(object):用于检查对象是否是传入对象的原型(第5章将讨论原型)。

propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句(本章后面将会讨论)来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。

toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。

toString():返回对象的字符串表示。

valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。