Почему автор использует тильду перед файлом?

Я изучаю ноды и экспресс-программирование и нахожу очень хороший пример по адресу: 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, и она просто говорит, что она побитовая НЕ.

Почему автор использует тильду здесь? Если я не использую тильду, могу ли я по-другому выразить то же самое?

Спасибо!

2 ответа

Решение

Тильда - побитовый, а не оператор. .indexOf() метод возвращает индекс найденного совпадения в строке (или в массиве) или -1 если подстрока не была найдена.

Так как 0 == false тильда может быть использована для трансформации -1 в 0 и наоборот:

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

~file.indexOf('.js') эквивалентно file.indexOf('.js') === -1 или же file.indexOf('.js') < 0, Последние два примера более понятны, чем первый.

Это заявление поможет включить в проект только файлы.js. Мы можем заменить это утверждение на это выражение

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

для вашего примера https://github.com/madhums/node-express-mongoose-demo давайте посмотрим, у нас есть 2 файла в /app/models/: 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, и эти файлы будут включены.

этот параметр ~file.indexOf('.js') решает проблему, когда у нас есть файл без имени, например '.js'

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

Как вы видете. Он будет включен в проект.

Другие вопросы по тегам