ECMAScript中一共有6种数据类型,其中包括5种基本数据类型(Undefined,Null,Boolean,Number,String)以及一种复杂数据类型(Object)。【ES6增加多了一种Symbol数据类型,但这里先不做讨论】

Undefined类型

  Undefined类型只有一个undefined值。在使用var声明变量但未对其加以初始化的时候,这个变量的值就会被自动的赋上undefined值。

 {
var name;
console.log(name); //undefined
}

Null类型

  Null类型也同样只用一个null值。null值在逻辑角度上代表一个空对象指针,所以使用typeof操作符检测null值时会返回“object”。

 {
var dd = null;
console.log(typeof dd);
}

  如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null。这样一来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用。

Boolean类型

  Boolean类型有两个字面值:true和false。这里需要注意一下,Boolean类型的字面值true和false是区分大小写的。True和False都不算是Boolean的值,只能算是标识符。

  ECMAScript中所有数据类型值都能通过调用转型函数Boolean()转换为其相对应的Boolean值。

 {
var bool = 13;
var _bool = Boolean(bool);
console.log(_bool); //true
}

  调用转换函数返回的值是true还是false,取决于要转换的数据类型及其实际值。下表给出了各种数据类型及其相对应的转换规则:

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

Number类型

  ECMAScript中的Number类型使用了IEEE754格式来表示整数和浮点数值,支持各种数值类型。关于Number类型有几点可以讨论下。

浮点数值

  所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有以为数字。为了减小存储数值的时的内存占用(保存浮点数值需要的内存空间是保存整数值的两倍),ECMAScript会尽可能的将浮点数值转换为整数值。

 {
var float1 = 1.; //小数点后没有数字,解析为1
var float2 = 10.0 //整数,解析为10
}

数值范围

  由于内存的限制,ECMAScript所能保存的数值是有限的,其所能保存的最小数值和最大数值分别保存在Number.MIN_VALUE和Number.MAN_VALUE之中。在大多数的浏览器中,这两个值分别是5e-324(科学技术法)和1.7976931348623157e+308。如果某次计算的结果超出了这个数值范围,那么这个数值就会被自动转换成特殊的Infinity(正无穷)或者-Infinity(负无穷)。对Infinity和-Infinity的判断可以通过使用isFinite()函数。这个函数在参数位于最小和最大数值之间时会返回true。

 {
var result1 = 121;
var result2 = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result1)); //true
console.log(isFinite(result2)); //false
}

NaN

  NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作但未返回数值的情况(这样就不会抛出错误)。NaN本身具有两个非同异常的特点。

    • 任何涉及NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题。
    • NaN与任何值都不相等,包括NaN自身。也就是说,NaN == NaN这条语句总是会返回false。

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

 {
console.log(isNaN(NaN)); //true
console.log(isNaN(100)); //false(100是一个数值)
console.log(isNaN('100')); //false(可以转换成数值100)
console.log(isNaN('blue')); //true(不能转换成数值)
console.log(isNaN(false)); //false(可以转换成数值1)
}

  isNaN()也是适用于对象的,但是这里不讨论,下面+。

