为什么我不能跳过函数签名中的参数赋值?

时间:2016-05-14 16:14:12

标签: javascript parsing ecmascript-6 destructuring

使用数组解构,可以通过插入逗号而不使用前面的引用来丢弃前导项:

const [ , two ] = [ 1, 2 ]

函数签名也是如此 - 以下代码不会解析,因为签名中的前导逗号是意外的:

function ditchFirstArgument( , second ){}

为什么我需要为ES6函数表达式中的前导参数提供参考?

3 个答案:

答案 0 :(得分:5)

  

为什么我需要为ES6函数表达式中的前导参数提供参考?

因为否则会出现语法错误。不仅仅是ES6,而且任何版本的语言都不能忽略形式参数,因为规范没有规定它。

如果你真的想这样做(但为什么?),你可以把它写成

function ditchFirstArgument(...[, second]) {}

或者至少你将能够在ES的某个未来版本中使用;见https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。这似乎已经在Chrome中得到支持。同时,你能做的最好的就是

function ditchFirstArgument(...args) {
  const [, second] = args;
  

但为什么规范不允许省略参数?

你必须问那些写它的人,但是他们可能从来没有考虑过它,或者如果他们这样做了,拒绝它,因为它容易出错,几乎没有必要,并且可以很容易地使用假正式参数如_

答案 1 :(得分:4)

来自Go的

Roman's insight非常有用,但对于_ is a valid reference令牌不合适,function take_third( {}, {}, third ){ return third } Underscore通常由Lodash和后来的destructure a function argument库使用。

即使这是可以接受的,您也必须为每个未使用的参数创建并避免使用dud引用,这不是理想的。

但是,可以node-minify进入空对象,这会在没有引用的情况下有效地使参数无效。

null

编辑:正如保罗在评论中指出的那样,如果任何跳过的参数值为undefinedundefined,则会抛出。默认分配可以防范null值,但这对function take_third( {} = {}, {} = {}, third ){ return third } 不起作用:

@Entity
@Table(name = "Candidates", schema = "Candidate")
public class Candidate {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CandidateID")
private Long candidateID;
@Column(name = "FirstName")
private String firstName;
@Column(name = "LastName")
private String lastName;
@Column(name = "Zip")
private String zip;
@Column(name = "Email")
private String email;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "candidate")
private List<CandidateField> fields;

//Constructors, getters, setters omitted

答案 2 :(得分:1)

我认为将未使用的变量命名为下划线是一种常见的模式:

function ditchFirstArgument(_, second) { /* ... */ }

虽然它不会阻止你实际使用这个变量(比如在Go中),但这似乎是一个非常简单的解决方法。