由JavaScript谓词语法混淆

时间:2018-03-25 04:02:18

标签: javascript

在打字稿组件文件中,正在导入underscore.js库,如下所示:

import * as _ from 'underscore';

稍后在组件中,教师使用以下行从照片对象数组中删除照片对象:

this.photos.splice(_.findIndex(this.photos, { id: id }), 1)

我相信这一行与以下代码的作用相同:

var i = _.findIndex(this.photos, (photo) => {
  photo.id == id;
});
this.photos.splice(i, 1);

我不明白的是

(photo) => { photo.id == id; }

减少到

{ id: id }

1 个答案:

答案 0 :(得分:2)

它没有。

以下是一个带有一个参数(photo)的函数,它将此参数的id属性与闭包上下文的id变量进行比较,并且不返回任何内容:

(photo) => { photo.id == id; }

但是你可能意味着这个:

(photo) => photo.id == id

哪个不一样!这相当于:

(photo) => { return photo.id == id; }

只是语法糖。它是一个函数,它接受一个参数(photo)并返回该参数的==属性id的比较结果和闭包上下文的id变量

接下来,这只是一个具有属性id的对象:

{ id: id }

使其表现相似的魔力完全取决于underscore。它根本不是javascript的一部分。

源代码中的

here这两个选项是分开的。所以基本上是两个"重载",它们以不同的方式实现,但行为方式相同。