JavaScript学习总结(一):数据类型详解

学习一门编程语言,首先要搞清楚其基本语法。就像是看一本小说,首先需要知道主人公是谁。

一、变量

如果说JavaScript是一本小说的话,那么主角一定是变量。它是如何使用这门语言的关键。和其他编程语言有所不同,JavaScript中的变量是松散类型的,可以用来保存任何类型的数据。
定义一个变量,就像是给小说的主人公起名字一样容易:var message = hi;
一本小说当然不可能只有主角,其他角色也很关键。而变量当然也不止一个。因此,可以使用一条语句定义多个变量。

var message = "hi";
    found = false;
    age = 6;

二、数据类型

在JavaScript中,总共有6种数据类型。

  • 简单数据类型:
    1. undefined(未定义)
    2. Boolean(布尔值)
    3. string(字符串)
    4. number(数值)
    5. Null(空)
  • 复杂数据类型:
  • object(对象)

那么,如何知道一个数据的数据类型呢?

1、typeof操作符

对一个值使用typeof操作符,通过返回的字符串便可以得知这个值的数据类型。
例如:

alert(typeof 66); // "number"
alert(typeof "star");// "string"

调用typeof null会返回“object”,这是因为null是一个特殊值,被认为是一个空的对象的引用。但调用typeof function 却会返回“function”,虽然函数在ECMAscript中是对象,不是一种数据类型,但是函数有一些特殊的属性,所以用typeof区分函数和其他对象是有必要的。

2、undefined类型

undefined,如同它的字面意思,就是“未定义”。在使用var声明变量但未对其进行初始化的时候,这个变量的值就是undefined。

var i;
alert(i); // "undefined"

但要注意一点,没有使用var声明的变量,虽然也可以使用typeof操作符返回undefined值,但这样会造成一个问题:当我们对一个变量使用typeof操作符, 如果返回了undefined,却无法得知这个变量是否被声明,因此,使用变量前一定要声明变量。

3、Null类型

Null也只有一个值,这个值是null。用typeof检测null值时会返回object,因为null表示一个空对象指针。
Null值实际上和undefined有这样的关系:
alert(null == undefined); // true
undefined值是派生自null值的,因此返回了true,但二者实际上用途完全不同。

4、Boolean类型

说到Boolean类型,给人的第一感觉是简单明确,只有两个值true和false。true代表真,false代表假,布尔值非真既假,简单粗暴,不像我们所处的世界,除了正义和邪恶之外,还有夹杂在二者之间的灰色地带,说不清道不明。
将一个值转化为其对应的Boolean值,可以调用转型函数Boolean()。
var a = "star";
var aAsBoolean = Boolean(a);
调用之后返回的值是true还是false,取决于要转换值的数据类型和实际值。

5、Number类型

ECMA-262(JavaScript标准)定义了不同的数值字面量格式。

  • 十进制:
    var num = 66;
  • 八进制:
    var num = 070 // 56
  • 十六进制:
    var num = 0xA; //10
    在进行算术运算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
    保存浮点数值和整数值不同,浮点数值必须要有一个小数点,所需要的内存空间是整数值的两倍。
    使用浮点数值:
    var num = 0.1;
    对于极大或极小的数值,可以用e表示法表示:
    var floatNum = 3.125e7; //31250000
    var floatNum = 3E-17;// 0.00000000000000003
    虽然浮点数最高精度是17位小数,但使用JavaScript进行算术计算时会出现一定的误差,比如0.1+0.2:
    alert(0.1 + 0.2); //0.30000000000000004
    0.1+0.2并没有返回0.3,这是为什么呢?
    在网上查找相关的资料中解释如下:

