Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

JavaScript JavaScript Foundations Functions Return Values

Tommaso Bufano
Tommaso Bufano
13,821 Points

Thinking there's an easier way to do this?

I just used the following code to pass this task:

      function arrayCounter (myArray) {
        if (typeof myArray === 'undefined') {
          return 0;
        } else if (typeof myArray === 'string') {
          return 0;
        } else if (typeof myArray === 'number') {
          return 0;
        } else {
          return myArray.length;
        }
      }

This is what I tried first but it didn't pass. I'm thinking, though, that this should have worked, too?

     function arrayCounter (myArray) {
        if (typeof myArray === 'array') {
          return myArray.length;
        } else {
          return 0;
        }
      }

4 Answers

Hi Tommaso,

I think your first code block would be about what is expected of you based on what is taught in the course. Jeff Busch has shown you how to remove the repetition by using the logical OR operator ||

A further simplification could be to drop the else clause.

function arrayCounter(array) {
    if (typeof array === "string" || typeof array === "number" || typeof array === "undefined") {
        return 0;
    }

    return array.length;
}

This is what the code challenge wanted. Either your answer or the simplified one from Jeff. This function has problems though. We could pass in a boolean, or an object, or a function and it would attempt to return the length of them.

You had the right idea for a more robust solution with your second code block. Rather than use typeof which doesn't work there is the Array.isArray() method. This returns true if the object passed in is an array, false otherwise.

function arrayCounter(array) {
    if (Array.isArray(array)) {
        return array.length;
    }

    return 0; // It must not have been an array so return 0
}

This would be more robust but beyond the scope of the course I think. Even this function though has a problem which also exists in the more lengthy solution. What if an empty array is passed in? It's going to return 0. The same thing you return when it's not an array. So you won't be able to tell the difference between these 2.

A better second return value might be -1. Arrays can't have a negative length so if it does return a negative 1 then you know it wasn't an array. If it returns a 0 then you know it was an array whose length was zero.

Hi Tommaso,

This is what I used to pass the challenge.

Jeff

function arrayCounter(array) {
        if (typeof array === "string" || typeof array === "number" || typeof array === "undefined") {
          return 0;
        } else {
          return array.length;
        }
      }
Kevin Korte
Kevin Korte
28,109 Points

Array is not an option to use with typeof that I'm aware of. MDN Docs have a list of possible return values.

Tommaso Bufano
Tommaso Bufano
13,821 Points

Thanks for the link! That was really helpful.

Tommaso Bufano
Tommaso Bufano
13,821 Points

Thanks, all!

At my point in the track, I hadn't yet learned about the pipe "OR" operators. It showed up a few tutorials later.

What a great community. You guys rock.