数值转换

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

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

    • 如果是Boolean值,true和false将分别被转换为1和0。
    • 如果是数字值,只是简单的传入和返回。
    • 如果是null值,返回0。
    • 如果是undefined,返回NaN。
    • 如果是字符串,遵循如下规则。
      • 如果字符串中只包含数字,则将其转换为十进制数值(前导的零会被忽略)。
      • 如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值(前导的零会被忽略)。
      • 如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值。
      • 如果字符串是空的,则将其转换为0。
      • 如果字符串中包含出上述格式之外的字符,则将其转换为NaN。
    • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
 {
var num1 = Number('hello'); //转换为NaN,不包含任何有意义的数字值
var num2 = Number(''); //转换为0,空字符串
var num3 = Number('00101'); //转换为101,忽略前导零
var num4 = Number('true'); //转换为1,布尔值的转换规则
var num5 = Number('0012.3'); //转换为12.3,忽略前导零
}

  相比较Number函数对字符串复杂和不合理的转换规则,parseInt()函数对字符串的转换则相对比较简单和合理,所以更常用。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。也就是说,用parseInt()转换空字符串会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

 {
var num1 = parseInt('5656hello'); //
var num2 = parseInt(''); //NaN
var num3 = parseInt('33.4'); //
var num4 = parseInt('33'); //
}

  可以为parseInt()提供第二个参数:转换时使用的基数(即多少进制)。如果知道要解析的值是十六进制格式的字符串,那么可以指定基数16作为第二个参数。

 {
var num1 = parseInt('0xAf', 16); //175,十六进制转换
var num2 = parseInt('AF', 16); //175,传入第二个参数时,十六进制的'0x'可以省略
var num3 = parseInt('AF'); //NaN
}

  与parseInt()函数类似,parseFloat()也是从第一个字符开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。其次,如果字符串包含的是一个可解析的为整数的数,parseFloat()会返回整数。

 {
var num1 = parseFloat('456red'); //456,解析为整数
var num2 = parseFloat('22.5'); //22.5
var num2 = parseFloat('123.123.12'); //123.123,第一个小数点有效,第二个小数点无效
var num3 = parseFloat('052.2'); //52.5,忽略前导零
var num3 = parseFloat('0.125e7'); //31250000,科学计数法
}

String类型

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

字符字面量

  String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。转义序列可以在出现在字符串中的任意位置,而且也将被作为一个字符来解析。转义序列有这些。

字面量 含义
\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表示希腊字符Σ

  任何字符串的长度都可以通过访问其length属性取得。

 {
var text = 'Some words.'
console.log(text.length); //
}

字符串的特点

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

 {
var text = 'Some words';
text = text + 'for you.'; //将原text字符串变量'Some words'和新创建字符串值'for you.'连接,得到新的字符串值'Some words for you.',并将新的字符串值填充text变量。
}

转换为字符串

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

  第一种方式是使用几乎每一个值都有的toString()方法(null和undefined只有这个方法)。这个方法会返回相应值的字符串表现。

 {
var num = 11;
var numToString = num.toString(); //'11'
var bool = true;
var boolToString = bool.toString(); //'true'
}

  调用数值的toString()方法时,可以传递一个参数:输出数值的技术。默认情况下,toString()方法以十进制格式返回数值的字符串表示。而通过传递参数,toString()可以输出二进制、八进制、十六进制、乃至其他任意有效进制格式表示的字符串值。

 {
var num = 10;
console.log(num.toString()); //'10'
console.log(num.toString(2)); //'1010'
console.log(num.toString(8)); //'12'
console.log(num.toString(10)); //'10'
console.log(num.toString(16)); //'a'
}

  第二种方式能在任何类型值的情况下使用(包括null和undefined),就是调用转型函数String()。

    • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果。
    • 如果值是null,则返回"null"。
    • 如果值是undefined,则返回"undefined"。
 {
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1)); //'10'
console.log(String(value2)); //'true'
console.log(String(value3)); //'null'
console.log(String(value4)); //'undefined',value4未赋值所以是undefined
}

Object类型

  ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和方法,就可以创建自定义对象。

 {
var o = new Object();
o.name = 'myname';
}

  在ECMAScript中,Object类型是所有它的实力的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。因此,每个实例都具有下面的属性和方法。

    • constructor:保存着用于创建当前对象的函数,又称构造函数。对于前面的对象变量o而言,构造函数就是Object()。
    • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定。
    • isPropertyOf(object):用于检查传入的对象是否是当前对象的原型。
    • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。
    • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
    • toString():返回对象的字符串表示。
    • valueOf():返回对象的字符串、数值或布尔值表示。通常和toString()方法的返回值相同。

