现代 JavaScript 从头再来(一):变量与数据类型

47 阅读3分钟

变量

使用 letconst 关键字来声明变量,区别是 const 用来声明常量,常量不能被修改

不要使用 var,不要使用 var,不要使用 var

let message = 'hello';

// 通常使用大写字母加下划线的方式声明常量
const BIRTHDAY = '31.03.1998'
const COLOR_ORANGE = '#FF7F00';

数据类型

Number 类型

包括整数和浮点数、特殊数值:InfinityNaN

  • Infinity

    代表无穷大:

    console.log(1 / 0); // 可以通过除 0 得到
    
    console.log(Infinity); // 或者直接使用
    
  • NaN

    任何对 NaN 的进一步数学运算都会返回 NaN

    console.log(NaN + 1); // NaN
    console.log(3 * NaN); // NaN
    
    // 有一个例外
    console.log( NaN ** 0 ); // 1
    

在 js 中做任何数学运算都是安全的,最坏就是得到一个 NaN 而已

BigInt 类型

js 中 number 类型无法安全地表示大于 (2531)(2^{53} - 1)(即 9007199254740991)或小于 (2531)-(2^{53} - 1) 的整数,会出现精度问题:

// 这两个数字(正好超出了安全整数范围)是相同的
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992

大多数情况 number 类型就够了,但是有些情况需要范围非常大的整数:比如用于密码学或微秒精度的时间戳,这时候就要使用 BigInt 了

BigInt 用于表示任意长度的整数

// 尾部的 "n" 表示这是一个 BigInt 类型
const bigInt = 1234567890123456789012345678901234567890n;

String 类型

有三种包含字符串的方式:

  • 双引号:"Hello"
  • 单引号:'Hello'
  • 反引号:`Hello`

反引号是功能扩展引号(扩展运算符),可以将变量和表达式包装在 ${...} 中:

let name = "zs";

// 嵌入一个变量
console.log(`Hello, ${name}`); // Hello, zs

// 嵌入一个表达式
console.log(`the result is ${1 + 1}`); // the result is 2

Boolean 类型

turefalse

null 值

js 中的 null 仅仅是一个代表“无”、“空”或“值未知”的特殊值

不同于其他编程语言,js 中的 null 不是一个“对不存在的 object 的引用”或者 “null 指针”

undefined 值

和 null 一样自成类型,代表”未被赋值“

如果一个变量已被声明,但未被赋值,那么它就是 undefined:

let a;

console.log(a); // undefined

// 可以显式地将 undefined 赋值给变量,但是不建议这么做...
// 通常使用 null 赋值给变量,undefined 保留作为未进行初始化变量的默认初始值
a = undefined;

Object 类型

object 类型又被称为复杂数据类型,其他所有数据类型都被成为”原始类型“,因为它们的值只包含一个单独的内容(字符串、数字或者其他)

Symbol 类型

symbol 类型用于创建对象的唯一标识符

typeof 运算符

typeof 运算符返回参数的类型

对 typeof x 的调用会以字符串的形式返回数据类型:

typeof undefined // "undefined"

typeof 0 // "number"

typeof 10n // "bigint"

typeof true // "boolean"

typeof "foo" // "string"

typeof Symbol("id") // "symbol"

// Math 是 js 中的内置 object
typeof Math // "object"

// 这是一个历史遗留问题,typeof 的行为在这里是错误的,null 绝对不是一个 object,它有自己的类型
typeof null // "object"

// alert 是一个函数,在 js 中没有 function 类型,函数隶属于 object,从技术上讲 typeof 在这里也是不对的,但在实际编程中却很方便
typeof alert // "function"

也可以使用另一种语法 typeof(x),但要记住 typeof 是一个操作符,不是一个函数,这里的括号不是 typeof 的一部分,它是数学运算分组的括号