数据类型决定了一个数据的特征,即限定了该数据必须按照一定的规则进行操作。在程序设计中也 是如此,特定数据类型的数据会有其相应的行为模式。
JavaScript 中有以下 5 种基本数据类型。
- 字符串型
- 数值型
- 布尔型
- null 型
- undefined 型
在这 5 种基本数据类型之外的都被称为 Object 类型。也就是说,总的来看,JavaScript 中的数据类型可以分为 6 种。
像 Java 这样,变量具有数据类型的语言,被称为静态数据类型语言;而像 JavaScript 这样,变量没有类型的语言,则被称为动态数据类型语言。
对于 Java 来说,内建类型(int 或 double 之类)之外的都是用户自定义类型。用户自定义类型又可以分为类和接口两种类型。Java 的用户自定义类型的使用方法,从其名称中就可略知一二,即开发者需要书写该类型的定义语句来定义该类型。而对象则作为这些由用户定义的数据类型的实例(实体)存在。这就是 Java 的基本特性。这种编程风格被称为基于类的语言风格。
另一方面,在 JavaScript 的语言规范中,不存在定义数据类型的语句。不需要使用特别的语句就能定义一个对象的属性或方法,而这样也就决定了该对象的类型。所谓类型也就是行为方式上的共性。由于每个对象都具有共同的行为方式,所以可以使用原型对象。这样的编程风格被称为基于原型的风格。
虽然 JavaScript 的变量不具有数据类型,但从概念上,JavaScript 变量可以分为基本数据类型变量和引用类型变量。基本数据类型变量直接保存有数值等类型的数据的值,而引用类型变量则保存有对象的引用。尽管表面上两者没有区别,但其内在是不同的。因此为了正确地理解其内部实现原理,就需要引入引用这一概念.
在 ECMAScript 标准中,内建数据类型(built-in type)分为 5 种基本数据类型以及 Object 类型。
avaScript 的字符串型是基本数据类型,而 Java 的字符串型并不是基本数据类型,这是两者的区别之一。不过,其实两者在本质上并没有太大的不同。因为在 Java 中,字符串型和字面量以及运算符一样,属于被特别对待的 Object 类型。字符串连接运算符(+ 号)在 Java 和 JavaScript 中的作用也是相同的。在 JavaScript 中,字符串值会被隐式地转换为字符串对象类型。熟悉 Java 的人很容易就能掌握JavaScript 中字符串型的用法。不过在 JavaScript 中不存在字符类型。如果需要表达某个字符的话,请使用长度为 1 的字符串值。
JavaScript 只有一种数值类的数据类型,其内部构造为 64 位的浮点小数,这相当于 Java 中的 double 类型。和 JavaScript的情况不同,在 Java 中有 5 种整数类型和 2 种浮点数类型。JavaScript 之所以只支持一种数值类型,是由于设计当初更多地着眼于降低编程难度,而非提升运行效率。如果有多种数值类型,就不得不在考虑在进行赋值时考虑是否会产生错误。而 JavaScript 数值只有一种数值数据类型,除了部分特殊情况,通常不会发生类型转换错误。从另一方面来说,由于数值类型能够与其他类型进行隐式转换,所以仍然存在大量陷阱。
布尔型在 Java 和 JavaScript 中是没有区别的,同样都是使用 true 和 false 的字面量。
null 类型的值只有 null 一种情况,并且 null 属于字面量。虽然 Java 中也存在 null 这一字面量,但是没有 null 类型,null只是一种可以被引用的值而已。尽管有这样的差别,但是 Java 中的 null 和 JavaScript 中的 null 在用法上几乎没有区别,只需要注意一下类型转换的问题即可。
undefined 类型是指未定义的值的类型,这一概念在 Java 中是不存在的。如果在 Java 中使用类似于 undefined 类型的值的话,就会发生编译错误。
// 字符串值可以通过字符串字面量来表示。 // 字符串字面量需要用双引号(")或单引号(')括起来。 var hzh = "hzh"; // 将字符串"hzh"值赋给变量hzh console.log("hzh:" + hzh); // 显示变量hzh的值 var hzh = 'hzh'; // 将字符串"hzh"值赋给变量hzh console.log("hzh:" + hzh); // 显示变量hzh的值
特殊字符可以通过转义字符(串)来表示。可以通过在转义符之后使用特定字符,来表达一些特殊的含义。转义符是反斜杠(\)。例如,\n 是换行符的表达方式。
// 因为可以用两种引号来包围字符串字面量 // 所以只要对此加以活用,就能够少用转义字符。 // 例如,在包含大量双引号的字符串字面量外使用单引号, // 就能够减少转义字符的出现。 // 对于双引号不需要使用转义字符(当然转义字符也没有问题) var hzh1 = '我说"黄子涵是帅哥!"'; console.log("hzh1 = " + hzh1);
// 如果在右侧书写的是值为字符串值的变量,也一样能将其值赋值给等号左侧的变量。 var hzh1 = '黄子涵'; // 将字符串值'黄子涵'赋值给变量hzh var hzh2 = hzh1; // 将变量hzh1赋值给变量hzh2 console.log("hzh1:" + hzh1); // 输出变量hzh1的值 console.log("hzh2:" + hzh2); // 变量hzh2的值为字符串'黄子涵' console.log("**************************************************"); console.log("**************************************************"); // 不过 JavaScript 确实和Java 一样,其字符串型是不可变类型。 var hzh3 = "黄子涵"; var hzh4 = "是帅哥!" var hzh5 = hzh3 + hzh4; // 连接字符串值 console.log("hzh3:" + hzh3); // 变量hzh5的值为字符串值“黄子涵是帅哥!” console.log("hzh4:" + hzh4); console.log("hzh5:" + hzh5); console.log("**************************************************"); console.log("**************************************************"); // += 运算符可以在连接字符串的同时进行赋值。 var hzh6 = "黄子涵"; hzh6 += "是靓仔!" console.log("hzh6:" + hzh6); // 变量hzh6的值为字符串值“黄子涵是靓仔” console.log("**************************************************"); console.log("**************************************************"); var hzh7 = "黄子涵"; var hzh8 = hzh7; hzh7 += "真厉害!" // 变量hzh7的值为字符串值“黄子涵真厉害” console.log("hzh7:" + hzh7); console.log("hzh8:" + hzh8); // 变量hzh8的值仍保持为字符串值“黄子涵” console.log("**************************************************"); console.log("**************************************************"); // 可以通过typeof运算符来获知值的数据类型 console.log(typeof "黄子涵"); // 对字符串字面量进行typeof运算 var hzh9 = "黄子涵"; console.log(typeof hzh9); // 对变量hzh9进行typeof运算 console.log(typeof (hzh9)); // 也可以添加括号 console.log(typeof (typeof (hzh9))); // typeof运算的结果也是字符串值
JavaScript 有两种等值运算符,即 === 和 。与之对应,也有两种不等运算符 ! 和 !=。
=== 和 == 的区别在于,在比较的时候是否会进行数据类型的转换。=== 在比较的时候不会对数据类型进行转换。在ECMAScript 标准中,将其称为严格相等(strict equal)。
console.log("**************************************************"); // 如果只考虑字符串之间的比较,=== 和 == 的结果是没有区别的。 // 两种方式都会判断字符串的内容是否一致。 var hzh1 = "黄子涵"; var hzh2 = "是帅哥"; var hzh3 = hzh1 + hzh2; console.log("hzh1 == hzh2?" + (hzh1 == hzh2)); console.log("hzh1 == hzh3?" + (hzh1 == hzh3)); console.log("hzh2 == hzh3?" + (hzh2 == hzh3)); console.log("hzh1 != hzh2?" + (hzh1 != hzh2)); console.log("hzh1 != hzh3?" + (hzh1 != hzh3)); console.log("hzh2 != hzh3?" + (hzh2 != hzh3)); console.log("**************************************************"); console.log("**************************************************"); //对字符串值的比较基于 Unicode 字符的编码值(编码位置)。 var hzh4 = "hzh"; var hzh5 = "HZH"; console.log("hzh4 < hzh5?" + (hzh4 < hzh5)); console.log("hzh4 <= hzh5?" + (hzh4 <= hzh5)); console.log("hzh4 > hzh5?" + (hzh4 > hzh5)); console.log("hzh4 >= hzh5?" + (hzh4 >= hzh5)); console.log("**************************************************");
console.log("**************************************************"); // 布尔型也被称为逻辑值类型或者真假值类型。 // 布尔型只能够取真(true)和假(false)两种数值。 // 除此以外,其他的值都不被支持。 var hzh1 = true; console.log("它们是true还是false?"); console.log("hzh1?" + hzh1); console.log("(!hzh1)?" + (!hzh1)); // true的否定为false console.log("(!!hzh1)?" + (!!hzh1)); // 否定的否定为肯定 console.log("**************************************************"); console.log("**************************************************"); // 对布尔值进行 typeof 运算的话,得到的结果为 "Boolean"。 console.log("它们是什么数据类型?"); console.log("true?" + true); console.log("false?" + false); console.log("hzh1?" + hzh1); console.log("(!hzh1)?" + (!hzh1)); // true的否定为false console.log("(!!hzh1)?" + (!!hzh1)); // 否定的否定为肯定 console.log("**************************************************");