Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

for own key in { ... } #32

Open
benekastah opened this Issue · 15 comments

3 participants

@benekastah

Are there plans to develop a method to easily generate a javascript for...in loop like:

var obj = {a: 'a', b: 'b'}
for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
    doSomething();
  }
}

I think a variant of CoffeeScript's solution would be elegant:

for own key in obj {
  doSomething();
}

For me, this is the only really crucial thing I find missing from kaffeine. I will probably still end up using (and contributing) to it even with this missing because of how awesome async programming will be with this tool.

@weepy
Owner
@benekastah

or

for key ownedby obj { ... }

Edit: sorry, accidentally closed the issue.

@benekastah benekastah closed this
@benekastah benekastah reopened this
@weepy
Owner
@benekastah

hmmm... I feel like I'm a little bit stuck on own. I think it's an intuitive word because it is in the native JavaScript method hasOwnProperty. What about:

forown key in obj

making forown a new keyword?

@weepy
Owner
@weepy
Owner
@benekastah

Fair enough, lol. Well, I will try to put something together to make this work tonight. I'll pick a keyword for you to veto :)

Edit: just saw your comment above.

I always loop that way by default, because otherwise I am looping through all the parent prototypes of the object. When I'm looping through an object, most often I only care about the direct members of that object (although this isn't always the case). It's an optimization, but it's also a security measure, to make sure that I only modify what I'm expecting to modify.

@weepy
Owner

for x from y { .. } ?

@weepy
Owner

while we're on the subject, it would be nice to be able to range between two variables. i.e. sugar for :
for(var i=a ; i < b; i++)

could do

for i=1..3 { }

or

for i of [a..b]

@benekastah

I really like for x from y {...}. That one feels good to me.

About the ranges, what if a range simply resolved to an array?

[1...5] // compiles to [1, 2, 3, 4, 5]

Then looping would be built in:

for i in [1...5]

Additionally, one could use the for i of [a..b] construct you mentioned to skip doing for i, j in [a..b] to get the value. It might open up other useful possibilities as well.

@weepy
Owner

yeah :) how about:

[a..b]  
goes to
__array(a,b)

function __array(x,y) {
  var a = [];
  for(var i=x; i
@benekastah

I like it (I will infer the rest of that function :). Should we distinguish between inclusive and exclusive ranges?

[1..5] // => [2, 3, 4] or [1, 2, 3, 4] ?
[1...5] // => [1, 2, 3, 4, 5]
@weepy
Owner
@cmwelsh

I am authoring a language like Kaffeine. My thoughts are to steal from LiveScript in this instance: http://livescript.net/

The keywords used there are much less ambiguous (do I use one dot? do I use two? let me check the manual...)

for key in [1 til 10] {
}
for key in [1 to 10] {
}

Also I would like to see hasOwnProperty be the default looping construct. If you want ancestor keys then add something like this:

for all key in obj {
    console.log key
}
@weepy
Owner
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.