2014-12-31 1 views
0

В коде запуска для рамок MEAN есть строка кода показано ниже, что делает «!! ~ this.roles.indexOf („*“)» означает в рамках MEAN.io

if (!!~this.roles.indexOf('*')) { 

Он расположен в файле public/modules/core/services/menus.client.service.js в функции shouldRender.

var shouldRender = function(user) { 
     if (user) { 
      if (!!~this.roles.indexOf('*')) { //Here is the code 
       return true; 
      } else { 
       for (var userRoleIndex in user.roles) { 
        for (var roleIndex in this.roles) { 
         if (this.roles[roleIndex] === user.roles[userRoleIndex]) { 
          return true; 
         } 
        } 
       } 
      } 
     } else { 
      return this.isPublic; 
     } 

     return false; 
}; 
+0

Они должны были использовать 'this.roles.indexOf ('*')> - 1 ', который имеет то же самое количество символов, но яснее. Или '~ this.roles.indexOf ('*')', что короче. – Oriol

+0

Да, вообще нет необходимости конвертировать значение в логическое, поскольку любое значение оценивается по истине –

+0

oh whoops, sorry – abcf

ответ

0

Он оценивает, найден ли '*' или нет, путем преобразования его в boolean. Это простой Javascript.

~[1, 2, 3, 4].indexOf(4) 
//returns -4 (bit inversion of 3) 

indexOf возвращает 0, 1, 2, 3 ... когда элемент существует. Бит-инверсия преобразует эти значения в -1, -2, -3, -4, ... соответственно.

Когда элемент не существует, возвращается -1. При инверсии бит остается 0.

Итак, когда элемент существует, вы получаете ненулевое значение. Когда элемент не существует, вы получаете 0.

При добавлении !! вы преобразуете значение в значение boolean (0 - значение false,! 0 - true, !! 0 - false; x (если не ноль) является значением не-ложного значения,! x является ложным, x является истинным).

Так что можно понимать как: если '*' в this.roles ...

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