location.href властивість проти методу location.assign ()


75

Чи існує якась особлива перевага / недолік у споживанні пам'яті JavaScript між використанням location.href = urlна відміну відlocation.assign(url) ?

Я думаю, мені цікаво, чи потрібно більше пам'яті для доступу до методу, на відміну від встановлення властивості.


2
stackoverflow.com/a/1865840/638649 відповідь може бути такою, якою ти
хочеш

@JuanMendes: Я успадкував програму інтрамережі, побудовану на <frameset>, яка протікає так, ніби вона була зроблена з паперу (швидкість близько 50 Мб на годину). Я намагаюся зберегти пам’ять де завгодно, де тільки можу.
Даг Вівер

1
Думаю, тоді питання полягає не в тому, скільки пам'яті використовується, а в тому, чи є витік, пов’язаний із використанням location.assignіlocation.href = ''
Хуан Мендес

6
Майбутні читачі: Я б твердо врахував, що: 1. location.hrefvs location.assign()не впливає на продуктивність, якщо ваш додаток не змінює місце розташування сотні разів на секунду; і 2. якщо ваш додаток це робить, це справжня проблема, яку потрібно виправити .
Джордан Грей

1
Що сказав Джордан Грей. Якщо ви не робите цього нецензурно багато разів (який варіант використання цього може вимагати ??), тоді ви зосереджуєтесь на продуктивності, коли цього абсолютно не повинно бути.
Дж. Мансон,

Відповіді:


30

Я завжди користувався і ніколи не мав проблем із:

location.href = url;

Виклик функції повинен бути трохи повільнішим, ніж доступ до властивості, але з точки зору пам'яті, на мою скромну думку, не повинно бути великої різниці.


Працює для мене. Я не думав, що буду багато економити, але не знав, чи є щось, на що я не помічаю. Дякую.
Даг Вівер

7
Неправильно! Навіть якщо різниця може бути, справа в тому, що якщо 'href' є властивістю, document.location - ні (внизу є get / set). По-друге, ми просто говоримо про µS, можливо менше. По-третє, залежно від контексту, використання assign()виглядає набагато перевіренішим, ніж присвоєння href(принаймні з jsdom) І нарешті, здається, що виклик assign()відбувається трохи повільніше jsperf.com/location-href-vs-location-assign/14 .
Джером

1
@Jerome погодився, що краще використовувати, locaiton.assign()оскільки це перевіряється. Призначення location.hrefніколи не вважалося правильним.
silvenon

41

Я особисто віддаю перевагу виклику функції натомість, оскільки виклик функції створює краще враження, що щось працює, і це не тільки значення змінної, що змінюється.

Але, мабуть, так, це може бути правдою, що location.href = url;швидше, ніж location.assign(url), хоча це може залежати від реалізації механізму JavaScript, див . Тест, який я щойно створив .


1
просто перевірив ваш тест, і здається, що location.href швидше до x1,5 разів у Chrome.
серцед

29

Я знаю, що це старе, але я натрапив на це, коли шукав спосіб перевірити, чи мої модульні тести переспрямовують на правильну URL-адресу.

Я б погодився, window.location.assign()якщо вас більше турбує тестування. Використання функції дозволяє знущатися над цією функцією та перевіряти параметри введення url.

Отже, використовуючи жарт:

window.location.assign = jest.fn();

myUrlUpdateFunction();

expect(window.location.assign).toBeCalledWith('http://my.url');

// Clean up :)
window.location.assign.mockRestore();

4
Майте на увазі, mockRestore()дзвінок тут не відновить початкову рідну функцію. Щоб зробити це належним чином, вам потрібно буде використовувати jest.spyOn()функцію - jestjs.io/docs/en/jest-object#jestspyonobject-methodname
Джоні

5

Чи існує якась особлива перевага / недолік у споживанні пам'яті JavaScript між використанням location.href = url на відміну від location.assign (url)?

НІ

Існує рівно нульова різниця.

Причина цього проста. Щоразу, коли ваш браузер завантажує нову сторінку, він запускає нову нову Javascript 'VM' зі сценаріями для цієї сторінки, що працюють у цій VM. Під час запуску будь-якого з тверджень у вашому запитанні ви вказуєте браузеру завантажувати нову сторінку, що означає знищення поточної ВМ (і звільнення будь-якої пов’язаної з нею пам’яті) та завантаження абсолютно нової ВМ для нової сторінки.

За винятком будь-яких дивних помилок браузера, чистий ефект завжди однаковий. Ваші сценарії працюють у новій віртуальній машині з точно таким самим споживанням пам'яті.

розташування

Якщо ви працюєте з об'єктом розташування у браузері і хочете мати можливість запустити цей код на Node JS (наприклад, для тестування або для ізометричного коду), ви можете використовувати ulocationуніверсальну / ізометричну реалізацію об'єкта Location. Повна інформація: Я автор цього пакету.


про що location.assign("#foo")?
Каутерит

Так, ви маєте рацію, що теоретично може бути єдиним винятком. Однак, швидше за все, той самий код насправді використовується під поверхнею, незалежно від того, ви викликаєте location. assign або assign для властивості. Налаштування властивостей, швидше за все, просто викликає assign. Ось як би я його будував. :)
Stijn de Witt

2

Перевірив мою машину / браузер, http://jsperf.com/location-href-vs-location-assign/2 , для Chrome 40.0.2214.93 32-розрядної версії на Windows Server 2008 R2 / 7 64-розрядної

location.assign був на 15% повільнішим, ніж location.href.


97
Так, те, що ви постійно робите у веб-програмі, - це перехід до нового місця 500 разів на секунду ... тому вам слід враховувати продуктивність.
meandre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.