wrog: (Default)
[personal profile] wrog
  var answer = [];

  for (word in ['this','language','can','bite','me']) {
     answer.push(word);
  }
Just to make it easy, I'll tell you that the language in question is Javascript, [...] is an array constructor, and .push appends its arguments to the end of the list/array. The answer, of course, is...

  [0,1,2,3,4]
See, Javascript doesn't actually have arrays, Javascript has objects with numbered properties. And since foo.['whatever'] is defined to be foo.whatever with numbers and strings automagically converting to each other as needed, you'll never, ever notice the difference.

Unless, of course, you try to use for, which iterates through property names, not property values.

I suppose, to be completely fair, I should note that in Perl, some idiot could conceivably do
  for my $word (['this','language','can','bite','me']) {
     push @answer, $word;
  }
and get a list of length 1 for their trouble. Oh, well...

Date: 2005-07-14 01:34 pm (UTC)
From: [identity profile] acw.livejournal.com
So you have to say


var answer = [];

var foo = ['this', 'language', 'can', 'bite', 'me'];

for (index in foo) {
answer.push(foo[index]);
}


Yes, I'd say that's gratuitously confusing. Of course in Lisp you can do


(let ((answer nil))
(dolist (word '("this" "language" "can" "bite" "me"))
(push word answer))
answer)


and get ... yes ...


("me" "bite" "can" "language" "this")


But to be fair, you can use VECTOR-PUSH-EXTEND instead of PUSH to build an array instead of a list, and then it'll be the right way around. Or call NREVERSE when you're done. Or use Hairy Loop:


(loop for word in ("this" "language" "can" "bite" "me")
collect word)


which yields what you'd expect.

Date: 2005-07-14 01:35 pm (UTC)
From: [identity profile] acw.livejournal.com
Bleah, the CODE tag doesn't preserve indentation. Sorry.

Date: 2005-07-14 01:50 pm (UTC)
From: [identity profile] dougo.livejournal.com
I was surprised that "push" in Javascript appends rather than prepends. Push is for stacks, not queues.

Date: 2005-07-14 08:49 pm (UTC)
From: [identity profile] acw.livejournal.com
... and I neglected to quote the word list in my Hairy Loop example. Feh.

Date: 2005-07-15 06:18 am (UTC)
From: [identity profile] dougo.livejournal.com
Well, it's a stack in that .pop() pops off the end, but if you iterate over the stack it would go from bottom to top, which is weird. (Unlike Lisp push/pop.)
Page generated Jan. 23rd, 2026 06:25 am
Powered by Dreamwidth Studios