JavaScript高级程序设计笔记 5

第5章 基本引用类型

1. Date

1.1 创建 Date 对象

  • let now = new Date(); // 当前日期时间
  • let date = new Date(年, 月, 日, 时, 分, 秒, 毫秒); // 月从0开始
  • let date = new Date("2024-01-01T12:00:00"); // ISO 8601 字符串
  • let date = new Date(毫秒数); // 1970-01-01 00:00:00 UTC 的毫秒数

1.2 静态方法

方法 说明
Date.now() 返回当前时间毫秒数(性能测量常用)
Date.parse() 解析日期字符串,返回毫秒数
Date.UTC() 返回指定 UTC 时间的毫秒数(参数为年、月、日...)

1.3 实例方法

获取/设置本地时间

  • getFullYear() / setFullYear() // 年
  • getMonth() / setMonth() // 月(0-11)
  • getDate() / setDate() // 日(1-31)
  • getDay() // 星期几(0-6,0=周日)
  • getHours() / setHours() // 时
  • getMinutes() / setMinutes() // 分
  • getSeconds() / setSeconds() // 秒
  • getMilliseconds() / setMilliseconds() // 毫秒

获取/设置 UTC 时间:上述方法名中 get 改为 getUTCset 改为 setUTC

格式化方法

  • toDateString() // 周几 月 日 年
  • toTimeString() // 时:分:秒 时区
  • toLocaleString() // 本地格式
  • toISOString() // ISO 8601 格式

1.4 常见操作

// 计算代码执行时间
let start = Date.now();
// ... 代码 ...
let end = Date.now();
console.log(`耗时 ${end - start} ms`);

// 比较日期
let date1 = new Date(2024, 0, 1);
let date2 = new Date(2024, 0, 2);
console.log(date1 < date2); // true

2. RegExp

2.1 创建正则表达式

  • 字面量let pattern = /pattern/flags;
  • 构造函数let pattern = new RegExp("pattern", "flags");

2.2 标志(flags)

标志 说明
g 全局匹配,找到所有匹配项
i 忽略大小写
m 多行模式
y 粘附模式,从 lastIndex 开始匹配
u Unicode 模式
s dotAll 模式,. 匹配换行符

2.3 实例方法

  • exec(str):返回匹配结果数组(第一项为匹配文本,后续为捕获组),同时更新 lastIndex 属性。
    let pattern = /(ab)c/g;
    let str = "abc abc";
    let match = pattern.exec(str);
    console.log(match[0]);   // "abc"
    console.log(match[1]);   // "ab"
    console.log(match.index); // 0
    console.log(pattern.lastIndex); // 3
    
  • test(str):返回布尔值,是否匹配。
  • toString() / toLocaleString():返回正则表达式的字面量字符串。

2.4 构造函数属性(静态属性)

