2013-05-30 2 views
8

Я проверял код respons.js в экспресс и наткнулся на этот код:Интерпретация яваскрипта кода - Тильда символ перед тройным IF оператор

res.contentType = 
res.type = function(type){ 
    return this.set('Content-Type', ~type.indexOf('/') 
    ? type 
    : mime.lookup(type)); 
}; 

Мой вопрос: что делает ~ оператор делать в перед заявлением type.indexOf()? Какова его цель и когда она используется?

ответ

9

Это bitwise NOT, хотя его использование здесь довольно непрозрачное.

Он используется для преобразования -1 результата от indexOf (т.е. строки не найдена) в 0, который является falsy значение (с ~-1 == 0 и 0 ложно в логическом контексте), и это позволит всем другому ценности остаются правдивыми.

Это могло быть написано более ясно, как (type.indexOf('/') != -1) ? ... : ...

На простом английском языке, он говорит, «Лечить -1 результат (т.е. если / не найден) из indexOf в false, иначе лечить результат как true ».

+3

Фактически '~ type.indexOf ('/')' означает '' type' содержит строку '/'. –

+1

Для удобства чтения вы можете исправить прототип строки: 'String.prototype.contains = function (s) {return ~ this.indexOf (s); } ', давая' type.contains ('/') ' – Eric

+0

. Одно сомнение, что произойдет, если 0 встречается вместо -1. В любом случае это ударит 0? так что происходит при преобразовании 0 из индекса в? –

0

Тильда является побитового НЕ оператор, так же, как ! является логического НЕ оператором. Вы можете взглянуть на documentation оператора в Mozilla Developer Network для его полного использования и смысла.

Смежные вопросы