【问题标题】:Why do the author use a tilde before file?为什么作者在文件前使用波浪号?
【发布时间】:2014-05-20 19:54:25
【问题描述】:

我正在学习 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。

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

谢谢!

【问题讨论】:

  • indexOf() 将返回-1,位否定-10。比 == -1 更短(但 iMO 不太清楚)。
  • @Adriano 这应该是一个答案

标签: javascript node.js tilde


【解决方案1】:

波浪号是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。最后两个例子比第一个例子更容易理解。

【讨论】:

    【解决方案2】:

    此语句帮助仅将 .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
    

    对于用户.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
    

    如您所见。它将包含在项目中。

    【讨论】:

    • 赋值不应该是表达式吗?
    猜你喜欢
    • 2012-08-31
    • 2011-04-06
    • 2011-04-26
    • 2011-05-02
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多