JS ES6 函数的拓展

发布于 2024-12-20 18:25:27 字数 1990 浏览 11 评论 0

函数参数的默认值

ES6 之前

function log (x, y) {
  if (typeof y === 'undefined') {
    y = 'World'
  }
  console.log(x, y)
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World

ES6

function log (x, y = 'World') {
  console.log(x, y)
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello

参数变量是默认声明的,所以不能用 let 或 const 再次声明。

function foo (x = 5) {
  let x = 1 // error
  const x = 2 // error
}

使用参数默认值时,函数不能有同名参数。

// 不报错
function foo (x, x, y) {
  // ...
}

// 报错
function foo (x, x, y = 1) {     //let 声明了两次
  // ...
}
// SyntaxError: Duplicate parameter name not allowed in this context

惰性求值

let x = 99

function foo (p = x + 1) {
  console.log(p)
}

foo() // 100
x = 100
foo() // 101

作为练习,请问下面两种写法有什么差别?

// 写法一
function m1 ({ x = 0, y = 0 } = {}) {
  return [x, y]      //设置了对象解构赋值的默认值
}

// 写法二
function m2 ({ x, y } = { x: 0, y: 0 }) {
  return [x, y]      //没有设置对象解构赋值的默认值
}
// 函数没有参数的情况
m1() // [0, 0]
m2() // [0, 0]

// x 和 y 都有值的情况
m1({x: 3, y: 8}) // [3, 8]
m2({x: 3, y: 8}) // [3, 8]

// x 有值,y 无值的情况
m1({x: 3}) // [3, 0]
m2({x: 3}) // [3, undefined]

// x 和 y 都无值的情况
m1({}) // [0, 0]
m2({}) // [undefined, undefined]

m1({z: 3}) // [0, 0]
m2({z: 3}) // [undefined, undefined]

函数的 length 属性

指定了默认值以后,函数的 length 属性,将返回没有指定默认值的参数个数。

(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
(function(...args) {}).length // 0
(function (a = 0, b, c) {}).length // 0 ?
(function (a, b = 1, c) {}).length // 1 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

迷鸟归林

文章 0 评论 0

alipaysp_h2Vbo4sv6k

文章 0 评论 0

清风无影

文章 0 评论 0

mnbvcxz

文章 0 评论 0

听不够的曲调

文章 0 评论 0

秋叶绚丽

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文