2014-04-08 48 views
2

我正在學習節點和快速編程,並找到一個很好的例子: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書籍,它只是說這是一個按位不是。

爲什麼作者在這裏使用代字號? 如果不使用代字號,我可以通過其他方式表達同樣的東西嗎?

謝謝!

+9

'indexOf()'將返回'-1',位否定'-1'爲'0'。更短(但iMO不太清晰)比'== -1'。 –

+1

@Adriano這應該是一個答案 – vkurchatkin

回答

4

Tilde是bitwise not operator。如果未找到子字符串,則.indexOf()方法將返回在字符串(或數組中)中找到的匹配項的索引或-1

因爲0 == false波浪號可用於在0反之亦然轉化-1

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

~file.indexOf('.js')相當於file.indexOf('.js') === -1file.indexOf('.js') < 0。最後兩個例子更清楚地知道第一個例子。

1

此聲明僅將.js文件包含到項目中。我們可以更換該statment着,這種表達

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

您例如https://github.com/madhums/node-express-mongoose-demo讓我們看看 我們有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,並且將包括這些文件。

這statment〜file.indexOf(」 JS ')時,我們有沒有名字的文件中像解決問題' 的.js'

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

正如你所看到的。它將被納入項目。

+0

不應該是表達式? – A1rPun

+1

你是對的,我的錯 –

相關問題