359

When would you set location to a URL string versus setting location.href?

location = "http://www.stackoverflow.com";

vs

location.href = "http://www.stackoverflow.com";

Mozilla Developer Network Reference

4
  • 9
    setting location.href mail fail because of same-origin-policy: javascript.info/tutorial/… Commented Aug 25, 2014 at 7:49
  • 1
    Also, replace and assign: stackoverflow.com/q/1865837/632951 , stackoverflow.com/q/7703689/632951 , stackoverflow.com/q/10302905/632951 Commented Sep 28, 2014 at 14:16
  • 2
    I have an Angular 4 app that uses TypeScript 2.6.2. window.location is read only and I can only assign using window.location.href (in the context of a callback from an angular subscription), without compiler errors being reaised- maybe that's some kind of JavaScript 1.0 compatability thing or related to asynchronous handling. Basically window.location.href seems to be the only thing that always works. Commented Feb 28, 2018 at 4:00
  • Pertaining to the same-origin policy, note that the example you reference is within an iframe, so it might work differently when used on a normal page. Exact point of the page with the location.href policy: javascript.info/cross-window-communication#4q5rssu5ys Commented May 4, 2022 at 8:45

8 Answers 8

292

You might set location directly because it's slightly shorter. If you're trying to be terse, you can usually omit the window. too.

URL assignments to both location.href and location are defined to work in JavaScript 1.0, back in Netscape 2, and have been implemented in every browser since. So take your pick and use whichever you find clearest.

Sign up to request clarification or add additional context in comments.

1 Comment

Like mentioned by @SwissMister in the answer below, it seems that window.location.href is somewhat treated like an XHR request. If fired from within an XHR's success callback, window.location.href will be treated as an XHR while window.location emulates clicking on a link.
151

Even if both work, I would use the latter.

3 Comments

While implementing a complex PayPal integration, I encountered a very compelling reason to use window.location: it does not require SAME ORIGIN.
Maybe it's just me but location = 'http://www.example.com' seems super readable. Albeit, as a special case. That is backwards compatible and will remain compatible in the foreseeable future.
If window.location were an object, assigning a string to it would overwrite it with a string. In fact window.location is a property which has getter and setter methods. When you set it, a string is expected and the global Location object is updated by the setter. When you get it, the global Location object is returned.
65

Like as has been said already. But, you will do better to use the .href version.

10 Comments

Good explanation, better than just general comments about readability or maintenance. In reality in this particular case the object model will not be changed, as half the web would halt - therefore use either... it doesn't matter which
This sounds good but isn't really true. There is no concept of a default property in the DOM or JavaScript in general. Assigning a string to location works because the property was defined to have this special assignment behaviour back in JavaScript 1.0 and every browser since has implemented that. HTML5 now requires it. So whilst it may be prettier or more consistent to assign to .href, there is no backward or forward compatibility advantage to doing so.
window.location = url is prettier
location = url is cuter
"location.href = url is technically more correct" No, it isn't. As most it's more like the rest of Javascript. But in fact Location is a well-defined object and the specs around it are clear and implemented consistently across the board. So location = url is equally correct. But shorter. And thus should, imho, be preferred in our perpetual quest to shave as much overhead off of our pages as possible.
|
24

A couple of years ago, location did not work for me in IE and location.href did (and both worked in other browsers). Since then I have always just used location.href and never had trouble again. I can't remember which version of IE that was.

5 Comments

It was probably that one version of IE where it did stuff wrong and every other browser did it correctly. ;-)
in strict mode chrome will throw an exception if you try to assign directly to location too, so I always use location.href
"one" version of IE?
@Shawn D. A browser doing things correctly? When did that happen! :D
@Lpc_dark each one*
20

One difference to keep in mind, though.

Let's say you want to build some URL using the current URL. The following code will in fact redirect you, because it's not calling String.prototype.replace but Location.prototype.replace:

nextUrl = window.location.replace('/step1', '/step2');

The following codes work:

// cast to string
nextUrl = (window.location+'').replace('/step1', '/step2');

// href property
nextUrl = window.location.href.replace('/step1', '/step2');

Comments

16

Just to clarify, you can't do location.split('#'), location is an object, not a string. But you can do location.href.split('#'); because location.href is a string.

1 Comment

Your comment is true, but you are talking about getting the href attribute, a string, of the location object. All the other discussions are dealing with assigning a value, not reading the value. But your point is correct. The difference is that href is a string while location is an object.
13

With TypeScript, use window.location.href as window.location is technically an object containing:

Properties
hash
host
hostname
href    <--- you need this
pathname (relative to the host)
port
protocol
search

Setting window.location will produce a type error, while window.location.href is of type string.

Source

Comments

3

Use global.location.href instead, while working with React.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.