JavaScript数据类型

学习要点:

1.typeof操作符

2.Undefined类型

3.Null类型

4.Boolean类型

5.Number类型

6.String类型

7.Object类型

ECMAScript中有5种简单数据类型:Undefined、Null、Boolean、Number和String。还有一种复杂数据类型——Object。ECMAScript不支持任何创建自定义类型的机制,所有值都成为以上6中数据类型之一。

一.typeof操作符,返回数据的类型

typeof操作符是用来检测变量的数据类型。对于值或变量使用typeof操作符会返回如下字符串。

返回的字符串

描述

undefined

未定义值的变量

boolean

布尔值

string

字符串

number

数值

object

对象或null(类型)

function

函数

使用方法:

  1. var box = '李炎恢';
  2. alert(typeof box); //typeof操作符打印类型,可以是变量
  3. alert(typeof '李炎恢'); //也可以直接是字面量,也就是直接写数据
  4. //返回string

typeof操作符可以操作变量,也可以操作字面量。虽然也可以这样使用:typeof(box),但,typeof是操作符而非内置函数。PS:函数在ECMAScript中是对象,不是一种数据类型。所以,使用typeof来区分function和object是非常有必要的。

Undefined类型,声明定义了变量但没给变量赋值的类型

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

  1. var box;
  2. alert(box);

PS:我们没有必要显式的给一个变量赋值为undefined,因为没有赋值的变量会隐式的(自动的)赋值为undefined;而undefined主要的目的是为了用于比较,ECMAScript第3版之前并没有引入这个值,引入之后为了正式区分空对象与未经初始化的变量。

未初始化的变量与根本不存在的变量(未声明的变量)也是不一样的。

  1. var box;
  2. alert(age);

PS:如果typeof box,typeof age都返回的undefined。从逻辑上思考,他们的值,一个是undefined,一个报错;他们的类型,却都是undefined。所以,我们在定义变量的时候,尽可能的不要只声明,不赋值。

Null类型,空对象类型,一般用于初始化对象

Null类型是一个只有一个值的数据类型,即特殊的值null。它表示一个空对象引用(指针),而typeof操作符检测null会返回object。

  1. var box = null;
  2. alert(typeof box);

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null。这样,当检查null值就知道是否已经变量是否已经分配了对象引用了。

  1. var box = null;if (box != null) {
  2. alert('box对象已存在!');
  3. }

有个要说明的是:undefined是派生自null的,因此ECMA-262规定对它们的相等性测试返回true。

  1. alert(undefined == null);

由于undefined和null两个值的比较是相等的,所以,未初始化的变量和赋值为null的变量会相等。这时,可以采用typeof变量的类型进行比较。但,建议还是养成编码的规范,不要忘记初始化变量。

  1. var box;
  2. var car = null;
  3. alert(typeof box == typeof car)

Boolean类型,布尔值类型

Boolean类型有两个值(字面量):true和false。而true不一定等于1,false不一定等于0。JavaScript是区分大小写的,True和False或者其他都不是Boolean类型的值。

  1. var box = true;
  2. alert(typeof box);

Boolean()函数,将其数据类型转换成布尔类型

虽然Boolean类型的字面量只有true和false两种,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以使用转型函数Boolean()。

  1. var hello = 'Hello World!'; //字符串类型
  2. alert(typeof Boolean(hello)); //将字符串转换成布尔值
  3. //打印出boolean

上面是一种显示转换,属于强制性转换。而实际应用中,还有一种隐式转换。比如,在if条件语句里面的条件判断,就存在隐式转换。

  1. var hello = 'Hello World!';
  2. if (hello) {
  3. alert('如果条件为true,就执行我这条!');
  4. } else {
  5. alert('如果条件为false,就执行我这条!');
  6. }

以下是其他类型转换成Boolean类型规则 

数据类型

转换为true的值

转换为false的值

Boolean(布尔类型)

true

false

String(字符串类型)

任何非空字符串

空字符串

Number(数字类型)

任何非零数字值(包括无穷大)

0和NaN

Object(对象类型)

任何对象

null

Undefined(没赋值变量)

没有 true

undefined

 

 

Number类型,数字类型包含整数和浮点数

Number类型包含两种数值:整型和浮点型。为了支持各种数值类型,ECMA-262定义了不同的数值字面量格式。

最基本的数值字面量是十进制整数。

  1. var box = 100; //十进制整数

