ES6知识点补充——模板字符串、默认参数

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解模板字符串、默认参数
最近在写算法的时候写出了下面的代码:
image.png
😱 太长了,自己竟然写出了一串糟糕的代码,有什么方法可以优化的吗?

模板字符串

ES6模板字符串 , 插值用 ${ }
if (data == arr[mid]) {
        j = realMid
        console.log('+++++ mid = ' + realMid + ' start = ' + realStart + ' end = ' + realEnd + ' j = ' + j + ' +++++');
        return '数' + data + '在数组的第' + realMid + '位';
        // 使用模板字符串:
              console.log(`+++++ mid = ${realMid}, start = ${realStart}, end = ${realEnd}, j =${j} +++++`);
        return `数${data}在数组的第${realMid}位`;
    }

优化后看起来好多了,下面继续来谈谈模板字符串的其他用法:

多行字符串

在模板字符串中,空格、缩进、换行都会被保留:
// 使用模板字符串前要换行:
console.log('String with \n\
multiple \n\
lines')
// 使用模板字符串后要换行:
console.log(`String with
multiple
lines`)

嵌入变量

在${ }内部不只是可以写变量,还可以写表达式、函数的调用
const info = `age double is ${age * 2}`
console.log(info)

function doubleAge() {
  return age * 2
}

const info2 = `double age is ${doubleAge()}`

标签模板字符串

模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串
function foo(m, n, x) {
  console.log(m, n, x, '---------')
}

const name = "a"
const age = 18

foo("Hello", "World", name, age) // Hello World a ---------
foo`Hello${name}World${age}` // [ 'Hello', 'World', '' ] a 18 ---------
  • 第一个参数依然是模块字符串中整个字符串, 只是被${ }切成多块,放到了一个数组中
  • 第二个参数是第一个 ${}里面的内容,第三个参数则是第二个${ }里面的内容

默认参数

JavaScript 函数参数的默认值都是 undefined, ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
传入的参数是undefined时,默认参数才会生效

参数变量是 默认声明 的,所以不能用 let 或 const 再次声明(否则会报错)。

函数参数

function foo(func = () => fn = 'a') {
  console.log(func()) // a
}
foo()

对象参数

函数参数的默认值是一个有具体属性的对象,但是没有设置对象解构赋值的默认值

function printInfo({ name, age } = { name: "a", age: 18 }) {
  console.log(name, age)
}

printInfo({ name: "kobe", age: 40 })

另外一种写法:先给传入对象一个默认值:{ },再给对象解构赋值的默认值:a和18

function printInfo1({ name = "a", age = 18 } = {}) {
  console.log(name, age)
}

printInfo1()

补充注意

  1. 有默认值的函数的length属性:有默认值的参数不算在length属性里面,且在其之后的参数也不算进length属性里面
function baz(x, y = 30) {
  console.log(x, y)
}

console.log(baz.length) // 1
  1. 使用参数默认值时,函数不能有同名参数(否则会报错)
  2. 参数作用域
函数声明初始化时,一旦设置了参数默认值,参数会形成一个单独的作用域,等初始化结束后,该作用域即会消失。这种语法在不设置参数默认值的时候是不会出现的。
function foo(m, n = m + 1) {
  console.log(m, n)  //10 11
}

foo(10);

上面代码中,调用函数 fn 时,参数形成一个单独的作用域。在这个作用域里面,默认值变量m 指向第一个参数 m
而如果没有参数中没有默认值调用的变量,则会到上层作用域去找:

let m = 20
function foo(n = m + 1) {
  m = 30
  console.log(m, n)  //30 21
}

foo();

上面代码中,n = m + 1的 m 是来自全局作用域的m = 20
如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。

目录
相关文章
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
214 0
|
前端开发 JavaScript API
Ajax技术的秘密揭秘:异步传输,高效交互
Ajax技术的秘密揭秘:异步传输,高效交互
uniapp项目实践第四章:如何安装uni-ui组件库
uniapp项目实践第四章:如何安装uni-ui组件库
1017 0
|
Java Maven 数据安全/隐私保护
弄懂maven仓库 & 仓库优先级 & settings & pom配置关系及差异
弄懂maven仓库 & 仓库优先级 & settings & pom配置关系及差异
3624 1
|
安全
阿里云服务器被xmrigMiner及pnscan及伪装httpd的病毒入侵排查记录
阿里云服务器被xmrigMiner及pnscan及伪装httpd的病毒入侵排查记录
1535 0
|
开发者 iOS开发
【Markdown小技巧】 整理小图标和表情符号
让博客变得更加优美,你需要这些萌萌的、好看的表情符号。以下是我收集的一些表情符号和小图标,分享给大家。
【Markdown小技巧】 整理小图标和表情符号
|
3月前
|
运维 监控 网络协议
【运维干货】一次因 VPN 协议不一致导致的 CPE 速率异常案例
本文分享了一次企业 CPE 主备切换后速率异常的排障案例,重点分析了因主备设备 VPN 协议配置不一致(TCP vs UDP)导致的速率问题,并总结了配置一致性检查、临时改动闭环及协议选择等方面的运维经验。
|
9月前
|
数据采集 JavaScript 前端开发
一站搞定原型链:深入理解JavaScript的继承机制
综上所述,可以得出: 1. 原型链是对象通过原型实现属性和方法继承的一种机制。 2. 每个对象都有一个 __proto__ 属性,指向它的原型对象。 3. 每个函数(包括构造函数)都有一个 prototype 属性,指向一个对象,这个对象的属性和方法可以被实例共享。 4. 构造函数创建对象时,新对象的 __proto__ 属性指向构造函数的 prototype 对象。 5. 继承可以通过设置原型对象实现,也可以使用 ES6 的 class 语法糖。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
存储 人工智能 编译器
【AI系统】自动微分的挑战&未来
本文详细探讨了自动微分的原理与实现,包括其在AI框架中的应用实例,指出自动微分技术面临的两大挑战——易用性和高效性能。文章分析了数学表达与程序表达间的差异对自动微分实现的影响,讨论了控制流表达、复杂数据类型、语言特性的处理难题,以及物理系统模拟对自动微分的需求。此外,还探讨了提高自动微分性能的方法,如合理选择中间结果存储点以平衡内存占用与运行速度。最后展望了自动微分的未来发展,特别是可微编程的概念及其在AI领域的应用前景。
268 7
|
存储 NoSQL 算法
分布式唯一 ID 的 7 种生成方案
在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要的。下面我们一一来列举一下,不一定全部适合,这些解决方案仅供你参考,或许对你有用。
分布式唯一 ID 的 7 种生成方案