Почему автор использует тильду перед файлом?
Я изучаю ноды и экспресс-программирование и нахожу очень хороший пример по адресу: 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
Как вы видете. Он будет включен в проект.