2

我正在学习 node 和 express 编程,并在以下位置找到了一个非常好的示例:https ://github.com/madhums/node-express-mongoose-demo

但是我找到了一条线并没有完全理解。

// Bootstrap models
var models_path = __dirname + '/app/models';
fs.readdirSync(models_path).forEach(function (file) {
    if (~file.indexOf('.js')) require(models_path + '/' + file)
})

在文件之前的第 4 行,有一个波浪号(~)操作符。我查阅了javascript书,它只是说它是按位NOT。

为什么作者在这里使用波浪号?如果不使用波浪号,我可以用其他方式表达同样的事情吗?

谢谢!

4

2 回答 2

3

波浪号是按位非运算符。该.indexOf()方法返回在字符串(或数组)中找到的匹配项的索引,或者-1如果未找到子字符串。

因为0 == false波浪号可用于转换-10反之亦然:

> ~1
-2
> ~0
-1
> ~-1
0

~file.indexOf('.js')等价于file.indexOf('.js') === -1file.indexOf('.js') < 0。最后两个例子比第一个例子更容易理解。

于 2014-04-08T09:06:09.127 回答
1

此语句帮助仅将 .js 文件包含到项目中。我们可以用这个表达式替换这个语句

 if (file.indexOf('.js') !== -1) require(models_path + '/' + file)

对于您的示例https://github.com/madhums/node-express-mongoose-demo让我们看看 /app/models/ 中有 2 个文件:article.js 和 user.js

对于 acticle.js

if (~('acticle.js'.indexOf('.js'))) // -8 TRUE
if ('acticle.js'.indexOf('.js')) // 7   TRUE

对于 user.js

if (~('user.js'.indexOf('.js'))) // -5 TRUE
if ('user.js'.indexOf('.js')) // 4   TRUE

在我们的例子中,这个值等于 TRUE,并且这个文件将被包括在内。

当我们有像 '.js' 这样没有名称的文件时,这个语句 ~file.indexOf('.js') 解决了问题

if ('.js'.indexOf('.js')) // 0 FALSE but file exists and have .js extension
if (~('.js'.indexOf('.js'))) // -1 TRUE

如你看到的。它将被包含在项目中。

于 2014-04-08T09:26:45.663 回答