数据类型
JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型,如:
var x // x 为 undefined
var x = 6; // x 为数字
var x = "Bill"; // x 为字符串
但是 JavaScript 是有类型的。 其中每一个变量都是有类型的,JavaScript 的数据类型,共有六种:(ES6又新增 Symbol 类型,在此不介绍。)
- 数值(number)
- 字符串(string)
- 布尔值(boolean)
- 对象(object)
- undefined
- null
字符串(string)
字符串是存储字符(比如 "Bill Gates")的变量。 字符串可以是引号中的任意文本。可以使用单引号或双引号:
var carname="Bill Gates";
var carname='Bill Gates';
当字符串本身包含引号的时候,可以使用合理使用单引号或者双引号避开:
var answer="Nice to meet you!";
var answer="He is called 'Bill'";
var answer='He is called "Bill"';
数值(number)
JavaScript 只有一种数字类型。数字可以是整数,也可以是浮点数(可以带小数点,也可以不带):
var x1=34.00; //使用小数点来写
var x2=34; //不使用小数点来写
极大或极小的数字可以通过科学(指数)计数法来书写:
var y=123e5; // 12300000
var z=123e-5; // 0.00123
数值范围
JavaScript Number不能表示所有数字,有个范围
- Number.MIN_VALUE: 5e-324
- Number.MAX_VALUE: 1.7976931348623157e+308
如果超过这个范围数字会被转为特殊的Infinity
值表示无穷,-Infinity
表示负无穷
可以通过函数isFinite
判断数字是否是无穷
isFinite(Number.MAX_VALUE + 1); // true
isFinite(Infinity); // false
isFinite(NaN); // false
isFinite(-Infinity); // false
isFinite(0); // true
isFinite(2e64); // true
isFinite("0"); // true
NaN
NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己
NaN == NaN; //false
布尔值(boolean)
布尔(逻辑)只能有两个值:true 或 false。
var x=true
var y=false
布尔值多数用于条件语句中
对象(object)
对象又可以分成三个子类型。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
狭义的对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。在 JavaScript 中函数是一等公民,可以其他类型的数据一样,进行赋值和传递,体现了JavaScript作为“函数式语言”的本质。
狭义的对象(object)
对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:
var person={firstname:"Bill", lastname:"Gates", id:5566};
我们可以通过两种方式取出对象中的数据:
name=person.lastname;
name=person["lastname"];
这里需要明确的是,JavaScript的所有数据,都可以视为广义的对象。不仅数组和函数属于对象,就连原始类型的数据(数值、字符串、布尔值)也可以用对象方式调用。
var t = 5
t.toString() // "5"
t = true
t.toString() // "true"
但是,对于字面量,不可以直接调用函数
5.toString() // err
为了避免混淆,此后除非特别声明,本教程的”对象“都特指狭义的对象。
数组(array)
数组对象用来在单独的变量名中存储一系列的值。 我们使用关键词 new 来创建数组对象。下面的代码定义了一个名为 myArray 的数组对象:
var myArray=new Array()
有三种向数组赋值的方法(你可以添加任意多的值,就像你可以定义你需要的任意多的变量一样)。
- 使用
new Array()
新建数组
也可以使用一个整数自变量来控制数组的容量:var mycars=new Array() mycars[0]="Saab" mycars[1]="Volvo" mycars[2]="BMW"
var mycars=new Array(3) mycars[0]="Saab" mycars[1]="Volvo" mycars[2]="BMW"
var mycars=new Array("Saab","Volvo","BMW")
var mycars=["Saab","Volvo","BMW"]
我们可以工作数组下标取出数组中的数据
mycars[0] // "Saab"
函数
数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。
我们可以用如下方法声明函数:
function name(){
// 这里是要执行的代码
}
JS 中函数比较复杂,后面我们会有专门章节介绍
类型转换
ECMAScript 给开发者提供了大量简单的类型转换方法。
大部分类型具有进行简单转换的方法,还有几个全局方法可以用于更复杂的转换。无论哪种情况,在 ECMAScript 中,类型转换都是简短的一步操作。
转换成字符串
ECMAScript 的 Boolean 值、数字和字符串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。我们可以使用 toString()
方法将他们转换为字符串
var bFound = false;
bFound.toString(); // "false"
var iNum1 = 10;
var iNum2 = 10.0;
iNum1.toString(); // "10"
iNum2.toString(); // "10"
Number 类型的 toString() 方法比较特殊,它有两种模式,即默认模式和基模式。采用默认模式,toString() 方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),如下所示:
var iNum = 10;
iNum.toString(2); // "1010"
iNum.toString(8); // "12"
iNum.toString(16); // "A"
转化为数字
ECMAScript 提供了两种把非数字的原始值转换成数字的方法,即 parseInt() 和 parseFloat()。
前者把值转换成整数,后者把值转换成浮点数。只有对 String 类型调用这些方法,它们才能正确运行;对其他类型返回的都是 NaN。
var iNum1 = parseInt("12345red"); //返回 12345
var iNum1 = parseInt("0xA"); //返回 10
var iNum1 = parseInt("56.9"); //返回 56
var iNum1 = parseInt("red"); //返回 NaN
var fNum1 = parseFloat("12345red"); //返回 12345
var fNum2 = parseFloat("0xA"); //返回 NaN
var fNum3 = parseFloat("11.2"); //返回 11.2
var fNum4 = parseFloat("11.22.33"); //返回 11.22
var fNum5 = parseFloat("0102"); //返回 102
var fNum1 = parseFloat("red"); //返回 NaN
当然有更简单的方法
var str = "5.1"
var num = +str // 5.1
转化为布尔值
var t = 0
var b = !!t // false
强制类型转换
ECMAScript 中可用的 3 种强制类型转换如下:
- Boolean(value) - 把给定的值转换成 Boolean 型;
- Number(value) - 把给定的值转换成数字(可以是整数或浮点数);
- String(value) - 把给定的值转换成字符串;
var b1 = Boolean(""); //false - 空字符串
var b2 = Boolean("hello"); //true - 非空字符串
var b1 = Boolean(50); //true - 非零数字
var b1 = Boolean(null); //false - null
var b1 = Boolean(0); //false - 零
var b1 = Boolean(new object()); //true - 对象
Number(false) // 0
Number(true) // 1
Number(undefined) // NaN
Number(null) // 0
Number("1.2") // 1.2
Number("12") // 12
Number("1.2.3") // NaN
Number(new object()) // NaN
Number(50) // 50
var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //会引发错误
typeof运算符
JavaScript有三种方法,可以确定一个值到底是什么类型。
typeof
运算符instanceof
运算符Object.prototype.toString
方法
instanceof
运算符和Object.prototype.toString
方法,将在后文相关章节介绍。这里着重介绍typeof
运算符。
typeof
运算符可以返回一个值的数据类型,可能有以下结果。
(1)原始类型
数值、字符串、布尔值分别返回number
、string
、boolean
。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
(2)函数
函数返回function
。
function f() {}
typeof f
// "function"
(3)undefined
undefined
返回undefined
。
typeof undefined
// "undefined"
利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。
v
// ReferenceError: v is not defined
typeof v
// "undefined"
实际编程中,这个特点通常用在判断语句。
// 错误的写法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正确的写法
if (typeof v === "undefined") {
// ...
}
(4)其他
除此以外,其他情况都返回object
。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
从上面代码可以看到,空数组([]
)的类型也是object
,这表示在JavaScript内部,数组本质上只是一种特殊的对象。另外,null
的类型也是object
,这是由于历史原因造成的,为了兼容以前的代码,后来就没法修改了,并不是说null
就属于对象,本质上null
是一个类似于undefined
的特殊值。
既然typeof
对数组(array)和对象(object)的显示结果都是object
,那么怎么区分它们呢?instanceof运算符可以做到。
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
null 和 undefined 的区别
null
与undefined
都可以表示“没有”,含义非常相似。将一个变量赋值为undefined
或null
,从语义上其实并没有什么区别。
var a = undefined;
// 或者
var a = null;
上面代码中,a变量分别被赋值为undefined
和null
,这两种写法的效果几乎等价。
在if
语句中,它们都会被自动转为false
,相等运算符(==
)甚至直接报告两者相等。
if (!undefined) {
console.log('undefined is false');
}
// undefined is false
if (!null) {
console.log('null is false');
}
// null is false
undefined == null
// true
对于null
和undefined
,可以大致可以像下面这样理解。
null
表示空值,即该处的值现在为空。典型用法是:
- 作为函数的参数,表示该函数的参数是一个没有任何内容的对象。
- 作为对象原型链的终点。
undefined
表示不存在值,就是此处目前不存在任何值。典型用法是:
- 变量被声明了,但没有赋值时,就等于undefined。
- 调用函数时,应该提供的参数没有提供,该参数等于undefined。
- 对象没有赋值的属性,该属性的值为undefined。
- 函数没有返回值时,默认返回undefined。
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined
参考
- 数据类型转换