JavaScript 实用技巧:解构、数字分隔符与调用栈获取

作者:闭包旅人时间:2026-10-25 04:04:20浏览:172

本文介绍 JavaScript 中六个实用且常被忽视的技巧。包括嵌套对象的多重解构、使用下划线分隔符提升数字可读性、理解 try...catch...finally 中 return 的执行顺序、通过 new Error().stack 获取调用栈、一行代码生成随机字符串以及直接通过 ID 访问 DOM 元素。这些技巧有助于提升代码简洁性与调试效率。

今天分享一些 JavaScript 中可能鲜为人知但非常实用的特性。其中一些你可能已经了解,而另一些或许会让你感到意外。让我们直接开始探索。

一、解构小技巧

在处理深层嵌套对象时,我们通常通过解构提取所需的属性。


let obj = {
  part1: {
    name: '零一',
    age: 23
  }
}

// 解构
const { part1: { name, age } } = obj
// 使用
console.log(name, age)  // 零一  23

然而,如果仅从 part1 中解构出 name 和 age,你将无法直接访问 obj 中的 part1 属性,例如:


// .... 省略

const { part1: { name, age } } = obj
console.log(part1)   // Uncaught ReferenceError: part1 is not defined

实际上,可以通过多次解构来同时获取嵌套属性和父对象,例如:


// .... 省略

const { part1: { name, age }, part1 } = obj
console.log(part1)   // {name: "零一", age: 23}

二、数字分隔符

在代码中定义大型数字常量时,


const myMoney = 1000000000000

这么多个 0 ,1、2 ... 6、7 ... 数晕了都,怎么办?

可以使用数字分隔符来解决。


const myMoney = 1_000_000_000_000

console.log(myMoney)  // 1000000000000

这种写法完全合法,且分割后的数字更加直观易读。

三、try...catch...finally 谁厉害?

在普通函数调用中,return 语句通常会立即终止函数的执行。


function demo () {
  return 1
  console.log('我是零一')
  return 2
}

console.log(demo())   // 1

但在 try...catch...finally 结构中,return 的行为有所不同,它不会立即结束整个执行流程。


function demo () {
  try {
    return 1
  } catch (err) {
    console.log(err)
    return 2
  } finally {
    return 3
  }
}

console.log(demo())   // 返回什么??

这段程序最终会返回什么值?请思考一下。

两小时后~

答案是:3。

由此可以得出结论,finally 块中的逻辑具有更高的优先级。

利用这一特性,我们可以实现一些特殊的控制逻辑。


function demo () {
  try {
    return 1
  } catch (err) {
    console.log(err)
    return 2
  } finally {
    try {
      return 3
    } finally {
      return 4
    }
  }
}

console.log(demo())  // 返回 4

四、获取当前调用栈


function firstFunction() { secondFunction(); } 
function secondFunction() { thridFunction(); } 
function thridFunction() { console.log(new Error().stack); }

firstFunction();

//=> Error 
//  at thridFunction (<anonymous>:2:17) 
//  at secondFunction (<anonymous>:5:5) 
//  at firstFunction (<anonymous>:8:5) 
//  at <anonymous>:10:1

通过 new Error().stack 可以随时获取当前代码执行的调用栈信息,这是一种有效的调试手段。

五、一行代码生成随机字符串

初学 JavaScript 时,若要自行实现随机字符串生成函数,代码通常较为繁琐。


function hash () {
  let s = ''
  const strs = [
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 
    'h', 'i', 'j', 'k', 'l', 'm', 'n', 
    'o', 'p', 'q', 'r', 's', 't', 'u', 
    'v', 'w', 'x', 'y', 'z', '0', '1', 
    '2', '3', '4', '5', '6', '7', '8',
    '9',
  ]
  for(let i = 0; i < 10; i++) {
    s += strs[Math.floor(Math.random() * strs.length)]
  }
  return s
}

hash()  // 'www7v2if9r'

手动列举 26 个字母和 10 个数字非常耗时(尽管可以使用 ASCII 码简化,但仍较麻烦)。

接下来介绍一种方法,仅需一行简短代码即可实现“随机生成字符串”的功能。


const str = Math.random().toString(36).substr(2, 10);
console.log(str);   // 'w5jetivt7e'

我们同样得到了一个 10 位数的随机字符串,这非常高效,远胜于之前手动编写的版本。

其原理是:Math.random() 生成 [0, 1) 之间的浮点数(如 0.123312、0.982931),然后调用 number 的 toString 方法将其转换为 36 进制。根据 MDN 文档,36 进制转换包含字母 a~z 和数字 0~9。由于生成结果类似 0.89kjna21sa,因此需要截取小数部分,即从索引 2 开始截取 10 个字符,即可得到所需的随机字符串。

许多开源库利用此方式为 DOM 元素创建随机 ID。

六、最快获取 dom 的方法

HTML 中带有 id 属性的元素,会被全局作用域中与 ID 同名的变量所引用。


<div id="zero2one"></div>

传统获取 DOM 的方式如下:


const el = document.getElementById('zero2one')  
console.log(el)   // <div id="zero2one"></div>

现在可以直接使用 ID 作为变量名访问。


console.log(zero2one)   // <div id="zero2one"></div>

这种方式是否更加便捷?

总结

本文介绍了关于 JavaScript 的六个实用技巧。如需了解更多相关内容,请查阅本站往期文章或继续浏览后续内容。感谢大家的支持!

作者最新文章