为什么作者在文件之前使用代字号呢?

时间:2014-04-08 08:30:11

标签: javascript node.js tilde

我学习节点并表达编程,并在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。

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

谢谢!

2 个答案:

答案 0 :(得分:3)

Tilde是bitwise not operator.indexOf()方法返回字符串(或数组)中找到的匹配项的索引,如果找不到子字符串,则返回-1

因为0 == false代字号可用于转换-1中的0而反之亦然:

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

~file.indexOf('.js')相当于file.indexOf('.js') === -1file.indexOf('.js') < 0。最后两个例子更清楚地理解了第一个例子。

答案 1 :(得分:1)

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

替换这个语句
 if (file.indexOf('.js') !== -1) require(models_path + '/' + file)

为您的示例https://github.com/madhums/node-express-mongoose-demo让我们看看 我们在/ app / models /:article.js和user.js

中有2个文件

for acticle.js

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

for user.js

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

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

这个陈述~file.indexOf('。js')当我们有没有像'.js'这样的名字的文件时解决问题

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

如你所见。它将被纳入项目。