八进制数值字面量,(以8为基数),前导必须是0,八进制序列(0~7)。

  1. var box = 070; //八进制,56
  2. var box = 079; //无效的八进制,自动解析为79
  3. var box = 08; //无效的八进制,自动解析为8

十六进制字面量前面两位必须是0x,后面是(0~9及A~F)。

  1. var box = 0xA; //十六进制,10
  2. var box = 0x1f; //十六进制,31

浮点类型,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。

  1. var box = 3.8;
  2. var box = 0.8;
  3. var box = .8; //有效,但不推荐此写法

由于保存浮点数值需要的内存空间比整型数值大两倍,因此ECMAScript会自动将可以转换为整型的浮点数值转成为整型。

  1. var box = 8.; //小数点后面没有值,转换为8
  2. var box = 12.0; //小数点后面是0,转成为12

对于那些过大或过小的数值,可以用科学技术法来表示(e表示法)。用e表示该数值的前面10的指数次幂

  1. var box = 4.12e9; //即4120000000
  2. var box = 0.00000000412; //即4.12e-9

虽然浮点数值的最高精度是17位小数,但算术运算中可能会不精确。由于这个因素,做判断的时候一定要考虑到这个问题(比如使用整型判断)。

  1. alert(0.1+0.2); //0.30000000000000004

浮点数值的范围在:Number.MIN_VALUE ~ Number.MAX_VALUE之间。

  1. alert(Number.MIN_VALUE); //最小值
  2. alert(Number.MAX_VALUE); //最大值

如果超过了浮点数值范围的最大值或最小值,那么就先出现Infinity(正无穷)或者-Infinity(负无穷)。

  1. var box = 100e1000; //超出范围,Infinity
  2. var box = -100e1000; //超出范围,-Infinity

也可能通过Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY得到Infinity(正无穷)及-Infinity(负无穷)的值。

  1. alert(Number.POSITIVE_INFINITY); //Infinity(正无穷)
  2. alert(Number.NEGATIVE_INFINITY);//-Infinity(负无穷)

isFinite()函数,判断一个数字是否超过规定的最大值或者最小值

要想确定一个数值到底是否超过了规定范围,可以使用isFinite()函数。如果没有超过,返回true,超过了返回false。

  1. var box = 100e1000;
  2. alert(isFinite(box)); //返回false或者true

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

  1. var box = 0 / 0; //NaN
  2. var box = 12 / 0; //Infinity
  3. var box = 12 / 0 * 0; //NaN

可以通过Number.NaN得到NaN值,任何与NaN进行运算的结果均为NaN,NaN与自身不相等(NaN不与任何值相等)。

  1. alert(Number.NaN); //NaN
  2. alert(NaN+1); //NaN
  3. alert(NaN == NaN) //false

isNaN()函数,用来判断一个值到底是不是NaN

ECMAScript提供了isNaN()函数,用来判断这个值到底是不是NaN。isNaN()函数在接收到一个值之后,会尝试将这个值转换为数值。

  1. alert(isNaN(NaN)); //true
  2. alert(isNaN(25)); //false,25是一个数值
  3. alert(isNaN('25')); //false,'25'是一个字符串数值,可以转成数值
  4. alert(isNaN('Lee')); //true,'Lee'不能转换为数值
  5. alert(isNaN(true)); //false true可以转成成1

isNaN()函数也适用于对象。在调用isNaN()函数过程中,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

  1. var box = {
  2. toString : function () {
  3. return '123'; //可以改成return 'Lee'查看效果
  4. }
  5. };
  6. alert(isNaN(box)); //false

Number()函数,转型函数,可以用于任何数据类型转换成数值

有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。Number()函数是转型函数,可以用于任何数据类型,而另外两个则专门用于把字符串转成数值。

  1. alert(Number(true)); //1,Boolean类型的true和false分别转换成1和0
  2. alert(Number(25)); //25,数值型直接返回
  3. alert(Number(null)); //0,空对象返回0
  4. alert(Number(undefined)); //NaN,undefined返回NaN

如果是字符串,应该遵循一下规则:

1.只包含数值的字符串,会直接转成成十进制数值,如果包含前导0,即自动去掉。

  1. alert(Number('456')); //
  2. alert(Number('070')); //

2.只包含浮点数值的字符串,会直接转成浮点数值,如果包含前导和后导0,即自动去掉。

  1. alert(Number('08.90')); //8.9

3.如果字符串是空,那么直接转成成0

  1. alert(Number('')); //

