Тип аргумента битовой маски в JavaScript - PullRequest
1 голос
/ 29 октября 2011

Я вижу, что в PHP есть функции, которые могут принимать несколько параметров в один аргумент, например:

error_reporting(E_ERROR & E_WARNING);

Я хочу реализовать такую ​​функциональность в моей функции javascript. Знаете ли вы примеры функций, которые принимают аргументы такого рода?

Я совершенно не понимаю, как функция узнает, какие опции передаются ...

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

(Предположим, что вместо этого: error_reporting (E_ERROR | E_WARNING);)

Ну, это битовая маска.Так что E_ERROR может быть таким числом (в двоичном виде):

0010000

, а E_WARNING может быть:

0000010

, и когда они объединяются с|, вы получите

0010010

(одно целое число с несколькими установленными битами)

Затем функция может проверять, какие биты установлены с помощью оператора & bitwise.Конечно, вы можете сделать это в javascript, хотя это может быть менее распространенным, и, возможно, менее эффективным и надежным, поскольку числа становятся больше, поскольку в javascript на самом деле нет целых чисел, это действительно числа с плавающей запятой.

В javascript, вы могли бы предпочесть использовать что-то вроде этого:

error_reporting({warning: true, error: true});

(отредактировано, чтобы показать его более разумно, с | not &, чтобы объединить их)

1 голос
/ 29 октября 2011

Да, это возможно, но это работает с |.

var flag1 = 1,
    flag2 = 2; // powers of 2

function get(flags) {
    if((flags & flag1) === flag1) { // remove all other bits and check
        alert('flag1');             // whether you get the flag itself
    }

    if((flags & flag2) === flag2) {
        alert('flag2');
    }
}

get(flag1 | flag2); // alerts both

Конечно, вы можете создать вспомогательную функцию, которая выполняет проверку, чтобы вам не нужны эти круглые скобки:

function contains(flags, flag) {
    return (flags & flag) === flag;
}

http://jsfiddle.net/pimvdb/NpFYj/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...