Почему var bug = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 равно 15 [дублировать]

Это решение, которое я использую.

function Enum() {
    this._enums = [];
    this._lookups = {};
}

Enum.prototype.getEnums = function() {
    return _enums;
}

Enum.prototype.forEach = function(callback){
    var length = this._enums.length;
    for (var i = 0; i < length; ++i){
        callback(this._enums[i]);
    }
}

Enum.prototype.addEnum = function(e) {
    this._enums.push(e);
}

Enum.prototype.getByName = function(name) {
    return this[name];
}

Enum.prototype.getByValue = function(field, value) {
    var lookup = this._lookups[field];
    if(lookup) {
        return lookup[value];
    } else {
        this._lookups[field] = ( lookup = {});
        var k = this._enums.length - 1;
        for(; k >= 0; --k) {
            var m = this._enums[k];
            var j = m[field];
            lookup[j] = m;
            if(j == value) {
                return m;
            }
        }
    }
    return null;
}

function defineEnum(definition) {
    var k;
    var e = new Enum();
    for(k in definition) {
        var j = definition[k];
        e[k] = j;
        e.addEnum(j)
    }
    return e;
}

И вы определяете свои перечисления следующим образом:

var COLORS = defineEnum({
    RED : {
        value : 1,
        string : 'red'
    },
    GREEN : {
        value : 2,
        string : 'green'
    },
    BLUE : {
        value : 3,
        string : 'blue'
    }
});

И вот как вы получаете доступ к своим перечислениям:

COLORS.BLUE.string
COLORS.BLUE.value
COLORS.getByName('BLUE').string
COLORS.getByValue('value', 1).string

COLORS.forEach(function(e){
    // do what you want with e
});

Я обычно использую последние 2 метода для сопоставления перечислений из объектов сообщения.

Некоторые преимущества этого подхода:

  • Легко объявить перечисления
  • Легко получить доступ к вашим перечислениям
  • Ваши перечисления могут быть сложными типами
  • Класс Enum имеет некоторое ассоциативное кэширование, если вы используете getByValue много

Некоторые недостатки:

  • Некоторое беспорядочное управление памятью происходит там, так как я сохраняю ссылки на перечисления
  • По-прежнему нет безопасности типа
  • ]
117
задан smholloway 9 December 2012 в 18:25
поделиться

4 ответа

Это побитовое или . Поскольку побитовые операции имеют смысл только для целых чисел, 0.5 усекается.

0 | x является x для любого x.

122
ответ дан Anto 28 August 2018 в 07:28
поделиться

Этот пример поможет вам.

 
    var testPipe = function(input) { 
       console.log('input => ' + input);
       console.log('single pipe | => ' + (input | 'fallback'));
       console.log('double pipe || => ' + (input || 'fallback'));
       console.log('-------------------------');
    };

    testPipe();
    testPipe('something'); 
    testPipe(50);
    testPipe(0);
    testPipe(-1);
    testPipe(true);
    testPipe(false);

4
ответ дан Nikhil Mahirrao 28 August 2018 в 07:28
поделиться

Сравнение бит настолько просто, что это почти непонятно;) Проверьте это «nybble»

   8 4 2 1
   -------
   0 1 1 0 = 6  (4 + 2)
   1 0 1 0 = 10 (8 + 2)
   =======
   1 1 1 0 = 14 (8 + 4 + 2)

Побитовое ORing 6 и 10 даст вам 14:

   alert(6 | 10); // should show 14

Ужасно сбивает с толку!

121
ответ дан smholloway 28 August 2018 в 07:28
поделиться

Один канал является бит-мутным OR .

Выполняет операцию OR для каждой пары бит. a OR b дает 1, если a или b равно 1.

JavaScript усекает любые нецелые числа в побитовых операциях, поэтому его вычисляют как 0|0, который равен 0.

18
ответ дан Yahel 28 August 2018 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: