Как упоминалось в более раннем ответе, это поведение известно как с именем access по объекту window . Значение атрибута name
для некоторых элементов и значение атрибута id
для всех элементов становятся доступными как свойства глобального объекта window
. Они известны как именованные элементы. Поскольку window
является глобальным объектом в браузере, каждый именованный элемент будет доступен как глобальная переменная.
Это было первоначально добавлено Internet Explorer и в конечном итоге было реализовано всеми другими браузерами просто для совместимости с сайтами которые зависят от этого поведения. Интересно, что Gecko (движок рендеринга Firefox) решил реализовать это только в режиме quirks , тогда как другие механизмы рендеринга оставили его в стандартном режиме.
Однако, с Firefox 14, Firefox теперь поддерживает именованный доступ к объекту window
в стандартном режиме. Почему они изменили это? Оказывается, все еще есть много сайтов, которые полагаются на эту функциональность в стандартном режиме. Microsoft даже выпустила маркетинговую демонстрацию , которая предотвратила демонстрацию работы в Firefox.
Недавно Webkit рассмотрел противоположное , отменив именованный доступ на window
объект только для режима quirks. Они решили против этого по тем же соображениям, что и Гекко.
Итак ... сумасшедший, поскольку кажется, что это поведение теперь технически безопасно использовать в последней версии всех основных браузеров в стандартном режиме. Но хотя названный доступ может показаться несколько удобным, его не следует использовать.
Почему? В этой статье можно суммировать рассуждения о том, почему глобальные переменные являются плохими . Проще говоря, наличие множества дополнительных глобальных переменных приводит к большему количеству ошибок. Допустим, вы случайно набрали имя var
и случайно набрали id
узла DOM, SURPRISE!
Кроме того, несмотря на стандартизацию, все еще существует довольно много несоответствий в реализациях браузера именованный доступ.
name
доступным для элементов формы (ввод, выбор и т. д.).
, доступных через их атрибут name
. И я уверен, что есть больше, если вы попробуете использовать именованный доступ в случаях с краем.
Как упоминалось в других ответах, используйте document.getElementById
, чтобы получить ссылку на узел DOM своим id
. Если вам нужно получить ссылку на узел по его атрибуту name
, используйте document.querySelectorAll
.
Пожалуйста, не распространяйте эту проблему, используя именованный доступ на вашем сайте. Так много веб-разработчиков потратили время, пытаясь отследить это магическое поведение . Нам действительно нужно принять меры и заставить механизмы рендеринга отключить именованный доступ в стандартном режиме. В краткосрочной перспективе это сломает некоторые сайты, делающие плохие вещи, но в конечном итоге это поможет переместить веб-сайт.
Если вам интересно, я более подробно расскажу об этом в своем блоге - http://tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .
Вы можете использовать отрицательные смещения в head
(или tail
), поэтому head(x, -1)
удаляет последний последний элемент :
R> head( 1:4, -1)
[1] 1 2 3
R>
Это также сохраняет дополнительный вызов length()
.
Редактировать: Как отметил Джейсон, этот подход на самом деле не быстрее. Не могу поспорить с эмпирикой. На моей машине:
R> x <- rnorm(1000)
R> microbenchmark( y <- head(x, -1), y <- x[-length(x)], times=10000)
Unit: microseconds
expr min lq median uq max
1 y <- head(x, -1) 29.412 31.0385 31.713 32.578 872.168
2 y <- x[-length(x)] 14.703 15.1150 15.565 15.955 706.880
R>
Используйте длину, чтобы получить длину объекта и -, чтобы удалить последний.
v[-length(v)]
Отрицательный индекс в R извлекает все , но данные индексы.
Дирк и Изельзер уже предоставили ответы. Дирка, безусловно, самый простой, но в моей системе, по крайней мере, он немного медленнее, вероятно, потому что поднабор векторов с проверкой [
и length
дешев (и, согласно источнику, head
использует length
, дважды на самом деле):
> x <- rnorm(1000)
> system.time(replicate(50000, y <- head(x, -1)))
user system elapsed
3.69 0.56 4.25
> system.time(replicate(50000, y <- x[-length(x)]))
user system elapsed
3.504 0.552 4.058
Этот шаблон поддерживается для больших длин векторов и большего количества повторений. YMMV. Разборчивость head
, безусловно, превосходит предельное улучшение производительности [
в большинстве случаев.
Это еще один вариант, который не был предложен ранее. NROW
рассматривает ваш вектор как матрицу из 1 столбца.
v[-max(NROW(v))]#1 2
v1[-max(NROW(v1))]#4 5 6 7
Исходя из вышеизложенного, это (немного) быстрее, чем все другие предложенные методы:
x <- rnorm(1000)
system.time(replicate(50000, y <- head(x, -1)))
user system elapsed
3.446 0.292 3.762
system.time(replicate(50000, y <- x[-length(x)]))
user system elapsed
2.131 0.326 2.472
system.time(replicate(50000, y <- x[-max(NROW(x))]))
user system elapsed
2.076 0.262 2.342