4.如果不是以上三种字符串类型,则返回NaN。

  1. alert('Lee123'); //NaN

5.如果是对象,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果转换的结果是NaN,则基于这个返回值再调用toString()方法,再测试返回值。

  1. var box = {
  2. toString : function () {
  3. return '123'; //可以改成return 'Lee'查看效果
  4. }
  5. };
  6. alert(Number(box)); //

parseInt()函数,把字符串转换成数值【有参可选】第二个参数是以什么进制方式,如16

由于Number()函数在转换字符串时比较复杂且不够合理,因此在处理整数的时候更常用的是parseInt()。

  1. alert(parsetInt('456Lee')); //456,会返回整数部分
  2. alert(parsetInt('Lee456Lee')); //NaN,如果第一个不是数值,就返回NaN
  3. alert(parseInt('12Lee56Lee')); //12,从第一数值开始取,到最后一个连续数值结束
  4. alert(parseInt('56.12')); //56,小数点不是数值,会被去掉
  5. alert(parseInt('')); //NaN,空返回NaN

parseInt()除了能够识别十进制数值,也可以识别八进制和十六进制。

  1. alert(parseInt('0xA')); //10,十六进制
  2. alert(parseInt('070')); //56,八进制
  3. alert(parseInt('0xALee')); //100,十六进制,Lee被自动过滤掉

ECMAScript为parseInt()提供了第二个参数,用于解决各种进制的转换

  1. alert(parseInt('0xAF')); //175,十六进制
  2. alert(parseInt('AF',)); //175,第二参数指定十六进制,可以去掉0x前导
  3. alert(parseInt('AF')); //NaN,理所当然
  4. alert(parseInt('101010101',2)); //314,二进制转换
  5. alert(parseInt('70',8)) //56,八进制转换

parseFloat()函数,把字符串转换成数值

parseFloat()是用于浮点数值转换的,和parseInt()一样,从第一位解析到非浮点数值位置。

  1. alert(parseFloat('123Lee')); //123,去掉不是别的部分
  2. alert(parseFloat('0xA')); //0,不认十六进制
  3. alert(parseFloat('123.4.5')); //123.4,只认一个小数点
  4. alert(parseFloat('0123.400')); //123.4,去掉前后导
  5. alert(parseFloat('1.234e7')); //12340000,把科学技术法转成普通数值

String类型,字符串类型

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

  1. var box = 'Lee';
  2. var box = "Lee";

PS:在某些其他语言(PHP)中,单引号和双引号表示的字符串解析方式不同,而ECMAScript中,这两种表示方法没有任何区别。但要记住的是,必须成对出现,不能穿插使用,否则会出错。

  1. var box = '李炎恢"; //出错

String类型包含了一些特殊的字符字面量,也叫转义序列。

字面量

含义

\n

换行

\t

制表

\b

空格

\r

回车

\f

进纸

\\

斜杠

\'

单引号,转义字符

\"

双引号,转义字符

\xnn

以十六进制代码nn表示的一个字符(0~F)。例:\x41

\unnn

以十六进制代码nnn表示的一个Unicode字符(0~F)。例:\u03a3

  1. var sdf = "林\n贵秀"
  2. alert(sdf)
  3. //打印出来就会换行

 ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的

字符串填充该变量。

  1. var box = 'Mr.';
  2. box = box + ' Lee';
  3. alert(box)
  4. //打印出Mr.Lee

toString()方法可以把值转换成字符串。【有参可选】

注意:null或者undefined的情况下toString()是无法转换的

  1. var dsaf = 11; //数字类型
  2. dsaf = dsaf.toString(); //将数字类型转换成字符串类型
  3. alert(typeof dsaf); //打印出string
  1. var box = true;
  2. alert(box.toString());//将布尔类型转换成字符串类型

toString()方法一般是不需要传参的,但在数值转成字符串的时候,可以传递进制参数。

  1. var box = 10;
  2. alert(box.toString()); //10,默认输出
  3. alert(box.toString(2)); //1010,二进制输出
  4. alert(box.toString(8)); //12,八进制输出
  5. alert(box.toString(10)); //10,十进制输出
  6. alert(box.toString(16)); //a,十六进制输出

String()函数,将任何类型的值转换为字符串

如果在转型之前不知道变量是否是null或者undefined的情况下,我们还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。

  1. var box = null;
  2. alert(typeof String(box));//转换成字符串类型

