基本类型与对象类型

基本类型使用固定的格式,有些只能包含有限数量的特定值。与此相反,对象更复杂,尤其是包括了方法和属性。

除了 nullundefined 外,基本类型都有一个对应的对象包装器,包含特定数据类型的方法。因此,您将在此页面看到一些方法的描述。

字符串(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) 该方法返回一个新字符串,其中 textnewText 替换。只会替换第一次出现的 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 方法永远不会交换 startend 位置。如果 startend 之后,slice 会尝试按原样提取内容,但很可能会提供意外的结果。

    "hello".slice(3, 1);	// ""
    
  • substr(start [, number of characters]) 该方法已被弃用,建议使用 substringslice

  • 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 提供了常见的数学函数(如 sinlog),语法:Math.xyz()(有括号)
  • 对象 Number 提供了表示数据类型 number 实现的属性,如 MAX_VALUENEGATIVE_INFINITY,语法:Number.xyz(无括号)
  • 对象 Number 提供了静态方法,检查数字与其他数据类型的关系,例如 isIntegerparseFloat,语法:Number.xyz()(有括号)
  • 对象 Number 还提供了实例方法,作用于具体的数字值或变量,例如 toExponentialtoFixed,语法: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)

布尔变量可以包含两种可能的值之一:truefalse。JavaScript 用以下值表示 false:布尔值 false、数字 0NaN、空字符串、以及内置类型 undefinednull。其他任何值都被视为 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 中的数据类型定义
最后修改: 2025年01月13日 星期一 15:02