Reputation: 9375
Following is some codes and output from the Chrome Developers' Console
Case 1:
var myarr = document.location.hostname.split("."); //typed
undefined //output
myarr[0] //typed
"ptamz" //output: ONE
Case 2:
var name = document.location.hostname.split("."); //typed
undefined //output
name[0] //typed
"p" //output: TWO
Why are the two outputs (commented Output: ONE, and Output: TWO) different?
Screenshot:
Upvotes: 7
Views: 661
Reputation: 166071
name
is a property of window
. It appears that when you try to set that property to an array, the keys are joined with a comma (the result of calling toString
on an array). So you are actually setting the window.name
property to the concatenation of each element of document.location.hostname.split(".")
, separated by commas.
Here's a screenshot from my Chrome console demonstrating what happens:
The reason name[0]
then results in p
is that you can access the characters of strings using square brackets:
name = "hello,world";
console.log(name[0]); //"h"
Edit
As others have mentioned, this will only be the case in the global scope. You are free to declare a variable named name
inside a descendant scope. Although, obviously, omitting the var
keyword in this case would still result in you accessing window.name
:
function example() {
var name = ["hello", "world"];
console.log(name); //["hello", "world"]
}
Upvotes: 13
Reputation: 25332
James is right: because name
is a string property of window
, if you're executing this code in the global scope you're set that property not your variable. So, if you set an array, it set to window.name
the string version of that array (basically, array.toString()
that is the same of array.join()
).
Because it's a string – and not an array – using the square notation let you access to the single character based on a specific index. So:
var str = "ptamz";
str[0] // "p"
str[1] // "t"
It's equivalent to:
var str = "ptamz";
str.charAt(0) // "p"
str.charAt(1) // "t"
Upvotes: 4
Reputation: 1188
name in global scope is an empty string, so in the latter case you get the array returned by split transformed into a string "www,hostname,com". So name[0] gets you the first letter only.
Upvotes: 1