JavaScript的数据类型和变量
数据类型
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在JavaScript中定义了以下几种数据类型:
Number
JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型:
- 12 // 整数
- 3.14 // 浮点数
- 1.1e3 // 科学计数法 1.1 x 1000
- -12 // 负数
- NaN // 表示Not a Number,无法计算结果时候使用
- Infinity // 无限大
字符串
字符串是以单引号'或双引号"括起来的任意文本
布尔值
用true、false表示布尔值,也可以通过布尔运算计算出来:
- true; // 这是一个true值
- false; // 这是一个false值
- 2 > 1; // 这是一个true值
- 2 >= 3; // 这是一个false值
数组
数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。例如:
var arr = [1, 2, 3.14, 'Hello', null, true];
数组用[]表示,元素之间用,分隔。数组的元素可以通过索引来访问。请注意,索引的起始值为0.
arr[0]; // 返回索引为0的元素,即1
对象
JavaScript的对象是一组由键-值组成的无序集合,例如:
var person = { name: 'Bob', age: 20, tags: ['js', 'web', 'mobile'], city: 'Beijing', hasCar: true, zipcode: null };
要获取一个对象的属性,我们用对象变量.属性名的方式:
person.name; // 'Bob'
null和 undefined
null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
比较运算符
-
当我们对Number做比较时,可以通过比较运算符得到一个布尔值
-
==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果
-
===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较
-
唯一能判断NaN的方法是通过isNaN()函数
-
最后要注意浮点数的相等比较:
1 / 3 === (1 - 2 / 3); // false
这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个 浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
变量
变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据 类型。 变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也 不能是JavaScript的关键字,如if、while等。
申明一个变量用var语句,比如:
var a; // 申明了变量a,此时a的值为undefined
strict模式
javaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量.在同一个页面的不同的JavaScript文件中,如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以 调试的错误结果。 使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内(函数的概念将稍后讲解),同名变 量在不同的函数体内互不冲突。
为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制 通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
启用strict模式的方法是在JavaScript代码的第一行写上: 'use strict';