深入理解 You Don't Know JS 中的 ES6 块级作用域与扩展运算符

深入理解 You Don't Know JS 中的 ES6 块级作用域与扩展运算符

You-Dont-Know-JS 📗📒 (PT-Br translation) JS Book Series. You-Dont-Know-JS 项目地址: https://gitcode.com/gh_mirrors/you/You-Dont-Know-JS

前言

在 JavaScript 的发展历程中,ES6(ECMAScript 2015)无疑是一个里程碑式的版本。它引入了许多新特性,极大地改善了 JavaScript 的编程体验。本文将重点剖析 ES6 中两个重要特性:块级作用域声明(let/const)和扩展/剩余运算符(...),这些内容源自《You Don't Know JS》系列中关于 ES6 的章节。

块级作用域声明

从 var 到 let 的演进

传统 JavaScript 中,变量声明使用 var,其作用域仅限于函数或全局范围。为了创建块级作用域,开发者通常需要使用立即执行函数表达式(IIFE):

var a = 2;

(function IIFE(){
    var a = 3;
    console.log(a); // 3
})();

console.log(a); // 2

ES6 引入了 let 关键字,允许我们在任何代码块(由 {} 界定)中声明变量:

var a = 2;

{
    let a = 3;
    console.log(a); // 3
}

console.log(a); // 2

let 的最佳实践

  1. 显式块声明:建议使用独立的 {} 块来明确界定作用域
  2. 声明位置:将 let 声明放在块的最顶部
  3. 单一声明:一个块中多个变量声明尽量使用一个 let
{   let a = 2, b, c;
    // ...
}

let 的隐式特性

let 的隐式特性可能导致一些认知负担:

let a = 2;

if (a > 1) {
    let b = a * 3;
    console.log(b); // 6

    for (let i = a; i <= b; i++) {
        let j = i + 10;
        console.log(j);
    }
    // 输出: 12 13 14 15 16

    let c = a + b;
    console.log(c); // 8
}

在这个例子中,if 块包含 bcfor 循环包含 ij。这种隐式绑定需要开发者特别注意。

暂时性死区(TDZ)

let 声明存在暂时性死区(Temporal Dead Zone),即在声明前访问变量会抛出错误:

{
    console.log(a); // undefined
    console.log(b); // ReferenceError!
    
    var a;
    let b;
}

let 在循环中的特殊行为

letfor 循环头中会为每次迭代创建新的绑定:

var funcs = [];

for (let i = 0; i < 5; i++) {
    funcs.push(function(){
        console.log(i);
    });
}

funcs[3](); // 3

这与 var 的行为不同,后者会在闭包中共享同一个变量。

const 声明

基本用法

const 用于声明常量,必须在声明时初始化且不能重新赋值:

{
    const a = 2;
    console.log(a); // 2
    
    a = 3; // TypeError!
}

关于值的不变性

需要注意的是,const 保证的是绑定不变,而非值不变。对于对象和数组,内容仍可修改:

{
    const a = [1,2,3];
    a.push(4);
    console.log(a); // [1,2,3,4]
    
    a = 42; // TypeError!
}

使用建议

  1. 使用 const 明确表示不应改变的变量
  2. 不要过度依赖 const 的性能优化假设
  3. 仅在确实需要不变绑定时使用 const

块级作用域函数

ES6 规定,函数声明在块内具有块级作用域:

{
    foo(); // 正常工作
    
    function foo() {
        // ...
    }
}

foo(); // ReferenceError

这与之前的行为不同,可能影响现有代码:

if (something) {
    function foo() { console.log("1"); }
}
else {
    function foo() { console.log("2"); }
}

foo(); // ES6 中会抛出 ReferenceError

扩展/剩余运算符(...)

扩展运算符

用于展开可迭代对象:

function foo(x,y,z) {
    console.log(x, y, z);
}

foo(...[1,2,3]); // 1 2 3

替代旧的 apply 用法:

// 旧方式
foo.apply(null, [1,2,3]);

// 新方式
foo(...[1,2,3]);

也可用于数组合并:

var a = [2,3,4];
var b = [1, ...a, 5];
console.log(b); // [1,2,3,4,5]

剩余参数

用于收集剩余参数为数组:

function foo(x, y, ...z) {
    console.log(x, y, z);
}

foo(1, 2, 3, 4, 5); // 1 2 [3,4,5]

完全替代 arguments 对象:

// ES6 方式
function foo(...args) {
    // args 已经是真正的数组
    args.shift();
    console.log(...args);
}

// 旧方式
function bar() {
    var args = Array.prototype.slice.call(arguments);
    args.push(4, 5);
    args = args.filter(v => v % 2 == 0);
    foo.apply(null, args);
}

bar(0, 1, 2, 3); // 输出: 2 4

总结

ES6 的块级作用域和扩展运算符极大地提升了 JavaScript 的表达能力:

  1. let/const 提供了真正的块级作用域,解决了 var 的变量提升问题
  2. const 有助于表达不可变意图,但要注意其仅保证绑定不变
  3. 扩展运算符(...)简化了数组/参数操作,使代码更简洁
  4. 剩余参数提供了比 arguments 更优雅的参数处理方式

理解这些特性的工作原理和最佳实践,将帮助你编写更清晰、更健壮的 ES6 代码。

You-Dont-Know-JS 📗📒 (PT-Br translation) JS Book Series. You-Dont-Know-JS 项目地址: https://gitcode.com/gh_mirrors/you/You-Dont-Know-JS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/dab15056c6a5 用户画像(User Profile)是大数据领域关键概念,是基于用户多维度信息如行为数据、偏好、习惯等构建的虚拟代表。它是数据分析重要工具,能助企业深度理解用户,实现精准营销、个性化推荐及服务优化。其源码涵盖以下内容:一是数据收集,需大量数据支撑,常借助Flume、Kafka等日志收集系统,实时或批量收集用户浏览记录、购买行为、搜索关键词等数据;二是数据处理清洗,因数据源杂乱,需用Hadoop、Spark等大数据处理框架预处理,去除噪声数据,统一格式,保障数据质量;三是特征工程,为构建用户画像关键,要挑选有意义特征,像用户年龄、性别、消费频率等,且对特征编码、标准化、归一化;四是用户聚类,用K-means、DBSCAN等算法将用户分组,找出行为模式相似用户群体;五是用户建模,借助决策树、随机森林、神经网络等机器学习模型对用户建模,预测其行为或需求;六是用户画像生成,把分析结果转为可视化用户标签,如“高消费能力”、“活跃用户”等,方便业务人员理解。 其说明文档包含:一是项目背景目标,阐述构建用户画像原因及期望效果;二是技术选型,说明选用特定大数据处理工具和技术栈的理由;三是数据架构,描述数据来源、存储方式(如HDFS、数据库)及数据流图等;四是实现流程,详述各步骤操作方法和逻辑,含代码解释及关键函数功能;五是模型评估,介绍度量用户画像准确性和有效性方式,像准确率、召回率、F1分数等指标;六是应用场景,列举用户画像在个性化推荐、广告定向、客户服务等实际业务中的应用;七是注意事项,分享开发中遇问题、解决方案及优化建议;八是结果展示,以图表、报表等形式直观呈现用户画像成果,展现用户特征和行为模式。 该压缩包资源对学习实践用户画像技术价值大,既可助人深入理解构建过程,又能通过源码洞察大数据处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劳权罡Konrad

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值