Что такое оператор JavaScript >>> и как вы его используете?

капитан команды думает, что LabVIEW лучше для своей простоты изучения и обучения. Это верно?

я сомневаюсь, что это было бы верно для любого единственного языка или парадигмы. LabView мог, конечно, быть легче для людей с инженерным образованием электроники; создание программ в нем "просто" тянет провода. С другой стороны такие люди могли бы уже быть представлены программированию, также.

Одно существенное различие - кроме от диаграммы - то, что LV основан на спросе (поток) программирование. Вы запускаете с результата и говорите, что необходимо для получения до него. Традиционное программирование имеет тенденцию быть обязательным (движение наоборот).

Некоторые языки могут обеспечить оба. Я обработал библиотеку многопоточности для Lua недавно (Маршруты), и он может использоваться для основанного на спросе программирования в в других отношениях обязательной среде. Я знаю, что существуют успешные роботы, выполненные главным образом в Lua там ( Сумасшедший Ivan в Lua, О, Шесть).

141
задан Jon Seigel 7 April 2010 в 01:17
поделиться

6 ответов

Используйте комбинацию QuickGraph и График № (WPF) - обе первоклассные библиотеки. У меня они работают очень хорошо, но документации для Graph # почти не существует.

При выполнении побитовой операции число преобразуется в 32-битное целое число со знаком, теряются все дроби и старшие разряды, чем 32, перед выполнением вычисления и последующим преобразованием обратно в число.

Таким образом, при выполнении побитовой операции без фактического эффекта, как сдвиг вправо на 0 бит >> 0 , это быстрый способ округлить число и убедиться, что оно находится в 32-битном диапазоне int. Кроме того, тройной оператор >>> после выполнения своей операции без знака преобразует результаты своих вычислений в число как целое число без знака, а не целое число со знаком, как это делают другие, поэтому его можно использовать для преобразования отрицательных значений. в 32-битную версию с дополнением до двух как большое число. Использование >>> 0 гарантирует, что у вас есть целое число от 0 до 0xFFFFFFFF.

В данном случае это полезно, потому что ECMAScript определяет индексы массива в виде 32-битных целых чисел без знака. Поэтому, если вы пытаетесь реализовать array.filter способом, который точно дублирует то, что говорит стандарт ECMAScript Fifth Edition, вы должны преобразовать число в 32-битное целое без знака, как это.

(В На самом деле в этом мало практической необходимости, так как, надеюсь, люди не будут устанавливать array.length равным 0,5 , -1 , 1e21 ] или 'LEMONS' . Но мы говорим об авторах JavaScript, так что вы никогда не узнаете ...)

Резюме:

1>>>0            === 1
-1>>>0           === 0xFFFFFFFF          -1>>0    === -1
1.7>>>0          === 1
0x100000002>>>0  === 2
1e21>>>0         === 0xDEA00000          1e21>>0  === -0x21600000
Infinity>>>0     === 0
NaN>>>0          === 0
null>>>0         === 0
'1'>>>0          === 1
'x'>>>0          === 0
Object>>>0       === 0

(*: ну, они определены как ведущие Меня не удивило бы, если бы какой-нибудь движок JavaScript действительно использовал целые числа, когда мог, по соображениям производительности.

198
ответ дан 23 November 2019 в 23:09
поделиться

Это оператор сдвига вправо без знака . Разница между этим и оператором правого битового сдвига со знаком заключается в том, что беззнаковый правый битовый сдвиг ( >>> ) заполняется нулями слева, и подписанный оператор сдвига правого бита ( >> ) заполняется битом знака, таким образом сохраняя знак числового значения при сдвиге.

32
ответ дан 23 November 2019 в 23:09
поделиться

Дриис достаточно подробно объяснил, что такое оператор и что он делает. Вот его смысл / почему он был использован:

Сдвиг любого направления на 0 возвращает исходное число и приводит к преобразованию null в 0 . Кажется, что пример кода, который вы смотрите, использует this.length >>> 0 , чтобы гарантировать, что len является числовым, даже если this.length равно не определен.

Для многих побитовые операции неясны (и Дуглас Крокфорд / jslint предлагает не использовать такие вещи). Это не значит, что это неправильно, но существуют более подходящие и знакомые методы, позволяющие сделать код более читабельным. Более четкий способ убедиться, что len равно 0 , - это один из следующих двух методов.

// Cast this.length to a number
var len = +this.length;

или

// Cast this.length to a number, or use 0 if this.length is
// NaN/undefined (evaluates to false)
var len = +this.length || 0; 
28
ответ дан 23 November 2019 в 23:09
поделиться

>>> - это беззнаковый оператор сдвига вправо (см. с. 76 спецификации JavaScript 1.5), в отличие от >>, знакового оператора сдвига вправо.

>>> изменяет результаты сдвига отрицательных чисел, поскольку не сохраняет бит знака при сдвиге. Последствия этого можно понять на примере интерпретатора:

$ 1 >> 0
1
$ 0 >> 0
0
$ -1 >> 0
-1
$ 1 >>> 0
1
$ 0 >>> 0
0
$ -1 >>> 0
4294967295
$(-1 >>> 0).toString(16)
"ffffffff"
$ "cabbage" >>> 0
0

Итак, вероятно, здесь предполагается получить длину или 0, если длина не определена или не является целым числом, как в примере с "капустой" выше. Думаю, в этом случае можно предположить, что this.length никогда не будет < 0. Тем не менее, я бы утверждал, что этот пример - отвратительный хак, по двум причинам:

  1. Поведение <<< при использовании отрицательных чисел - побочный эффект, который, вероятно, не предполагался (или мог возникнуть) в приведенном примере.

  2. Намерение кода не очевидно, о чем свидетельствует наличие этого вопроса.

Лучшей практикой, вероятно, является использование чего-то более читабельного, если только производительность не является абсолютно критичной:

isNaN(parseInt(foo)) ? 0 : parseInt(foo)
15
ответ дан 23 November 2019 в 23:09
поделиться

Оператор беззнакового сдвига вправо используется во всех реализациях метода array extra's в Mozilla, чтобы гарантировать, что свойство length является беззнаковым 32-битным целым.

Свойство length объектов массивов описано в спецификации следующим образом:

Каждый объект Array имеет свойство length, значение которого всегда является неотрицательным целым числом меньше 232.

Этот оператор - самый короткий способ достичь этого, внутри методы массива используют операцию ToUint32 , но этот метод недоступен и существует в спецификации для целей реализации.

Реализации Mozilla array extras пытаются быть ECMAScript 5 совместимыми, посмотрите на описание метода Array.prototype.indexOf (§ 15.4.4. 14):

1. Let O be the result of calling ToObject passing the this value 
   as the argument.
2. Let lenValue be the result of calling the [[Get]] internal method of O with 
   the argument "length".
3. Let len be ToUint32(lenValue).
....

Как видите, они просто хотят воспроизвести поведение метода ToUint32 для соответствия спецификации ES5 на реализации ES3, и, как я уже говорил, оператор беззнакового сдвига вправо - самый простой способ.

56
ответ дан 23 November 2019 в 23:09
поделиться

Две причины:

  1. Результатом >>> является "интеграл"

  2. undefined >>> 0 = 0 (так как JS попытается принудить LFS к числовому контексту, это будет работать для "foo" >>> 0 и т. Д.)

Помните, что числа в JS имеют внутреннее представление типа double. Это просто «быстрый» способ базового ввода длины.

Однако , -1 >>> 0 (ой, вероятно, не желаемая длина!)

10
ответ дан 23 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

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