属性 说明 简写
input 最后匹配的字符串 $_
lastMatch 最后匹配的文本 $&
lastParen 最后捕获组 $+
leftContext 匹配文本前的文本 $`
rightContext 匹配文本后的文本 $'

2.5 常用正则示例

// 手机号(简单版)
let phone = /^1[3-9]\d{9}$/;

// 邮箱
let email = /^[\w.-]+@[\w.-]+\.\w+$/;

// 提取所有数字
let nums = "a1b2c3".match(/\d/g); // ["1","2","3"]

3. 原始值包装类型

概念:当以读模式访问原始值(Boolean、Number、String)时,JS 会在后台临时创建一个对应的包装类型对象,使得原始值可以像对象一样调用方法,调用完后立即销毁。

3.1 Boolean

  • let boolObj = new Boolean(false); // 不推荐,typeof 返回 "object"
  • 注意:new Boolean(false) 是对象,if(boolObj) 为 true
  • 建议:直接使用原始布尔值。

3.2 Number

静态属性

  • Number.MAX_VALUE / MIN_VALUE
  • Number.NaN / NEGATIVE_INFINITY / POSITIVE_INFINITY
  • Number.EPSILON // 极小常量,用于浮点数比较

实例方法

  • toFixed(n):四舍五入保留 n 位小数(返回字符串)
  • toExponential(n):科学记数法
  • toPrecision(n):根据 n 决定使用 toFixedtoExponential
  • toString(radix):指定进制(2-36)

数值转换Number()parseInt()parseFloat()

3.3 String

属性length(字符数,注意 Unicode 代理对)

字符方法

  • charAt(index):返回指定位置字符
  • charCodeAt(index):返回字符 Unicode 编码
  • codePointAt(index):ES6,返回完整码点(支持代理对)

操作方法

  • concat(str1, str2, ...):拼接,但常用 +
  • slice(start, end)substring(start, end)substr(start, len)
    • 区别:slice 支持负索引,substring 将负转为 0,substr 第二个参数为长度(已废弃)

位置方法

  • indexOf(search, fromIndex):从左查找
  • lastIndexOf(search, fromIndex):从右查找
  • includes(search, start)startsWith()endsWith()(ES6)

正则相关方法

  • match(pattern):返回匹配数组
  • search(pattern):返回匹配索引,未匹配返回 -1
  • replace(pattern, replacement):替换
  • split(separator, limit):分割为数组

其他常用

  • trim() / trimStart() / trimEnd():去除空白
  • toLowerCase() / toUpperCase():大小写转换
  • repeat(count):重复字符串(ES6)
  • padStart(len, pad) / padEnd(len, pad):填充(ES6)

4. 单例内置对象

4.1 Global

定义:全局作用域中的终极对象,所有全局属性和方法都是 Global 的成员。浏览器中 window 充当 Global。

核心方法

  • isNaN()isFinite()parseInt()parseFloat()
  • encodeURI() / decodeURI():对整个 URI 编码,保留特殊字符(如 : / ? #)
  • encodeURIComponent() / decodeURIComponent():对 URI 组件编码,编码更多字符(常用)
  • eval():解析并执行字符串中的 JS 代码(危险,不推荐)

全局属性undefinedNaNInfinityObjectArrayFunction 等所有内置构造函数。

4.2 Math

属性Math.PIMath.EMath.LN10

方法

  • 舍入:Math.ceil()(上取整)、Math.floor()(下取整)、Math.round()(四舍五入)
  • 随机:Math.random() 返回 [0,1) 的随机数
  • 最大/最小:Math.max()Math.min()
  • 幂/开方:Math.pow()Math.sqrt()Math.cbrt()(立方根)
  • 三角:Math.sin()Math.cos()Math.tan()

常用公式

// [min, max] 之间的随机整数
function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

5. 常见面试题速查

Date

  1. 如何获取当前时间戳?
    Date.now()new Date().getTime()

  2. 如何创建一个指定日期的 Date 对象?
    new Date(2024, 0, 1)(月从 0 开始)或 new Date("2024-01-01")

  3. 如何比较两个日期的大小?
    → 直接使用 < >,因为 Date 对象会转为毫秒数。

RegExp

  1. 正则表达式的 exectest 方法有什么区别?
    exec 返回匹配结果数组,test 返回布尔值。

  2. g 标志如何影响 exec 的结果?
    → 每次调用 exec 会从 lastIndex 开始查找,可迭代遍历所有匹配项。

  3. 如何匹配一个字符串中的所有数字?
    str.match(/\d/g)

原始值包装类型

  1. 为什么原始值可以调用 .toFixed() 等方法?
    → 访问时临时创建包装类型对象,调用完立即销毁。

  2. new Boolean(false)false 有什么区别?
    → 前者是对象,if(obj) 为 true;后者是原始布尔值。

  3. parseIntparseFloat 的区别?
    parseInt 解析整数,可指定进制;parseFloat 解析浮点数,只解析十进制。

  4. 如何判断一个浮点数是否在误差范围内相等?
    → 比较差值是否小于 Number.EPSILON

String

  1. slicesubstringsubstr 有什么区别?
    slice 支持负索引;substring 负转 0;substr 第二个参数是长度(已废弃)。

  2. 如何判断字符串是否包含某个子串?
    includes()indexOf() !== -1、正则 test()

  3. 如何将字符串的首字母大写?
    str.charAt(0).toUpperCase() + str.slice(1)

Global 与 Math

  1. encodeURIComponentencodeURI 有什么区别?
    encodeURIComponent 编码更多字符(包括 /?:@&),适合编码 URL 参数;encodeURI 保留 URI 特殊字符,适合编码完整 URI。

  2. eval 为什么是不安全的?
    → 会执行字符串中的任意代码,导致 XSS 风险,且难以优化。

  3. 如何生成 [min, max] 之间的随机整数?
    Math.floor(Math.random() * (max - min + 1)) + min

posted @ 2024-04-09 09:17  Li_pk  阅读(7)  评论(0)    收藏  举报