length

(function fn(a, b = 2){}).length // 1

函数的 length 属性为该函数预期传入的参数个数,当为参数设置默认值之后,该参数不再是预期传入的值,length属性不计入该参数。同时,如果设置默认值的参数不在尾部,该参数之后的参数也不计入 length :::success (function fn(){}).length // 0
(function fn(a, b){}).length // 2
(function fn(a, b = 2){}).length // 1
(function fn(a, b = 2, c){}).length // 1 :::

参考文档: https://es6.ruanyifeng.com/#docs/function

=>

let foo = () => { a: 1 }; foo() // undefined

箭头函数调用时,这里的{}被认为是代码块,而不是对象,执行里面的 a: 1; a: 会被解析为标记,因此函数执行了 1; 就结束了。 :::warning a: 标记
一般用在多重循环中,continue 和 break 后接标记名 返回代码段到标记的位置。 :::

参数

function fn(x = 10){ let x = 200 } fn() // Uncaught SyntaxError: Identifier ‘x’ has already been declared

在函数参数中接收的参数变量是以类似 let 方式定义的,因此在函数内部声明同名变量,会引起 let 报错。
var x = x || 10;
但js为了兼容诸如此类代码,在函数内部使用 var 关键字声明同名变量时,并不会发生报错,js可以正常解析。

function fn(x,x){console.log(x)} fn(1,2) // 2

在参数中出现同名形参时,取用最后一个形参的值。 :::warning function fn(x = 0,x){console.log(x)}
fn(1,2) // Uncaught SyntaxError: Duplicate parameter name not allowed in this context

let f2 = (x,x) => x;
f2(2,3) // Uncaught SyntaxError: Duplicate parameter name not allowed in this context ::: 当参数具有默认值或者函数为箭头函数时,会发生函数参数重复的报错。