Каким должно быть значение [1,2,3] .slice (1, не определено)? - PullRequest
4 голосов
/ 06 августа 2011

Я нашел разницу в обработке

[1,2,3].slice(1, undefined)

между chrome (который возвращает [2,3]) и firefox (который возвращает []).

Оба, конечно, вместо этого соглашаются на [2, 3] в качестве значения

[1,2,3].slice(1)

и они оба согласны с [] значением

[1,2,3].slice(1, null)

Что из двух правильно? Или может быть это неясно указано в стандарте?

Ответы [ 3 ]

8 голосов
/ 06 августа 2011

В спецификации сказано:

7. Если end равно undefined , пусть lativeEnd будет len ; иначе пусть lativeEnd будет ToInteger ( end ).

Какую версию Firefox вы используете? Firefox 5 дает мне правильно [2, 3]. Обновление: Firefox 3.6 возвращает действительно пустой массив.

Я не знаю, что здесь не так, потому что если вы позвоните slice() без второго параметра, end будет тоже undefined.

Обновление:

После небольшой игры кажется, что возвращается пустой массив, если второй параметр, переданный .slice(), равен NaN. Пример (+undefined возвращает NaN):

> [1,2,3].slice(1, +undefined)
> []

То же самое в Firefox и в Chrome.

К сожалению, это также не соответствует спецификации, так как ToInteger(NaN) [spec] должно возвращать 0, поэтому массив должен на самом деле быть нарезанным до конца.

Я не утверждаю, что это причина того, что это не работает должным образом в некоторых версиях Firefox, я не знаю реализацию.

Случай незначительной дезориентации ... не говоря уже.

5 голосов
/ 06 августа 2011

Я не уверен, определено ли это в стандарте, но я могу вам сказать, что это сложный вызов. Как говорит Феликс, это не стандартное поведение, но я могу понять, почему это так.

Как вы, возможно, знаете, undefined - это значение, установленное для параметров, которые не передаются при вызове функции,Однако в вашем примере вы фактически передаете undefined, поэтому переданные аргументы на самом деле равны двум и отражаются в arguments.length.

Итак, из того, что вы говорите, легко представить, что в Chrome второй параметрпроверяется с помощью typeof param2 == "undefined" и в Firefox они используют arguments.length > 1.Так что не (полностью) Firefox ошибся, как предполагает Феликс, они просто предполагают, что undefined никогда не будет передано напрямую как второй параметр.

Вы, вероятно, столкнетесь с некоторыми из этих случаевиспользуя undefined вот так, я бы порекомендовал вам его не использовать!

3 голосов
/ 06 августа 2011

Проверенная в посте версия Firefox неверна. Однако Firefox 5 работает в соответствии со спецификацией , а [1,2,3].slice(1, undefined) оценивается как [2,3].

Из стандарта ECMAScript ed5 :

Метод slice принимает два аргумента, start и end, и возвращает подстроку результата преобразования этого объекта в String, начиная с начала позиции символа и заканчивая, но не включая конец позиции символа ( или через конец строки, если конец не определен ) ...

Удачного кодирования.

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