JavaScript数据类型
数据类型
JavaScript 中的值始终是特定类型的。例如,字符串或数字。
JavaScript 中有八种基本数据类型。在这里,我们将概括介绍它们,在接下来的章节中,我们将详细讨论它们中的每一个。
我们可以将任何类型放入变量中。例如,一个变量有时可以是一个字符串,然后存储一个数字:
// no error let message = "hello"; message = 123456;
允许这种情况的编程语言,例如 JavaScript,被称为“动态类型”,这意味着存在数据类型,但变量不绑定到任何一种。
JavaScript 中的 8 种基本数据类型。
number对于任何类型的数字:整数或浮点数,整数受.±(253-1)
bigint 用于任意长度的整数。
string对于字符串。一个字符串可能有零个或多个字符,没有单独的单字符类型。
boolean为true/ false。
null对于未知值 - 具有单个值的独立类型null。
undefined对于未分配的值——具有单个值的独立类型undefined。
object 用于更复杂的数据结构。
symbol 用于唯一标识符。
该typeof运算符允许我们查看存储在变量中的类型。
两种形式:typeof x或typeof(x)。
返回带有类型名称的字符串,例如"string"。
对于null返回"object"——这是语言中的一个错误,它实际上不是一个对象。
数字
let n = 123; n = 12.345;
的数式表示整数和浮点数。
有许多数字运算,例如乘法*、除法/、加法+、减法-等。
除了常规数字外,还有所谓的“特殊数值”也属于这种数据类型:Infinity、-Infinity和NaN。
Infinity表示数学无穷大∞。它是一个比任何数字都大的特殊值。
我们可以通过除以零得到它:
alert( 1 / 0 ); // Infinity
或者直接引用它:
alert( Infinity ); // Infinity
NaN表示计算错误。它是不正确或未定义的数学运算的结果,例如:
alert( "not a number" / 2 ); // NaN, such division is erroneous
NaN很粘。对NaN返回的任何进一步操作NaN:
alert( "not a number" / 2 + 5 ); // NaN
所以,如果NaN数学表达式中有某个地方,它会传播到整个结果。
数学运算是安全的
在 JavaScript 中做数学是“安全的”。我们可以做任何事情:除以零,将非数字字符串视为数字等。
脚本永远不会因致命错误(“死”)而停止。在最坏的情况下,我们会得到NaN结果。
特殊数值在形式上属于“数字”类型。当然,它们不是这个词的常识中的数字。
我们将在Numbers一章中看到更多关于处理数字的内容。
长整型
在 JavaScript 中,“数字”类型不能表示大于(即)或小于负数的整数值。这是由它们的内部表示引起的技术限制。(253-1)9007199254740991-(253-1)
对于大多数目的,这已经足够了,但有时我们需要非常大的数字,例如用于密码学或微秒精度的时间戳。
BigInt type 最近被添加到语言中来表示任意长度的整数。
BigInt通过附加n到整数的末尾来创建一个值:
// the "n" at the end means it's a BigInt const bigInt = 1234567890123456789012345678901234567890n;
由于BigInt很少需要数字,因此我们不在这里介绍它们,而是将它们放在单独的一章BigInt 中。当您需要如此大的数字时,请阅读它。
兼容性问题
目前,BigIntFirefox/Chrome/Edge/Safari 支持,但 IE 不支持。
您可以查看MDN BigInt 兼容性表以了解支持哪些浏览器版本。
字符串
JavaScript 中的字符串必须用引号括起来。
let str = "Hello"; let str2 = 'Single quotes are ok too'; let phrase = `can embed another ${str}`;
在 JavaScript 中,有 3 种类型的引号。
双引号:"Hello".
单引号:'Hello'.
反引号:`Hello`。
双引号和单引号是“简单”引号。它们在 JavaScript 中几乎没有区别。
反引号是“扩展功能”引号。它们允许我们通过将它们包装在 中来将变量和表达式嵌入到字符串中${…},例如:
let name = "John"; // embed a variable alert( `Hello, ${name}!` ); // Hello, John! // embed an expression alert( `the result is ${1 + 2}` ); // the result is 3
内部的表达式${…}被计算,结果成为字符串的一部分。我们可以在里面放任何东西:一个变量,name或者一个算术表达式,1 + 2或者更复杂的东西。
请注意,这只能在反引号中完成。其他报价没有这个嵌入功能!
alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (double quotes do nothing)
我们将在字符串一章中更彻底地介绍字符串。
没有字符类型。
在某些语言中,单个字符有一种特殊的“字符”类型。例如,在 C 语言和 Java 中,它被称为“char”。
在 JavaScript 中,没有这样的类型。只有一种类型:string. 一个字符串可以由零个字符(为空)、一个或多个字符组成。
布尔(逻辑类型)
boolean 类型只有两个值:true和false。
这种类型通常用于存储是/否值:true表示“是,正确”,false表示“否,不正确”。
例如:
let nameFieldChecked = true; // yes, name field is checked let ageFieldChecked = false; // no, age field is not checked
布尔值也是比较的结果:
let isGreater = 4 > 1; alert( isGreater ); // true (the comparison result is "yes")
我们将在逻辑运算符一章中更深入地介绍布尔值。
“空”值
特殊null值不属于上述任何类型。
它形成了一个单独的类型,它只包含null值:
let age = null;
在 JavaScript 中,null它不像其他语言那样是“对不存在对象的引用”或“空指针”。
它只是一个特殊的值,代表“无”、“空”或“值未知”。
上面的代码表明这age是未知的。
“未定义”值
特殊价值undefined也与众不同。它创造了一种自己的类型,就像null.
意思undefined是“没有赋值”。
如果变量已声明但未赋值,则其值为undefined:
let age; alert(age); // shows "undefined"
从技术上讲,可以显式分配undefined给变量:
let age = 100; // change the value to undefined age = undefined; alert(age); // "undefined"
但我们不建议这样做。通常,人们习惯于null将“空”或“未知”值分配给变量,而undefined保留为未分配事物的默认初始值。
对象和符号
该object类型是特殊的。
所有其他类型都被称为“原始类型”,因为它们的值只能包含一个东西(可以是字符串或数字或其他任何东西)。相比之下,对象用于存储数据和更复杂实体的集合。
由于如此重要,对象应该得到特殊对待。在我们了解更多关于原语之后,我们将在后面的对象章节中处理它们。
该symbol类型用于为对象创建唯一标识符。为了完整起见,我们不得不在这里提及它,但也将细节推迟到我们知道对象。
操作符类型
该typeof运算符返回参数的类型。当我们想以不同的方式处理不同类型的值或只想做一个快速检查时,它很有用。
它支持两种形式的语法:
作为运营商:typeof x.
作为一个函数:typeof(x).
换句话说,它可以使用括号或不使用括号。结果是一样的。
调用typeof x返回一个带有类型名称的字符串:
typeof undefined // "undefined" typeof 0 // "number" typeof 10n // "bigint" typeof true // "boolean" typeof "foo" // "string" typeof Symbol("id") // "symbol" typeof Math // "object" (1) typeof null // "object" (2) typeof alert // "function" (3)
最后三行可能需要额外解释:
Math是一个提供数学运算的内置对象。我们将在Numbers一章中学习。在这里,它只是作为一个对象的例子。
的结果typeof null是"object"。这是一个官方认可的typeof行为错误,来自 JavaScript 的早期并保持兼容性。绝对null不是一个对象。它是一个特殊值,具有自己的单独类型。
的结果typeof alert是"function",因为alert是一个函数。我们将在接下来的章节中学习函数,我们还将看到 JavaScript 中没有特殊的“函数”类型。函数属于对象类型。但typeof以不同的方式对待它们,返回"function". 这也来自 JavaScript 的早期。从技术上讲,这种行为是不正确的,但在实践中可能很方便。