使用数组解构,可以通过插入逗号而不使用前面的引用来丢弃前导项:
const [ , two ] = [ 1, 2 ]
函数签名也是如此 - 以下代码不会解析,因为签名中的前导逗号是意外的:
function ditchFirstArgument( , second ){}
为什么我需要为ES6函数表达式中的前导参数提供参考?
答案 0 :(得分:5)
为什么我需要为ES6函数表达式中的前导参数提供参考?
因为否则会出现语法错误。不仅仅是ES6,而且任何版本的语言都不能忽略形式参数,因为规范没有规定它。
如果你真的想这样做(但为什么?),你可以把它写成
function ditchFirstArgument(...[, second]) {}
或者至少你将能够在ES的某个未来版本中使用;见https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。这似乎已经在Chrome中得到支持。同时,你能做的最好的就是
function ditchFirstArgument(...args) {
const [, second] = args;
但为什么规范不允许省略参数?
你必须问那些写它的人,但是他们可能从来没有考虑过它,或者如果他们这样做了,拒绝它,因为它容易出错,几乎没有必要,并且可以很容易地使用假正式参数如_
。
答案 1 :(得分:4)
Roman's insight非常有用,但对于_
is a valid reference令牌不合适,function take_third( {}, {}, third ){
return third
}
Underscore通常由Lodash和后来的destructure a function argument库使用。
即使这是可以接受的,您也必须为每个未使用的参数创建并避免使用dud引用,这不是理想的。
但是,可以node-minify进入空对象,这会在没有引用的情况下有效地使参数无效。
null
编辑:正如保罗在评论中指出的那样,如果任何跳过的参数值为undefined
或undefined
,则会抛出。默认分配可以防范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中),但这似乎是一个非常简单的解决方法。