2013-03-09 5 views
1

Я изучал Framework AngularJS. Я обнаружил, что они использовали оператор |, чтобы добавить вещи. В чем разница, когда вы используете оператора + и оператора |?Разница между использованием и | операторов в JavaScript?

Это связано с производительностью? Если да, то как?

Вот код, который просил: -

var manualLowercase = function(s) { 
    return isString(s) 
     ? s.replace(/[A-Z]/g, function(ch) { 
      return String.fromCharCode(ch.charCodeAt(0) | 32); 
    }): s; 
}; 
+0

добавить вещи? добавить что-то? | побитовое или, + является арифметическим добавлением или конкатенацией строк – Kokizzu

+0

Базовая арифметика. Есть ли ограничение производительности? – Abilash

+1

Не могли бы вы предоставить код, где вы это видите? – treeface

ответ

5

Они разные операторы.

Где x и y являются числами , x | y является bit-wise or и x + y является дополнением. Для около значения x и y у них будут одинаковые результаты - для всего остального результат будет различным .

Во всяком случае, используйте форму, которая означает, что необходимо . Не беспокойтесь о производительности, если нет случая с производительностью - jsperf - удобный инструмент для этого. Тогда поймите, что микро-бенчмарки и по своей сути предвзятые и это usually doesn't matter.


Для этой конкретной проблемы, обратите внимание на регулярное выражение соответствует каждому символу A-Z и заменяет его с результатом функции.

Таким образом, мы знаем, что charCodeAt(0) является символьным кодом для A..Z. Посмотрев на character table, мы можем видеть, что эти значения находятся в диапазоне [0x41, 0x5a] и отмечают, что [0x61, 0x7a] - соответствующие строчные буквы. Таким образом, мы можем пойти {A, B .. Z} -> {a, b .. z}, добавив 0x20 (или 32) к символьному коду буквы верхнего регистра.

Также можно заметить, что при добавлении 32 (или 1 < < 5) к ряду без 5-й набор битов (например, число в диапазоне [0x41, 0x5a]) может быть достигнуто с побитового или с 1 < < 5 (т.е. x | 32). Вот почему | и + взаимозаменяемы здесь. Добавление 32 (т. Е. X + 0x20), возможно, более понятно, даже если оба оператора будут вести себя эквивалентно по правилам выше.

В любом случае, если знать последствия производительности любой из этих подходов, тест Кодекса в полном комплектев контексте) на соответствующих/целевых средах.


Оператор x | y является всегда побитового или (с помощью [ToInt] конверсии), но x + yможет быть конкатенации.

Результаты будут такими же только тогда, когдаx и y не оба числа (или, скорее, ни является строкой), могут быть конвертированы с помощью [ToInt], не имеют нет набор битов в общем, и в диапазон около [0, 2^32] или около того.

4

+ является оператором добавления, | является побитовым оператором. Но поскольку вы говорите: «Это связано с производительностью?» , так что я думаю, что ваши средства, которые лучше между ниже двух:

x = 0 | '5'; 

или

x = + '5'; 

согласно MDN page on Arithmetic Operators:

унарный плюс это самый быстрый и предпочтительный способ преобразования что-то в номер

дополнительно, читать комментарии к my answer here, некоторые браузеры лучше работают с |.

чтения Также wiki: Bitwise operation

На простых процессоров недорогих, как правило, битовые операции значительно быстрее, чем деление, в несколько раз быстрее, чем умножение, а иногда и значительно быстрее, чем того

Вот вам interesting link 'jsperf'.

+0

'x = | '5'; 'не JavaScript. –

+0

@JustinMorgan Да, я сделал ошибку, теперь исправлено спасибо –

+0

@pst Да, вы правы из-за '+' Я совершил ошибку с '|' Теперь исправлено. –

-1

При работе в бинарных переменных мы можем использовать или (|) вместо плюс (+) оператора. Это даст тот же результат. Вы можете знать о бинарной арифметике. Просто Google, и вы наткнетесь на хорошие поиски.

+3

'|' побитовое ** или **, а не побитовое ** и **. Кроме того, неверно, что они дадут тот же результат. Сравнить 'true | true' с 'true + true'. –

+0

очень сожалеет об этом. Исправлено это. Но это не правда! true' и 'true + true' даст тот же результат, когда они являются двоичными vars. –

+0

Нет, 'true | true === 1' и 'true + true === 2'. Таким образом, у них разные результаты. Оба эти значения будут «истинными», если вы оценили их как логические, но это не то же самое, что получить эквивалентные результаты. –

1

Я только начинаю изучать javascript. До сих пор я слышал о «+» операторе, который используется для добавления двух строковых значений или двух значений. Если вы добавите число и строку, то оно предоставит только результат строки. Если вы укажете оба числа, я даю результат сложения двух чисел.

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