JavaScript的number类型按照ECMA的JavaScript标准,它的Number类型就是IEEE 754的双精度数值,相当于java的double类型。IEEE 754标准《二进制浮点数算法》(www.ieee.org)就是一个对实数进行计算机编码的标准。因此精度问题不止JS这门语言独有。
无论是用纸张记录数值,还是用计算机记录数值,都必须用某种编码方案来表达数值。必须理解的是,用编码表达的数值不是数值本身,而只是数值的一种人类或计算机可理解的描述。任何编码方案都有其局限,要么是表达范围(精度)方面的限制,要么是其他复杂性方面的制约。
绝对完美的数值编码方案是不存在的,为了处理方便,这个标准引入了大量的折衷和妥协,建立在这种表达方式上的算法(例如除法运算)也一样。由于数值表达方式存在“缺陷”,运算结果不可避免地堆聚起越来越多的误差。
按IEEE 754格式保存的浮点数精度相当于带有15、16或17位小数位数的十进制小数,由于存在二进制和十进制的转换问题,具体的位数会发生变化。要获得最高的转换精度,必须指定17位的小数——此时可以相信前15位的精度。
在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数)、0.100000000000000000000000001(27位小数)、0.1000000000000000000000000456(28位小数)、0.09999999999999999999999(23位小数),显示出来的结果都是数值0.1。又如,如果输出1/3的有理数表达式,结果是0.3333333333333333。
因此JavaScript小数在做四则运算时,精度会丢失。当然也有一些方法可以来保证一定的精度:http://jiangzhengjun.iteye.com/blog/4...也有人总结了一些原则:
原则
■ 大多数Web页面不需要小数 避免使用小数,尽量设法使用整数。确保数组的索引都是整数。按分(而不是元)计算金额。百分比放大100倍计算以避免出现小数。尽可能不用除法(/)和模(%)运算,因为大多数情况下它们直接导致出现浮点数。如果必须使用除法,立即用Math.round方法回归整数运算。
■ 如果必须使用浮点数,则尽可能引入冗余小数位——即在程序要求的运算精度之外,再增加小数位 如果程序需要5位数字的小数精度,则在运算中至少保留6位的小数,8位更好。冗余位越多,累计误差的影响越小。
■ 避免在同一个表达式中使用相差太大或太小的数值 对两个非常接近的数值执行减法或比较操作很容易出错。将很小的数值和很大数值相加无异于浪费时间,小的数值很可能被当作0。不过,很小的数值乘以很大的数值一般不会出现问题,例如2 * 12345678会得到正确的结果24691356。但是,0.1 - 0.09的结果是0.010000000000000009。
■ 用isFinite()和isNaN()检查运算结果 通过表单提交任何数值运算结果之前,一定要先检查数据的合法性。
■ 慎用数值运算 程序涉及的数值运算越少,引入误差的可能就越小。视浮点数为贵客,不可任意驱使。

因为内存的限制,ECMAscript有一个最大值和最小值,如果超出这个范围内的值,则会被表示成Infinity(负数是-infinity)。若想看一个值是否介于这个范围之内,可以使用isFinite()函数。

还有一个特殊的值:NaN。这个值表示非数值,即一个本来要返回数值的操作数未返回数值的情况。
NaN有两个非同寻常的特点:

  • NaN !== NaN
  • 任何涉及NaN的操作,比如NaN/10,都会返回NaN。
    而isNaN()函数可以帮我们确定一个数值是否是NaN,也就是是否“不是数值”。

数值转换,有三个函数可以把非数值转换成数值:Number()、parseInt()、parseFloat()。

6、string类型

string类型用于表示由0或多个16位Unicode字符组成的字符序列,即字符串。
字符串用单引号‘’和双引号“”表示都可以,但引号必须匹配,不能左边单引号右边双引号。
任何字符串的长度可以用length属性获得:

var str = 'hello world';
alert(str.length);

如果想把一个值转换成字符串,可以使用两种方法:

  • toString()方法
    几乎每个值都有这个方法,但null和undefined没有这个方法。
  • String()转型函数
    在不知道要转换的值是否是null或undefined时,可以使用这个转型函数,可以将任何值转换为字符串。
    如果是null,则返回null。
    如果是undefined,则返回undefined。

7、object类型

对象,实际上就是一组数据和功能的集合。在ECMAscript中,object类型是所有它的实例的基础,这也就是为什么说JavaScript中万物皆对象。

由于对象既关键又复杂,这里不再赘述,将会在之后专门的文章中总结对象相关的知识。

你可能感兴趣的:(JavaScript学习总结(一):数据类型详解)