Why Array.filter(Number) filters zero out in javascript?












8














I'm trying to filter all non-numeric out from array. We can see desired output when using typeof. But with Number, it filters zero out.



Here's the example (tested in Chrome Console):



[-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(Number)
// Which output with zero filtered out:
[-1, 1, 2, 3, 4] // 0 is filtered


If we use type of, it doesn't filter zero, which was expected



// code
[-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(n => typeof n === 'number')
// output
[-1, 0, 1, 2, 3, 4, 0]


My question:




  1. What is the difference between the 'Number' and 'type of' approach?


  2. Number filter zero, but 'Number' itself literally containing zero, and this makes me confusing.











share|improve this question







New contributor




imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

























    8














    I'm trying to filter all non-numeric out from array. We can see desired output when using typeof. But with Number, it filters zero out.



    Here's the example (tested in Chrome Console):



    [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(Number)
    // Which output with zero filtered out:
    [-1, 1, 2, 3, 4] // 0 is filtered


    If we use type of, it doesn't filter zero, which was expected



    // code
    [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(n => typeof n === 'number')
    // output
    [-1, 0, 1, 2, 3, 4, 0]


    My question:




    1. What is the difference between the 'Number' and 'type of' approach?


    2. Number filter zero, but 'Number' itself literally containing zero, and this makes me confusing.











    share|improve this question







    New contributor




    imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.























      8












      8








      8


      1





      I'm trying to filter all non-numeric out from array. We can see desired output when using typeof. But with Number, it filters zero out.



      Here's the example (tested in Chrome Console):



      [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(Number)
      // Which output with zero filtered out:
      [-1, 1, 2, 3, 4] // 0 is filtered


      If we use type of, it doesn't filter zero, which was expected



      // code
      [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(n => typeof n === 'number')
      // output
      [-1, 0, 1, 2, 3, 4, 0]


      My question:




      1. What is the difference between the 'Number' and 'type of' approach?


      2. Number filter zero, but 'Number' itself literally containing zero, and this makes me confusing.











      share|improve this question







      New contributor




      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I'm trying to filter all non-numeric out from array. We can see desired output when using typeof. But with Number, it filters zero out.



      Here's the example (tested in Chrome Console):



      [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(Number)
      // Which output with zero filtered out:
      [-1, 1, 2, 3, 4] // 0 is filtered


      If we use type of, it doesn't filter zero, which was expected



      // code
      [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(n => typeof n === 'number')
      // output
      [-1, 0, 1, 2, 3, 4, 0]


      My question:




      1. What is the difference between the 'Number' and 'type of' approach?


      2. Number filter zero, but 'Number' itself literally containing zero, and this makes me confusing.








      javascript numbers typeof






      share|improve this question







      New contributor




      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question







      New contributor




      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question






      New contributor




      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 1 hour ago









      imckl

      433




      433




      New contributor




      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      imckl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.
























          4 Answers
          4






          active

          oldest

          votes


















          6














          Because 0 is one of the many falsy values in javascript



          All these conditions will be sent to else blocks:



          if (false)
          if (null)
          if (undefined)
          if (0)
          if (NaN)
          if ('')
          if ("")
          if (``)


          From the Array.prototype.filter() documentation:




          filter() calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a value that coerces to true




          In your case the callback function is the Number. So your code is equivalent to:



          [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(a => Number(a))





          share|improve this answer























          • Thanks for the detailed explanation! Marked as accepted :)
            – imckl
            1 hour ago



















          1














          Zero is a falsey value. The typeof is always returning a boolean value. When the number 0 is returned, it is returning to the test, and therefore coming back as false, so the number zero is filtered out.






          share|improve this answer





























            1














            When you're using Number in filter, Actually it is passing each item of Array to Number constructor and in case of string or 0 Number will return NaN or 0 and both of them are false so filter is filtering out both of them



            whereas when you're using typeof then 0 has "number" type so it is returning true and filter method doesn't filtering it out






            share|improve this answer

















            • 1




              This answer with @adiga falsy explanation solves my confusing :)
              – imckl
              1 hour ago



















            1














            It's because 0 is a falsy value which returns false



            Documentation



            https://developer.mozilla.org/en-US/docs/Glossary/Falsy






            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });






              imckl is a new contributor. Be nice, and check out our Code of Conduct.










              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53920037%2fwhy-array-filternumber-filters-zero-out-in-javascript%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              4 Answers
              4






              active

              oldest

              votes








              4 Answers
              4






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              6














              Because 0 is one of the many falsy values in javascript



              All these conditions will be sent to else blocks:



              if (false)
              if (null)
              if (undefined)
              if (0)
              if (NaN)
              if ('')
              if ("")
              if (``)


              From the Array.prototype.filter() documentation:




              filter() calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a value that coerces to true




              In your case the callback function is the Number. So your code is equivalent to:



              [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(a => Number(a))





              share|improve this answer























              • Thanks for the detailed explanation! Marked as accepted :)
                – imckl
                1 hour ago
















              6














              Because 0 is one of the many falsy values in javascript



              All these conditions will be sent to else blocks:



              if (false)
              if (null)
              if (undefined)
              if (0)
              if (NaN)
              if ('')
              if ("")
              if (``)


              From the Array.prototype.filter() documentation:




              filter() calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a value that coerces to true




              In your case the callback function is the Number. So your code is equivalent to:



              [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(a => Number(a))





              share|improve this answer























              • Thanks for the detailed explanation! Marked as accepted :)
                – imckl
                1 hour ago














              6












              6








              6






              Because 0 is one of the many falsy values in javascript



              All these conditions will be sent to else blocks:



              if (false)
              if (null)
              if (undefined)
              if (0)
              if (NaN)
              if ('')
              if ("")
              if (``)


              From the Array.prototype.filter() documentation:




              filter() calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a value that coerces to true




              In your case the callback function is the Number. So your code is equivalent to:



              [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(a => Number(a))





              share|improve this answer














              Because 0 is one of the many falsy values in javascript



              All these conditions will be sent to else blocks:



              if (false)
              if (null)
              if (undefined)
              if (0)
              if (NaN)
              if ('')
              if ("")
              if (``)


              From the Array.prototype.filter() documentation:




              filter() calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a value that coerces to true




              In your case the callback function is the Number. So your code is equivalent to:



              [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(a => Number(a))






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited 1 hour ago

























              answered 1 hour ago









              adiga

              5,64361938




              5,64361938












              • Thanks for the detailed explanation! Marked as accepted :)
                – imckl
                1 hour ago


















              • Thanks for the detailed explanation! Marked as accepted :)
                – imckl
                1 hour ago
















              Thanks for the detailed explanation! Marked as accepted :)
              – imckl
              1 hour ago




              Thanks for the detailed explanation! Marked as accepted :)
              – imckl
              1 hour ago













              1














              Zero is a falsey value. The typeof is always returning a boolean value. When the number 0 is returned, it is returning to the test, and therefore coming back as false, so the number zero is filtered out.






              share|improve this answer


























                1














                Zero is a falsey value. The typeof is always returning a boolean value. When the number 0 is returned, it is returning to the test, and therefore coming back as false, so the number zero is filtered out.






                share|improve this answer
























                  1












                  1








                  1






                  Zero is a falsey value. The typeof is always returning a boolean value. When the number 0 is returned, it is returning to the test, and therefore coming back as false, so the number zero is filtered out.






                  share|improve this answer












                  Zero is a falsey value. The typeof is always returning a boolean value. When the number 0 is returned, it is returning to the test, and therefore coming back as false, so the number zero is filtered out.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 1 hour ago









                  bronkula

                  287




                  287























                      1














                      When you're using Number in filter, Actually it is passing each item of Array to Number constructor and in case of string or 0 Number will return NaN or 0 and both of them are false so filter is filtering out both of them



                      whereas when you're using typeof then 0 has "number" type so it is returning true and filter method doesn't filtering it out






                      share|improve this answer

















                      • 1




                        This answer with @adiga falsy explanation solves my confusing :)
                        – imckl
                        1 hour ago
















                      1














                      When you're using Number in filter, Actually it is passing each item of Array to Number constructor and in case of string or 0 Number will return NaN or 0 and both of them are false so filter is filtering out both of them



                      whereas when you're using typeof then 0 has "number" type so it is returning true and filter method doesn't filtering it out






                      share|improve this answer

















                      • 1




                        This answer with @adiga falsy explanation solves my confusing :)
                        – imckl
                        1 hour ago














                      1












                      1








                      1






                      When you're using Number in filter, Actually it is passing each item of Array to Number constructor and in case of string or 0 Number will return NaN or 0 and both of them are false so filter is filtering out both of them



                      whereas when you're using typeof then 0 has "number" type so it is returning true and filter method doesn't filtering it out






                      share|improve this answer












                      When you're using Number in filter, Actually it is passing each item of Array to Number constructor and in case of string or 0 Number will return NaN or 0 and both of them are false so filter is filtering out both of them



                      whereas when you're using typeof then 0 has "number" type so it is returning true and filter method doesn't filtering it out







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 1 hour ago









                      Abhay Sehgal

                      16318




                      16318








                      • 1




                        This answer with @adiga falsy explanation solves my confusing :)
                        – imckl
                        1 hour ago














                      • 1




                        This answer with @adiga falsy explanation solves my confusing :)
                        – imckl
                        1 hour ago








                      1




                      1




                      This answer with @adiga falsy explanation solves my confusing :)
                      – imckl
                      1 hour ago




                      This answer with @adiga falsy explanation solves my confusing :)
                      – imckl
                      1 hour ago











                      1














                      It's because 0 is a falsy value which returns false



                      Documentation



                      https://developer.mozilla.org/en-US/docs/Glossary/Falsy






                      share|improve this answer




























                        1














                        It's because 0 is a falsy value which returns false



                        Documentation



                        https://developer.mozilla.org/en-US/docs/Glossary/Falsy






                        share|improve this answer


























                          1












                          1








                          1






                          It's because 0 is a falsy value which returns false



                          Documentation



                          https://developer.mozilla.org/en-US/docs/Glossary/Falsy






                          share|improve this answer














                          It's because 0 is a falsy value which returns false



                          Documentation



                          https://developer.mozilla.org/en-US/docs/Glossary/Falsy







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited 1 hour ago

























                          answered 1 hour ago









                          AnonymousSB

                          2,149220




                          2,149220






















                              imckl is a new contributor. Be nice, and check out our Code of Conduct.










                              draft saved

                              draft discarded


















                              imckl is a new contributor. Be nice, and check out our Code of Conduct.













                              imckl is a new contributor. Be nice, and check out our Code of Conduct.












                              imckl is a new contributor. Be nice, and check out our Code of Conduct.
















                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.





                              Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                              Please pay close attention to the following guidance:


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53920037%2fwhy-array-filternumber-filters-zero-out-in-javascript%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Contact image not getting when fetch all contact list from iPhone by CNContact

                              count number of partitions of a set with n elements into k subsets

                              A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks