JS数据类型 – JavaScript教程

上一章JavaScript教程请查看:JS生成输出
在本教程中,你将了解JavaScript中可用的数据类型。
JavaScript中的数据类型数据类型基本上指定了在程序中可以存储和操作的数据类型。
JavaScript中有六种基本数据类型,可以分为三大类:基本数据类型(或主数据类型)、复合数据类型(或引用数据类型)和特殊数据类型。字符串、数字和布尔是基本数据类型,对象、数组和函数(它们都是对象的类型)是组合数据类型,而Undefined和Null是特殊的数据类型。
原始数据类型一次只能保存一个值,而复合数据类型可以保存值和更复杂实体的集合,让我们详细讨论一下它们中的每一个。
字符串数据类型字符串数据类型用于表示文本数据(即字符序列),字符串是使用一个或多个字符周围的单引号或双引号创建的,如下所示:

var a = 'Hi there!'; // 使用单引号 var b = "Hi there!"; // 使用双引号

你可以在字符串中包含引号,只要它们不匹配封闭的引号即可。
var a = "Let's go."; // 双引号包含单引号 var b = 'He said "Hello" and left.'; // 单引号包含双引号 var c = 'We\'ll never give up.'; // 用反斜杠转义单引号

数据类型数字数据类型用于表示带或不带小数点的正数或负数,或使用指数符号表示的数字,如1.5e-4(相当于1.5× 10^-4)。
var a = 25; // 整数 var b = 80.5; // 浮点数 var c = 4.25e+6; // 指数表示法,与4.25e6或4250000相同 var d = 4.25e-6; // 指数表示法,和0.00000425一样

数字数据类型还包括一些特殊的值:∞、-∞(Infinity, -Infinity)和NaN,∞表示数学上的无穷大,它大于任何数,无穷大是一个非零数除以0的结果,如下所示:
alert(16 / 0); // 输出: Infinity alert(-16 / 0); // 输出: -Infinity alert(16 / -0); // 输出: -Infinity

而NaN表示一个特殊的非数字值,它是一个无效的或未定义的数学运算的结果,比如求-1的平方根或0除以0,等等。
alert("Some text" / 2); // 输出: NaN alert("Some text" / 2 + 10); // 输出: NaN alert(Math.sqrt(-1)); // 输出: NaN

布尔数据类型布尔数据类型只能包含两个值:true或false,它通常用于存储诸如yes (true)或no (false)、on (true)或off (false)等值,如下所示:
var isReading = true; // yes var isSleeping = false; // no

布尔值也是程序比较的结果,下面的示例比较两个变量,并在警告对话框中显示结果
var a = 2, b = 5, c = 10; alert(b > a) // 输出: true alert(b > c) // 输出: false

未定义的数据类型undefined未定义的数据类型undefined只能有一个值—未定义的特殊值undefined,如果已经声明了一个变量,但没有给它赋值,则该变量的值为undefined。
var a; var b = "Hello World!" alert(a) // 输出: undefined alert(b) // 输出: Hello World!

空数据类型null这是另一种特殊的数据类型,它只能有一个值—null值,空值null表示没有值,它并不等价于空字符串(“ ” )或0,它只是什么都不是。
通过为变量赋为null,可以显式地清空其当前内容。
var a = null; alert(a); // 输出: null var b = "Hello World!" alert(b); // 输出: Hello World! b = null; alert(b) // 输出: null

对象数据类型object对象object是一个复杂的数据类型,它允许你存储数据集合。
对象包含属性,定义为键值对。属性键(名称)总是一个字符串,但是值可以是任何数据类型,比如字符串、数字、布尔值,或者复杂的数据类型,比如数组、函数和其他对象。在接下来的章节中,你会学到更多关于对象的知识。
下面的示例将向你展示用JavaScript创建对象的最简单方法。
var emptyObject = {}; var person = {"name": "Peter", "surname": "Smith", "age": "36"}; // 更好的格式 var car = { "modal": "BMW X3", "color": "white", "doors": 5 }

如果属性名是有效的JavaScript名称,可以省略属性名周围的引号。这意味着在“first-name”周围需要引号,但在“firstname”周围是可选的,所以上面例子中的car对象也可以写成:
var car = { modal: "BMW X3", color: "white", doors: 5 }

数组数据类型arrayarray数组是一种对象类型,用于在单个变量中存储多个值。数组中的每个值(也称为元素)都有一个数字位置,称为索引,它可以包含任何数据类型的数据—数字、字符串、布尔值、函数、对象,甚至其他数组。数组索引从0开始,因此第一个数组元素是arr[0]而不是arr[1]。
创建数组最简单的方法是将数组元素指定为一个用逗号分隔的列表,用方括号括起来,如下例所示:
var colors = ["Red", "Yellow", "Green", "Orange"]; var cities = ["London", "Paris", "New York"]; alert(colors[0]); // : Red alert(cities[2]); //: New York

函数数据类型functionfunction函数是可调用的对象,它执行一个代码块。由于函数是对象,所以可以将它们赋值给变量,如下例所示:
var greeting = function(){ return "Hello World!"; } // 查看greeting变量 alert(typeof greeting) // 输出: function alert(greeting()); // 输出: Hello World!

实际上,函数可以在任何地方使用,任何其他值都可以使用。函数可以存储在变量、对象和数组中。函数可以作为参数传递给其他函数,也可以从函数返回函数。考虑以下功能:
function createGreeting(name){ return "Hello, " + name; } function displayGreeting(greetingFunction, userName){ return greetingFunction(userName); } var result = displayGreeting(createGreeting, "Peter"); alert(result); // 输出: Hello, Peter

typeof操作符类型运算符typeof可用于查找变量或操作数包含的数据类型,它可以与括号(typeof(x)或typeof x)一起使用,也可以不带括号。
typeof运算符在需要以不同方式处理不同类型值的情况下特别有用,但是需要非常小心,因为在某些情况下可能会产生意外的结果,如下面的例子所示:
// Numbers typeof 15; // 返回: "number" typeof 42.7; // 返回: "number" typeof 2.5e-4; // 返回: "number" typeof Infinity; // 返回: "number" typeof NaN; // 返回: "number". "Not-A-Number" // Strings typeof ''; // 返回: "string" typeof 'hello'; // 返回: "string" typeof '12'; // 返回: "string". // Booleans typeof true; // 返回: "boolean" typeof false; // 返回: "boolean" // Undefined typeof undefined; // 返回: "undefined" typeof undeclaredVariable; // 返回: "undefined" // Null typeof Null; // 返回: "object" // Objects typeof {name: "John", age: 18}; // 返回: "object" // Arrays typeof [1, 2, 4]; // 返回: "object" // Functions typeof function(){}; // 返回: "function"

在上面的示例中,你可以清楚地看到,当我们使用typeof操作符(第22行)测试null值时,它返回的是“object”而不是“null”。
【JS数据类型 – JavaScript教程】这是JavaScript中一个长期存在的bug,但是由于web上有很多代码都是围绕这种行为编写的,因此修复它会产生更多的问题,所以修复这个问题的想法被设计和维护JavaScript的委员会拒绝了。

    推荐阅读