javascript篇-----数据类型的更多相关文章

  1. JavaScript 学习之第一篇JavaScript的数据类型(2016/8/29 晚 23:12)

    1. JavaScript的数据类型 JavaScript 里面有6中数据类型 Boolean String Number Undefined Null Object object(对象)类型包含了数 ...

  2. javascript篇-typeof,instanceof,constructor,toString判断数据类型的用法和区别

    javascript基本数据类型有:string,number,Boolean,undefined,null 引用类型(复杂类型):object, ES6中新增了一种数据类型:Symbol 以上数据类 ...

  3. 前端试题本(Javascript篇)

    JS1. 下面这个JS程序的输出是什么:JS2.下面的JS程序输出是什么:JS3.页面有一个按钮button id为 button1,通过原生的js如何禁用?JS4.页面有一个按钮button id为 ...

  4. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

    很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...

  5. 【转】BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

    原文转自:http://blog.jobbole.com/78738/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是 ...

  6. web前端面试试题总结---javascript篇

    JavaScript 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的 ...

  7. 前端面试知识点集锦(JavaScript篇)

    目录 1.谈谈你对Ajax的理解?(概念.特点.作用) 2.说说你对延迟对象deferred的理解? 3.什么是跨域,如何实现跨域访问? 4.为什么要使用模板引擎? 5.JavaScript是一门什么 ...

  8. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)

    (某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...

  9. 前端面试题总结(三)JavaScript篇

    前端面试题总结(三)JavaScript篇 一.谈谈对this的理解? this是一个关键字. this总是指向函数的直接调用者(而非间接调用者). 如果有new关键字,this指向new出来的那个对 ...

随机推荐

  1. vue.js基础知识篇(4):过滤器、class与style的绑定2

    代码下载:网盘 欢迎私信 第一章:过滤器 过滤器是对数据进行处理并返回结果的函数. 1.语法 语法是使用管道符"|"进行连接.过滤器可以接收参数,跟在过滤器后面,带引号的参数被当做 ...

  2. Java的HashMap实现原理整理总结

    通过Debug 探寻Java-HashMap 实现原理: 一个简单的例子,代码如下, 测试方法 main: public static void main(String[] args) { KeyOb ...

  3. JavaScript入门(四)

    一.数组 1.数组的基本概念 数组是在内存空间中连续存储的一组有序数据的集合.元素在数组中的顺序,称为下标.可以使用下标访问数组的每个元素. 2.如何声明一个数组 ①使用字面量声明:var arr = ...

  4. Android开发——xml知识之xml可绘制对象简介

    引言:摘录Android用户界面设计 Android支持各类xml可绘制对象,其中一些可绘制对象可用于实现让一个资源使用多个图片文件,另外一些则允许你在xml中真正地指定颜色,还有一些你从来都不会用到 ...

  5. chrome开发工具指南(六)

    检查和编辑页面与样式 使用 Chrome DevTools 的 Elements 面板检查和实时编辑页面的 HTML 与 CSS. 在 Elements 面板中检查和实时编辑 DOM 树中的任何元素. ...

  6. ORACLE ROWNUM解析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp53 [align=middle;" align="le ...

  7. C++中模板Template的使用

    1. 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?class用于定义类,在模板引入c++后,最初定义模板的方法为 ...

  8. [iOS] file patterns: The `public_header_files` pattern did not match any file.

    由于之前集成私有pod,遇到问题, 默认的头文件目录设置为:s.public_header_files = ‘Pod/Classes/**/*.h’:但是如果Classes目录中,你的代码文件夹层次结 ...

  9. unity3d在菜单栏,一键设置Player setting及自动打包并设置apk的存储位置

    项目进行中,领导要求能够进行一键设置Player settings及自动打包并设置apk的位置,所以自己就上网搜索了很多大神的文章.最后是完成了领导需要的功能,在这里记录并分享一下(此项指针对安卓ap ...

  10. Java线程调度—休眠

    线程休眠的方法是Thread.sleep(long millis) 和Thread.sleep(long millis, int nanos) ,均为静态方法,那调用sleep休眠的哪个线程呢?简单说 ...