PS:如果值有toString()方法,则调用该方法并返回相应的结果;如果是null或者undefined,则返回"null"或者"undeinfed"。

Object类型,对象类型,其实就是一组数据和功能的集合

new操作符

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

  1. var box = {}; //简单创建方法
  2. var boxf = new Object(); //通过new操作符创建对象

Object()是对象构造,如果对象初始化时不需要传递参数,可以不用写括号,但这种方式我们是不推荐的。

  1. var box = new Object;

Object()里可以任意传参,可以传数值、字符串、布尔值等。而且,还可以进行相应的计算。

  1. var box = new Object(2); //Object类型,值是2
  2. var age = box + 2; //可以和普通变量运算
  3. alert(age); //输出结果,转型成Number数字类型了

既然可以使用new Object()来表示一个对象,那么我们也可以使用这种new操作符来创建其他类型的对象。

  1. var box = new Number(5); //new String('Lee')、new Boolean(true)
  2. alert(typeof box); //Object类型

既然可以使用new Object()来表示一个对象,那么我们也可以使用这种new操作符来创建其他类型的对象。

  1. var box = new Number(5); //new String('Lee')、new Boolean(true)
  2. alert(typeof box); //Object类型

第九十九节,JavaScript数据类型的更多相关文章

  1. 第十九节,基本数据类型,集合set

    集合set,无序,是不允许重复内容的,也就是不允许重复元素,如果有重复,会自动忽略,可接收可迭代类型 (一般用于需要判断和处理交集时候用到) 集合与字典的区别是,集合没有键只有值,字典是有键的字典是一 ...

  2. 第三百七十九节,Django+Xadmin打造上线标准的在线教育平台—xadmin的安装

    第三百七十九节,Django+Xadmin打造上线标准的在线教育平台—xadmin的安装 xadmin介绍 xadmin是基于Django的admin开发的更完善的后台管理系统,页面基于Bootstr ...

  3. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  4. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

  5. 第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页

    第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值, ...

  6. 第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装

    第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装 elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于 ...

  7. 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制

    第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...

  8. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  9. 第三百一十九节,Django框架,文件上传

    第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...

随机推荐

  1. Access一些常用的SQL语句

    您可以将 Microsoft Office Access 2013 用作创建.修改数据库以及处理数据的工具,还可将 Office Access 2013 用作服务器数据库管理系统(如 Microsof ...

  2. open live writer下载安装

    以前记笔记都是用Evernote,啥都记在上面.除了学习工作的以外,还有各种账号密码啦(这个真心有必要,再也不用各种试了),妈妈要我帮她下载的广场舞名字啦,我双十一要剁手的东西啦等等.很好用的,推荐! ...

  3. Oracle 11G R2 在windows server 2008 64位安装时提示:无法在windows "开始"菜单或桌面上创建项

    错误代码及解释:  在windows server 2008 64 位操作系统中安装 oracle 11G R2 64位 版本时提示:无法在windows "开始"菜单或桌面上创建 ...

  4. LR日志解析

    在录制和回放的时候,VU会分别把发生的事件记录成日志文件,这些日志有利于我们跟踪VU和服务器的交互过程. 1.回放日志(Replay log) 脚本回放运行时的输出都记在这个log里. "输 ...

  5. Linux 复习重点目录

    Linux安全复习 一.Linux基本命令 1.文件管理命令 lvm 2.用户管理命令 3.网络管理命令 4.权限管理 普通权限和特殊权限 权限命令修改 5.服务命令 6.软件安装管理命令 yum安装 ...

  6. Oracle笔记(1) 简单查询、限定查询、数据的排序

    Oracle笔记(四) 简单查询.限定查询.数据的排序   一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...

  7. emacs 使用教程

    http://www.cnblogs.com/liuchaogege/p/4464211.html

  8. svn恢复到某一版本

    转 经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge 1) 先 svn up,保证更新到最新的版本,如20: 2) 然后用 svn log ,查看 ...

  9. 【1】JavaScript编程全解笔记(一)

    1.概述 本书涵盖了 JavaScript 各个方面的主题,从客户端以及服务端 JavaScript 等基础内容,主要讲了  HTML5.Web API.Node.js 与 WebSocket 等技术 ...

  10. delphi const

    参考:http://www.cnblogs.com/tibetwolf/articles/1785744.html 1.const修饰可能会优化编译代码.关于这一点与编译器密切相关,由于变量被cons ...