JavaScript/原始数据类型
原始类型使用固定格式;一些类型只能包含有限数量的特定值。相反,对象更复杂,尤其是包括方法和属性。
除了null
和undefined
,原始类型都有相应的 对象包装器,具有特定数据类型的方法。因此,您将在本页上找到一些方法的描述。
字符串是一种数据类型,用于保存任意长度的文本。字符串变量通过将字符串文字赋值给它们来创建。字符串文字可以包含在" "
或' '
中。
"use strict";
const myName_1 = "Mike"; // double quote
const myName_2 = 'Monica'; // apostrophe
const myName_3 = "naɺ̠ɯçito"; // non-latin characters
如果您的字符串文字包含"
或'
,您可以使用另一个作为外部定界符,或者用\
进行转义。
"use strict";
const book_1 = "Mike's book";
const monica_1 = 'Here name is "Monica".';
const book_2 = 'Mike\'s book';
const monica_2 = "Here name is \"Monica\".";
如果您的字符串文字是通过一些固定文本加上一些动态部分计算出来的,您可以使用模板文字技术。在这里,文字包含在反引号` `
中,并包含变量和表达式。
"use strict";
const a = 1;
const b = 2;
const resultMessage = `The sum of ${a} and ${b} is: ${a + b}.`;
// same as:
'The sum of ' + a + ' and ' + b + ' is: ' + (a + b);
alert(resultMessage);
+
运算符连接两个字符串,例如alert("Hello " + "world!");
。此外,还有很多 方法用于字符串。
提示:JavaScript 没有类似 '字符' 或 '字节' 的数据类型。
我们展示了一些经常使用的方法。有关完整列表,请参阅 MDN。
length
是一个属性,而不是一个方法。因此没有括号()
。它返回字符串的长度作为一个整数。
const foo = "Hello!";
alert(foo.length); // 6
如果字符串包含指定的字符串,则该方法返回true
,否则返回false
。
let text = "Hello world, hello Wikiversity!";
document.write(text.includes("Hello")); //true
该方法返回一个字符串,其中 'text' 附加到原始字符串。
const foo = "Hello";
const bar = foo.concat(" World!");
alert(bar); // Hello World!
该方法返回 'searchText' 第一次出现的索引,从 0 开始。如果找不到 'searchText',则返回 -1。该方法区分大小写。
const foo = "Hello, World! How do you do?";
alert(foo.indexOf(" ")); // 6
const hello = "Hello world, welcome to the universe.";
alert(hello.indexOf("welcome")); // 13
该方法将字符串与正则表达式(=模式)进行比较,返回字符串中第一个匹配项的索引。它类似于indexOf()
,但功能强大得多。例如:可以通过将"hello"
中的引号替换为正斜杠和末尾的i
来使其不区分大小写。
let text = "Hello world, hello Wikiversity!";
document.write(text.search(/hello/i)); // 0
该方法返回 'searchText' 最后一次出现的索引。如果找不到 'searchText',则返回 -1。该方法区分大小写。
const foo = "Hello, World! How do you do?";
alert(foo.lastIndexOf(' ')); // 24
该方法返回一个字符串,其中 'text' 在原始字符串中被 'NewText' 替换。只替换第一个出现的字符。该方法区分大小写。
const foo = "foo bar foo bar foo";
const newString = foo.replace("bar", "NEW"):
alert(foo); // foo bar foo bar foo
alert(newString); // foo NEW foo bar foo
正如您所见,replace
方法只返回新内容,不会修改 'foo' 中的原始字符串。
该方法返回从 'start' 位置开始的子字符串。
"hello".slice(1); // "ello"
当提供 'end' 时,它们将提取到,但不包括结束位置。
"hello".slice(1, 3); // "el"
slice
允许通过使用负索引来提取从字符串末尾引用的文本。
"hello".slice(-4, -2); // "el"
与substring
不同,slice 方法永远不会交换 'start' 和 'end' 位置。如果 'start' 在 'end' 之后,slice
将尝试按原样提取内容,但很可能会提供意外的结果。
"hello".slice(3, 1); // ""
该方法已 弃用。请改用substring
或slice
。
该方法提取从 'start' 位置开始的子字符串。
"hello".substring(1); // "ello"
当提供 'end' 时,它们将提取到,但不包括结束位置。
"hello".substring(1, 3); // "el"
substring
始终从左到右工作。如果 'start' 位置大于 'end' 位置,substring
将交换值;虽然有时有用,但这并不总是你想要的;slice 提供了不同的行为。
"hello".substring(3, 1); // "el"
该方法返回当前字符串的小写形式。
const foo = "Hello!";
alert(foo.toLowerCase()); // hello!
该方法返回当前字符串的大写形式。
const foo = "Hello!";
alert(foo.toUpperCase()); // HELLO!
数字
[edit | edit source]Number 是两种数值类型之一(另一种是 BigInt)。Number 使用 IEEE 754 定义的统一 64 位格式存储整数和浮点数。这意味着,与其他一些语言不同,JavaScript 没有为整数和浮点数使用不同的数据类型。
此类值的可能范围大约为 -10300 到 +10300,精度随距离 0 的距离而变化。
在 -(253 − 1) 到 +253 − 1 的范围内,整数运算没有不确定性。253 = 9,007,199,254,740,992,略小于 1016。
"use strict";
let counter = 20; // no decimal point
alert(counter + " " + typeof counter);
let degree = 12.1; // with decimal point
alert(degree + " " + typeof degree);
对于 Number,可以使用通常的算术运算符(“幂”是 **
,“模”是 %
)、比较运算符(<
、>
等)和位运算符。
与其他一些语言相反,两个整数的除法可能导致带有小数点的数字,例如 alert(1/3);
。
数字的属性和方法
[edit | edit source]许多属性和方法支持数字运算。在内部,它们在不同的区域实现。
- 内置对象
Math
提供表示常见数学常数(如 π 或 e)的属性。语法:Math.xyz
(无括号) - 内置对象
Math
提供常见的数学函数,如 sin 或 log。语法:Math.xyz()
(带括号) - 对象
Number
提供描述数字数据类型实现的属性,如 MAX_VALUE 或 NEGATIVE_INFINITY。语法:Number.xyz
(无括号) - 对象
Number
提供用于检查数字和其他数据类型之间关系的 静态 方法,例如 isInteger 或 parseFloat。语法:Number.xyz()
(带括号) - 对象
Number
提供作用于具体数字值或变量的 实例 方法,例如 toExponential 或 toFixed。语法:value.xyz()
(带括号)
// some examples
"use strict";
const var_1 = Math.PI;
alert(var_1);
alert(var_1.toFixed(2));
const var_2 = Math.sqrt(3);
alert(var_2);
alert(Number.MAX_VALUE);
alert(Number.isInteger(123)); // true
alert(Number.isInteger(12.3)); // false
我们展示了一些经常使用的属性和方法。有关完整列表,请参阅 MDN Math 和 MDN Numbers。
属性
[edit | edit source]最常用的常数
Math.E
返回常数 e。Math.PI
返回常数 pi。Math.LN10
返回 10 的自然对数。Math.LN2
返回 2 的自然对数。Math.SQRT2
返回 2 的平方根。
Math.ceil(number)
[edit | edit source]返回作为参数传入的数字的最小整数。
const myInt = Math.ceil(90.8);
alert(myInt); // 91
alert(Math.ceil(-90.8)); // -90
Math.floor(number)
[edit | edit source]返回作为参数传入的数字的最大整数。
const myInt = Math.floor(90.8);
alert(myInt); // 90
alert(Math.floor(-90.8)); // -91
Math.round(number)
[edit | edit source]返回作为参数传入的数字的最接近的整数。
alert(Math.round( 90.8)); // 91
alert(Math.round(-90.8)); // -91
alert(Math.round( 90.3)); // 90
alert(Math.round(-90.3)); // -90
Math.max(number_1, number_2)
[edit | edit source]返回作为参数传入的两个数字中较大的一个。
alert(Math.max(8.3, 9)); // 9
alert(Math.max(8.3, -9)); // 8.3
Math.min(number_1, number_2)
[edit | edit source]返回作为参数传入的两个数字中较小的一个。
alert(Math.min(8.3, 9)); // 8.3
alert(Math.min(8.3, -9)); // -9
Math.random()
[edit | edit source]生成 0 到 1 之间的伪随机数。
alert(Math.random());
Number.parseInt(string)
[edit | edit source]Number.parseFloat(string)
[edit | edit source]parseInt
和 parseFloat
这两种方法将字符串转换为数字。它们从左到右扫描给定的字符串。当它们识别出与 0-9 不同的字符时,它们将停止扫描并返回到目前为止读取的已转换数字(parseFloat 接受小数点)。如果第一个字符与 0-9 不同,它们将返回 Math.NaN,表示 非数字。
提示:在源代码中不需要指定“Number.”。
const x = parseInt("7.5");
alert(x); // 7
const y = parseInt("Five");
alert(y); // NaN
const z = parseFloat("2.8") + 3;
alert(z); // 5.8
// scientific notation is accepted
alert(parseFloat("123.456e6")); // 123456000
BigInt
[edit | edit source]BigInt 是一种表示任意长度的整数的数据类型。因此,它是一种可变长度格式(概念上),仅受可用 RAM 的限制。
BigInt 的创建方式是在整数字面量末尾添加“n”,或使用 BigInt()
函数。
"use strict";
let hugeNumber_1 = 12345678901234567890n; // 'n' at the end
alert(typeof hugeNumber_1);
let hugeNumber_2 = BigInt("12345678901234567890"); // no 'n'
alert(typeof hugeNumber_2);
// a 'small' BigInt can be created out of an integer value
let hugeNumber_3 = BigInt(123);
alert(typeof hugeNumber_3);
BigInt 支持算术运算符 + - * / **
、比较运算符和大多数位运算符。
布尔值
[edit | edit source]布尔变量可以包含两个可能的值之一,true
或 false
。JavaScript 使用布尔 false、数字 0、NaN、空字符串或内置类型 undefined 或 null 来表示 false
。任何其他值都被视为 true
。
"use strict";
let firstLoop = true;
alert(typeof firstLoop);
未定义
[edit | edit source]仅声明但未初始化任何值的变量具有 undefined 数据类型。
"use strict";
let x;
// ...
alert(typeof x);
if (x == undefined) {
// remedy the missing initialization
x = 0;
}
alert(typeof x);
// ...
空值
[edit | edit source]在 JavaScript 中,null 被标记为原始值之一,因为它的行为看似原始。但是,使用 typeof
运算符时,它会返回“object”。这被认为是一个错误,但无法修复,因为它会破坏太多脚本。[1]
符号
[edit | edit source]Symbol 代表一个唯一的标识符。Symbol 可以有一个描述符,作为字符串提供给它的构造函数。
"use strict";
// 'person' is a symbol with the description "Olaf"
const person = Symbol("Olaf");
alert(person.description); // Olaf
Symbols 用作对象中的键(嵌入在 [ ]
中)以保证唯一性。