JavaScript编程
基本类型与对象类型
基本类型使用固定的格式,有些只能包含有限数量的特定值。与此相反,对象更复杂,尤其是包括了方法和属性。
除了 null
和 undefined
外,基本类型都有一个对应的对象包装器,包含特定数据类型的方法。因此,您将在此页面看到一些方法的描述。
字符串(String)
字符串是用于存储任意长度文本的数据类型。字符串变量是通过将字符串字面量赋值给它们来创建的。字符串字面量可以用双引号 "
或单引号 '
括起来。
"use strict";
const myName_1 = "Mike"; // 双引号
const myName_2 = 'Monica'; // 单引号
const myName_3 = "naɺ̠ɯçito"; // 非拉丁字符
如果您的字符串字面量包含 "
或 '
,可以使用另一个符号作为外部定界符,或者使用反斜杠 \
进行转义。
"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}.`;
// 与下面的内容等效:
'The sum of ' + a + ' and ' + b + ' is: ' + (a + b);
alert(resultMessage);
+
运算符用于连接两个字符串,例如:alert("Hello " +
"world!");
。此外,还有很多用于字符串的方法。
提示:JavaScript 没有类似于“字符”或“字节”的数据类型。
字符串的属性和方法
以下是一些常用的字符串方法。如果需要完整列表,请参考 MDN。
-
length
length
是一个属性,而不是方法,因此没有括号()
。它返回字符串的长度,以整数形式表示。const foo = "Hello!"; alert(foo.length); // 6
-
includes(searchText) 该方法如果字符串包含指定的子字符串,则返回
true
,否则返回false
。let text = "Hello world, hello Wikiversity!"; document.write(text.includes("Hello")); // true
-
concat(text) 该方法返回一个新字符串,原始字符串后面追加了
text
。const foo = "Hello"; const bar = foo.concat(" World!"); alert(bar); // Hello World!
-
indexOf(searchText) 该方法返回
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
-
search(regularExpression) 该方法将字符串与正则表达式进行比较,返回第一个匹配项在字符串中的索引。它与
indexOf()
类似,但功能更强大。例如,通过用正斜杠和i
(不区分大小写)替换 "hello" 的引号,可以使它不区分大小写。let text = "Hello world, hello Wikiversity!"; document.write(text.search(/hello/i)); // 0
-
lastIndexOf(searchText) 该方法返回
searchText
最后一次出现的位置。如果未找到searchText
,则返回 -1。此方法区分大小写。const foo = "Hello, World! How do you do?"; alert(foo.lastIndexOf(' ')); // 24
-
replace(text, newText) 该方法返回一个新字符串,其中
text
被newText
替换。只会替换第一次出现的text
,并且区分大小写。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
。 -
slice(start [, end]) 该方法返回一个从
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); // ""
-
substr(start [, number of characters]) 该方法已被弃用,建议使用
substring
或slice
。 -
substring(start [, end]) 该方法从
start
位置开始提取子字符串。"hello".substring(1); // "ello"
当提供
end
时,会提取到该位置(但不包括该位置)。"hello".substring(1, 3); // "el"
substring
总是从左到右工作。如果start
位置大于end
位置,substring
会交换这两个值;虽然这有时很有用,但并不总是您想要的行为。slice
提供了不同的行为。"hello".substring(3, 1); // "el"
-
toLowerCase() 该方法返回当前字符串的小写形式。
const foo = "Hello!"; alert(foo.toLowerCase()); // hello!
-
toUpperCase() 该方法返回当前字符串的大写形式。
const foo = "Hello!"; alert(foo.toUpperCase()); // HELLO!
数字(Number)
Number
是两种数字类型之一(另一种是 BigInt
)。Number
存储整数值以及浮动点值,使用 IEEE 754 定义的统一 64 位格式。这意味着,JavaScript 没有像其他一些语言那样区分整数和浮点数。
此类值的可能范围大约是从 -10³⁰⁰ 到 +10³⁰⁰,不同的精度取决于接近 0 的距离。
在从 -(2⁵³ - 1) 到 +2⁵³ - 1 的范围内,整数操作不会出现不确定性。253 = 9,007,199,254,740,992,这个值比 10¹⁶ 稍小。
"use strict";
let counter = 20; // 没有小数点
alert(counter + " " + typeof counter);
let degree = 12.1; // 有小数点
alert(degree + " " + typeof degree);
对于 Number
,可以使用常见的算术运算符(**
表示幂运算,%
表示取余),比较运算符(如 <
, >
, ...)和位运算符。
与其他一些语言不同,两个整数相除的结果可能是带小数的数字,例如:alert(1/3);
。
数字的属性和方法
处理数字时,JavaScript 提供了许多属性和方法。它们在不同的领域内部实现:
- 内置对象
Math
提供了表示常见数学常数(如 π 或 e)的属性,语法:Math.xyz
(无括号) - 内置对象
Math
提供了常见的数学函数(如sin
或log
),语法:Math.xyz()
(有括号) - 对象
Number
提供了表示数据类型number
实现的属性,如MAX_VALUE
或NEGATIVE_INFINITY
,语法:Number.xyz
(无括号) - 对象
Number
提供了静态方法,检查数字与其他数据类型的关系,例如isInteger
或parseFloat
,语法:Number.xyz()
(有括号) - 对象
Number
还提供了实例方法,作用于具体的数字值或变量,例如toExponential
或toFixed
,语法:value.xyz()
(有括号)
以下是一些例子:
"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 和 Numbers 文档。
属性
最常用的常数:
- Math.E:返回常数 e。
- Math.PI:返回常数 π。
- Math.LN10:返回 10 的自然对数。
- Math.LN2:返回 2 的自然对数。
- Math.SQRT2:返回 2 的平方根。
方法
-
Math.ceil(number) 返回大于传入参数的最小整数。
const myInt = Math.ceil(90.8); alert(myInt); // 91 alert(Math.ceil(-90.8)); // -90
-
Math.floor(number) 返回小于传入参数的最大整数。
const myInt = Math.floor(90.8); alert(myInt); // 90 alert(Math.floor(-90.8)); // -91
-
Math.round(number) 返回最接近传入参数的整数。
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) 返回传入的两个数中的较大者。
alert(Math.max(8.3, 9)); // 9 alert(Math.max(8.3, -9)); // 8.3
-
Math.min(number_1, number_2) 返回传入的两个数中的较小者。
alert(Math.min(8.3, 9)); // 8.3 alert(Math.min(8.3, -9)); // -9
-
Math.random() 生成一个介于 0 和 1 之间的伪随机数。
alert(Math.random());
-
Number.parseInt(string) Number.parseFloat(string) 这两个方法将字符串转换为数字。它们从左到右扫描给定的字符串。当遇到一个与 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 // 科学计数法也是被接受的 alert(parseFloat("123.456e6")); // 123456000
BigInt
BigInt
是一种表示任意长度整数的数据类型,因此它是一个可变长度格式(从概念上讲),仅受限于可用内存。
BigInt
可以通过在整数字面量的末尾添加一个 n
,或者使用 BigInt()
函数来创建。
"use strict";
let hugeNumber_1 = 12345678901234567890n; // 末尾加 'n'
alert(typeof hugeNumber_1);
let hugeNumber_2 = BigInt("12345678901234567890"); // 没有 'n'
alert(typeof hugeNumber_2);
// 可以从一个整数值创建一个 '小' BigInt
let hugeNumber_3 = BigInt(123);
alert(typeof hugeNumber_3);
BigInt
支持常见的算术运算符 + - * / **
,比较运算符,以及大多数位运算符。
布尔值(Boolean)
布尔变量可以包含两种可能的值之一:true
或 false
。JavaScript 用以下值表示 false
:布尔值 false
、数字 0
、NaN
、空字符串、以及内置类型 undefined
或 null
。其他任何值都被视为 true
。
"use strict";
let firstLoop = true;
alert(typeof firstLoop);
未定义(Undefined)
刚声明但没有初始化任何值的变量,其数据类型为 undefined
。
"use strict";
let x;
// ...
alert(typeof x);
if (x == undefined) {
// 补充初始化
x = 0;
}
alert(typeof x);
// ...
空值(Null)
在 JavaScript 中,null
被标记为原始值之一,因为其行为看似原始。然而,当使用 typeof
运算符时,它返回的是 "object"
。这被认为是一个错误,但由于会破坏过多的脚本,无法修复。
符号(Symbol)
Symbol
表示一个唯一的标识符。符号可以具有一个描述符,该描述符是作为字符串传递给构造函数的。
"use strict";
// 'person' 是一个描述为 "Olaf" 的符号
const person = Symbol("Olaf");
alert(person.description); // Olaf
符号通常作为对象的键(嵌入在 []
中)使用,以确保唯一性。
参考文献
- ECMAScript 中的数据类型定义