How about this solution, which – if I'm not mistaken – should fulfill all requirements:

- create a second array
- run through all elements of the input array
- for each number set the respective key in the second array to true
- run through the second array and return the first key which value comes back as `undefined`
- if no match is found, return `1`, so it will work for an empty input array as well

<hr>




    function findNumber(values) {
      let result = [];

      for (let i = 0; i < values.length; ++i) {
        if (0 <= values[i]) {
          result[values[i]] = true;
        }
      }

      for (let i = 1; i <= result.length; ++i) {
        if (undefined === result[i]) {
          return i;
        }
      }

      return 1
    }

[Try it yourself](http://jsfiddle.net/uacqsa2h/)

<hr>

<sup>Patrick and I had a discussion about the real time performance of our solutions (Here's [Patrick's elegant solution using `Set`](https://codereview.stackexchange.com/a/179058/21444)). We set up a test, containing around 1000 elements in the input array, including lots of negative values. [You can try the test yourself](https://jsfiddle.net/02ux7ahn/).
</sup>

<sup>
[JollyJoker suggested a similar version](https://codereview.stackexchange.com/questions/179037/given-an-array-of-integers-return-the-smallest-positive-integer-not-in-it/179053#comment340062_179053) in the comments using JavaScript's built-ins `filter`, `reduce` and `findIndex`. I fixed the suggested solution for edge cases and added it to the performance test. You can now [test all three solutions](https://jsfiddle.net/tdqwtsf8/). Keep in mind that these built-ins come with some overhead.
</sup>

<sup>
[Janos added code for his algorithm as well](https://codereview.stackexchange.com/a/179042/21444) now. To complete the performance test, I've added it as well and [here's the final fiddle containing all four solutions](https://jsfiddle.net/7k7kwz92/).
</sup>