我学习节点并表达编程,并在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。
为什么作者在这里使用代字号? 如果不使用代字号,我可以用其他方式表达同样的事情吗?
谢谢!
答案 0 :(得分:3)
Tilde是bitwise not operator。 .indexOf()
方法返回字符串(或数组)中找到的匹配项的索引,如果找不到子字符串,则返回-1
。
因为0 == false
代字号可用于转换-1
中的0
而反之亦然:
> ~1
-2
> ~0
-1
> ~-1
0
~file.indexOf('.js')
相当于file.indexOf('.js') === -1
或file.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
如你所见。它将被纳入项目。