{"id":166,"date":"2011-02-24T15:27:19","date_gmt":"2011-02-24T23:27:19","guid":{"rendered":"http:\/\/www.wirfs-brock.com\/allen\/?p=166"},"modified":"2017-09-22T21:03:10","modified_gmt":"2017-09-23T05:03:10","slug":"a-javascript-optional-argument-hazzard","status":"publish","type":"post","link":"https:\/\/wirfs-brock.com\/allen\/posts\/166","title":{"rendered":"A JavaScript Optional Argument Hazard"},"content":{"rendered":"<p>My recent post on <a title=\"http:\/\/www.wirfs-brock.com\/allen\/posts\/128\" href=\"http:\/\/www.wirfs-brock.com\/allen\/posts\/128\" target=\"_self\">testing for negative 0 in JavaScript<\/a> created a lot of interest.\u00a0 So today, I\u2019m going to talk about another bit of JavaScript obscurity that  was also inspired by a Twitter thread.<\/p>\n<p>I recently noticed this tweet go by:<br \/>\n<img loading=\"lazy\" decoding=\"async\" style=\"border: 1px solid black;\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfwAAABVCAYAAACsNlaBAAAgAElEQVR4Ae1dC0BVVdb+TMSLgk80NEShfAQTvtAsAR9gJKkJk6KN0O8jDWoGG+0PZlLTarBJM6dJ0pGcX5yUHuCvhr8PzBSTFDNJSEXBByn5AgXlykP\/tfa553Lu5d7LQyyzvZV7ztmPtff+zj577bX22ns3uUUO0kkEJAISAYmAREAicE8jcN89XTtZOYmAREAiIBGQCEgEBAKS4cuGIBGQCEgEJAISgd8AApLh\/wZesqyiREAiIBGQCEgEJMOXbUAiIBGQCEgEJAK\/AQQkw\/8NvGRZRYmAREAiIBGQCEiGb6MN6EtLUVxcikobcWSQREAiIBGQCEgEfg0ISIZv9S2V4uOIoQgMHIqX\/nPMaqz6BlReyMb69evp7yuckyOJ+sIn40sEJAISAYlAAxGwa0i6qltVSjJewd+kHhTM45vvAMC0avNT81NpqfG1abVxuHhqmOHa9L6m9Sg0cP7ilXrFtxVZ\/+NuvPnmSorihvjAIejkaCv2rz2sCteu6YGm9tDpmqF+qFdBr0n7a0dCll8iIBGQCPzSCDSI4RuZsspIuRbqPV8tOXMGbS2Oub\/K0FV\/flb9rOWlxr2tqyOmfJKBCKZhZwZTZSX0JJ3rdGb+JvlRHOJ15nF0LZwMsTqihc4kgfJQqSfadjXSmcfUE3E7nQ7WS6BHxurVyPMIxrO+rubJb\/+54jz2f3MBj\/h6wVI1zmV\/hc17jmqmQ+zw4OCRCPDqVGve57LSsDnjhCZtB\/j\/fhR6tW9GaatQkJ2Nqi4Po2srfpZOIiARkAhIBOqCgHV+UVtqcwavMvTa0mnDtQzbEhO35sfp1LTqVZu\/em8epvpry2D1vhSp787FhrzrGBgxD1MeZ0ZViq8++htmLdsqUrn5h2NU15+w74fLQOcxWDQ3GHZn9mP5kveRuCtHodzWDWMmRuNPU\/pj59\/nIvnwScUfmXhuZASmvfYWXhjSCce+SsKHCf\/GrpwiY7rx\/zUbUX94HI44h4\/+Mh\/7LreD35MDcSL5A2wQ8dpizKt\/w1\/GDbDI+HnGQF9p0MYYcm2sS8VP3+Ngjh36+NakeCk7FRv3FMDVexge79MFuvJrOJG1C3v2bAQcJiDAo1XNRAafivP7sZGYvatPIIZ4dqEK\/ITMbanY9fmXcJn+BNrgJk7sycCNIGb4VsnIAImAREAiIBEwQ6DhDF9lnnxlx8xV9RMeZj+WwtW0HFXLnNWktfmp4Wp6lZ7WX1sm9tc+q\/lYuRYe3oVM4tvn+xQIhv\/10gjMSjxtjH16VyKWqU9uA1Gpz8bskEhi5eTcfODf7Tp2EePfsGwWNhT8HW\/hJHJyqtOjKAdf\/3AJTxTF49k3lUFEW08fPIgTlO9pfLLkTyi0\/wTvjryKnVszwUOIzEwlnpJtETa8HQlXz52Y4mV5bsD4gq8VIG3rlzhxoYySOqBbX38EDOiKphUF2PDZt3D1aofsjBxwaIee\/hg1pBdwbj\/WpQPjaEDBUnxV8REkJx\/DgIBO2LHlhChC4qfN8ey4QdVSftV57CJm7+QdjOBBBs0CaSK8fENgX\/UpMo+fRRUxfGvq\/aqy64JuVw8PtORMda4YMmIYru06i7LrBdi1LhWFHGPLKqRQHiH97ZG+OQ05hSUinZNrXzwVNAAONHD4LP0q3NtdRdaJCxTmAO\/ApzHIxmBDEJA\/EgGJgETgHkXgzhjtqYzXHDSVEXO4ynjZT+uvPlvz06bV5qPeq+k4bzUPvmenxlGeav1tbojhCFIdEzNfbWD2bmMWYGdmJjI2\/gM+Gip2qDA++Y+KwN\/eXY2UxVEYM2YMntDpMXhuMnaunGaI44n4nZlY\/UIfXCrUw83TE\/7hC7Ft9Yf4cPVHGN9WiXbx0lWaUgBaGFK19X+ZJOBMpKcsJCsAxe385rjhztrlKtKSUonZO2JQYBAGe7bGyYNb8EX2JUpA8+wlhcjMyEevYcEI9OmGC0d34btzFagqv46yIoUBM+WKKz+hqPIKbt7\/CPy8O5BPWzz6WC9Gp9rpr4B1FA953G\/0q6qqAv91HzIOE5\/oZZXZc4Jmbe8n1gzs+WQFUrZ+hawjp1Cs647gMWTv0OJ+DPDzoVwp55590ZtE\/Nxt64nZ6zA4aDSCh3mjrOAg9p+6RvndQEnRCWSdb4XA4GD0da1A1s6DuMaZSCcRkAhIBH6DCBgFwHrVXWWqWoZqi5lq43FGanrzTC351+an5qvG0z6zn\/psK1\/zclh41p\/OUSR3Cps4YTip2cl1ehwvTPPEtJUse5Oza4XOyh12LfsTfJcRYyKJfdTQMXj+2WCRprSZvSEGMTfD3YAX\/o5F\/Xdi54Fv8ecXVmMXqxWsuEf8H0MnfmtdBuH3nsASjlpuJbLBu+JcDk6Qfn\/Q78fAuz3J1h4k2V9dgV3f\/gB9D1Kbk+s27GkM6M46cmc8mHkSV8uJqLkY3lTxaEryfBfXdkBOU\/RwbWMSTX\/xLM29O6FjW0Pt9Hn4n9Xbq+fjHTzxh3BftBS51vxp2qoXwv\/QDt\/SgOroiaPIOEl\/uwjHBwdjdIAXOnV\/BJ12Z+LGg33g0akZzpf6YLD3Q\/BybQV9cTmVPgt2xnI7ICgkAF1JU9C1aQ8c3JiPn8iuwoM1B9JJBCQCEoHfGAINYvh8wN6tm\/TX5Baa3GxCPJWuTYi7ahm7ltEyqObPFoAWNMifrzdv3jSlp41PQSaOGbslPzVPvpIuo4nhn9UBhwlR0wddxweERM0K+UvXiXsa3JWrpeotMXwPzM3cjpHbt+HLHWnYRmr4opxMJPLfsnR8kvE3dKyObbirxPa\/DEKMQVPf1tMf4dPGY9PKT4SkbB79d91rUjCPY\/5cVaWU10Fn5ITo7OEKFCrz+xza3L56INKcWsUNcyJmzyIl2QfwVR24cBSdc2dSSBzFGeKsXV2Js+o64+nRo1Fl3xSFBzYh46ea4wgt6Yqrl3C1aXv0GxJMf6RV0BfjWOaX2JOzB9889CCGdGWdBLkqHuU0Q9t2LZC5dR32KBp9Qaq1GIJQLDs33G9g7hUike28RWL5IxGQCEgE7lEEGqTSv6\/JfWhm1wzN7qM\/utrb2aNZU+VeXPm+jn92Te1EXLv77JRBAwHNAwh+Ztriak6L89b+qXlb8LMjC\/tmzYgO5cMDCabdIOfojG6GhCsXvIv9eWfw3fq\/Y9YnPAQgRyK\/Pm89IkZMwfur8zF2wYfYRlLq\/7zqr4TjCC6RdKl118uI1eqP4jMDs3cLjyeV\/ruIfmEi\/LQRNfflFQrz1njV8dZ0bFf0E6vzDczT2p2BSYpg+mmqsFr1UUw1VD8Y7lq2gwvdHss5afDQoX2nTujYngYqvLShFncm43N8nrzfODnSTNeG5v+HCZqVJvnz4OUStn2+C5c6DsaEiKmYPn0yPKmaxlyMN7VkKoMlAhIBicBvAAFTLlDHCl+7dg052Tm07Iw4GPNPkrBZer6vKY0fVH7KUrfBMaO97z4KYz9DfPUqmDBpCzre3xFd3LqAtQfMnPNP5ePMmTOwN6jAOZ5IrxK1diX6TEM4TX7O7Z3h\/qC7cVBhLblVf7seeIGY9663dwGnNyBy\/IYaUXVObXGu6DSK6O\/ZkXkYP6IzDm+j+ML1gQvPA1SwZMouB38aOQj+L3+Ah2lSOpMmvk8nvo8F6I+zmxKN0weoFryVZJrf2qRwNaquUw90oPy+TE1H62Af2F\/8HmlHy+Dk2Q0tzZi6moavTYUKPwffF\/RFn7bXsOvLo+RrWFbI6Sov42xxBTzaaGX89nh8sCs+2bMLKelAgM+DcKi6hmMZ25BRSGl4gp4Yd17GFhyp7I4g3+4mUwLO7g8CJ7Ow\/isnjKC0uqblOEkSPif1NEwpMIVrl37C1XZVuEL3jq1aw6FZBU59uwM5xOS7lVG7tGzDyEmlkwhIBCQCv0kEGsTwv9j0BbZv247HfR8XDJwZLDNkwZQtwGgtTDB3ksBLSkqQtj0Nq1atglMrJ1TSOvcVy1fQPHEXtGrVCjdv3bRK2zw7I7M3BPAgpORqCb47+B3efudttG3DJl\/1dAam22Pc3\/FxxxSs33IQZGeHHoGj8FDuh4hJzEHbh9yg6zAEH8e\/ill\/eRs5RZn45BNDPm5PYPHS\/0YXfuz1BMJ9Pkcic3hyJ0uaI\/ZvL+OryCU4TUx5A9EiCz54OuWADfpzDudCj+4iLv9o+X9z1ZJP62mMSWp69e027YiRYwdh4\/oMrP8P0Sfn4OqDp3y70gDknLCw16r0WXZm4bgZWbz7uBxDZuo6HKTntq4kuxcoZm\/NSOPhRKr77Z+sR\/DkcXDV8Pw2XsEYDV6HvwvrcgwDHrsO6Nu3G74\/QoRIfj+bW4ACmsnXE8PXzue36h6A4JIqpGbuwSdH93BkcnboOXg0fHmKgAYL97tSzplb8L\/XgzCsrwtSD6ZiFRfQzglOVOeTuzbCPdDNggZCBYRpSicRkAhIBH5bCDQhBmkQh+te8YSEBLi4uMDP3w\/p6elwdHQUEnwDSAlGXk4GYu8uehd\/mPQHOHdwxtUrV7H+f9fjueeeg4ODgzKfX\/fiGWPywKGiogI+\/X2wcuVKTHpuEjrf39kYXr+bC\/gwdCRWEhP2mfYPfPgCDXYq87Bg5HhsIN7tNm0lksniXnX60mLoaY2bnYOO8DFMJKuBfBWb91RqNs+ppH37i4gVOqBDmzslnlbRnDhZ39MUiK5Z9Xy+tliW7itIk1MzTRWOfLUFP7btiwBv3qPAkqugnfbKiEXbo5VYY2cpjjU\/2mmP860iE0FKa7O09I71pHHg3fx4QKDX3zTcW6Mt\/SUCEgGJwG8PgQaJPKrE\/sUXX+Dy5ctkD3cfLhddrrMUbg4z0wseFYyCggKcOnVKTA0MHDAQ+\/ftr1bPmyeq5ZmN\/tzd3XHs2DEUnC4gBkBM19ywrxYapsEd4D2EpEZampe58k\/wWakNbYtpT\/XSekDn2Ib+TLxMH0izoTPZwc8ObdrwUrc76ZqiGRnuaYTxOmXWjLCrmeYmrp8toB0DvBBglUoztGxZM6XV6CYBxOh1WtnfJND0gWw0BK8XvpzO5vDANK18kghIBCQCvxEEGsTwGRtmqJ0f6AzvR7yxYsUKMd\/bokULywxanUu3ACoze5bEd+7cCe\/e3nDQOYAlfmbUPXv2pF1t7SzTtEBL9eK557M\/noWzszPGPj0W3x36TgRxXrfjHo\/+GP\/j9Tn+8xnNP584hxInJzzSZxQinn8WfTpZkOJvJ7NfQ1p6V30fbqjG5NdQQVlGiYBEQCJw7yDQYIbPELC1fn5ePp588kn0H9Af+\/btE37MWI3W8OqEgcpr+Vlzz8y5tKQUW7duRb9+\/dChYwdcKb6C77\/\/HgMGDEBLx5Zi0xZjGk5+q5o+Gwvy8kCW3pvcR\/c0Q9Hcvjnud7kfB\/YfwNWrV5X0lK4hUw6UTONox7jAP+Bv9CddM\/QLCZcwSAQkAhIBicCvBIHbYvhcRzaKY8O6xP9JxPVr1+Hj4wP9dbJoMzB1wZCFSb51RHjgMG\/ePNysuomS4hIxRfD81OfFoOF66fWaCbWDBg6lvHgQwKf4sYZg55c70cy+Gby9vYXBH2sQeJXA7Ur4NQsifSQCEgGJgERAIvDrQOD2GL5Beq+orECb1m3Qo0cPZNNJZmU3eEd2chzOf\/cpDFlI4vQsNAAGW0Fm9qwNYIZcRRu5cJj6x5v73KR\/LLmL+XdVM8C0yQkGbigDx+P4bm5uCBwRiL179wq6nFakFwlEMvkjEZAISAQkAhKB3xwCt8fwVQZMTPe+Zvdh06ZNcHd3x5AhQ8QcP6vrmZkLFTzvyqeK\/cykDWmZGV8rvYY33ngDr776Klzud8HxE8fBS\/9e\/OOLqCyvFDSMb4bTGZi8mDZQGT5pByppR7ntW7fj7NmzsNfsHCeke87QENdIS95IBCQCEgGJwM+OgL6YVjHRclsdrfCyecr4z14yKxnSseXFxaWotNORcbUjH2\/yq3Qke9+mIyZadbMKt6puiU1yQsaGoJVTK2zbsk0w7Y3\/uxEbNmxA6qZUbE7dLPxSU+n+i83i74sNX4iwwh8LaTvaL5GWloa0bWk49+M5fPP1N9iRtkMwcabHzHxn2k5k0PGoPD+f\/X02Tp44ibMFZ1FaWophQ4fBf4g\/2HiQmbvK9FmL0KSpRtKvQ5VzVs\/EiBGh2FRA0xMat3tJOPmPwIzVWRpfOjg3a7XwX3ngR6ybMQIjZiZTg2ZXifwd67Al17AFrz4LMyj9yqxik\/SN\/VBakIHkHfnWyVZexI7kLShs6G50N7IwPTDwDtaj1DaO5jW74+Uxz\/AOPP9MbeMOlLyBJEuxmr+V8JW4qKVQmYv59I2I7y9f+\/1VQvn+ZiDrUuN8R9rvJDc5FoHUplfnNOSIJdPvvGDLfCo\/lVOz87a2ir+W+\/yNrxMm05FlgESLV8PqoMcO6kNHjxtHp3CGIGZDbg0ypnmY9wM1oqNgi2kZa8aouw+3AdP3dhGblhAvGDka4yZOxEQq80jiC\/NX7zb073WnfTfEbDjDN0jawhCOmCtL0Wy5z1L2mjVrsPDthXSUaya+z\/oeP\/zwA44dPYa8vDwhfV+4eAFFV4pQcq0E1\/XXYdfMDs\/+4VlhqLdkyRKhgvfu440fjv2As4Vncf7CebH8r+hqkUh3qfgSiq8W48qVKyi+UgyeUli0aJFYu+9ElvM8j8\/lEoyepgiEhE9z\/EYNQx2Qd+vTj2KV4EC2tisqwJ7UQpE6b9s+aFl23r495O8Ejwdaw5HOlUEZjQbpUprzMabHJeAMb6NrcBasEtSgRrrSRzJ5DuKPaDaYN6Oc8++XERe\/Bj9q+1OzOHV7bOiyu9qo29WKo2UKd6o8lnNrbN873zYau8S3Q88R7r1o58bCr3Bc8zHp8w8gXZAtwZ6DZzQZXKRNoOj7cxkMN1qxeftYmX4nZZeV7abLqT+przP\/zi\/\/dLa+JO7K+GVF2nqY4tWgApdmY5V4hwGIjJ6NKf7uZmSs5HGp1CqDvfoT77dZxyW8ZrmZP1aUXtZ4VWLL\/IlYmpoNJw9fTKXyRkeGwcupBOmJC\/D8sgxN3F\/HbcM1E8TktU7Mp5NHUz6qjMLef\/99hIaEYuv2rULyv1F+QwwGWL3Pm+HcuHFDXHkXPTby8\/LyEtL5yn+txH+\/8t\/418p\/weGWA27ob4i4nNfN62SKT7Q5DTtm5FdLruK5iOfw9NNPiw17unbtCocWDmIgIKYTBJunw3gMaUTCOvw49uhDK8wTkX7wGCqDXIUKpzL\/O6SpaamT+v7iNPg5s0cxvvsqj\/h9CLxp\/1znuG0YZYhXadga2J5UQSbO8MwGhbz0sHEdMUsX6hftrdNt5tiesiyjMwkamHNzWo65fXsDE9clmQ6j6oKjSuqOl0fN6M5f1bZyZ9rGnS9\/fXJ4+LFAIDUF354oxqD+bUTSY3urO9LMLQdQGtpd2Sm5MAe7KYbHCB+0EcNperit78j0O+nY82EimEdng9R\/0Kgz+87Vz0r97O+Nd2mKl3hZ9f0haciV0nhNfwGhfsr7NiVhJY8W9mJHUN6wrJL6SxVfTusZsQTbI0ypNMpTZT4y0omSSzhWL48w7tY9io7qnj8yio4o34nCqEHinI9Gye9nIKLFrc7ZCSM4lvD5jx1dVeM7lqIFc6cXs3zlcrw+93WxRp\/PQ7fkeKDA0vjAgQPxyiuvkOndTezcvRPvvPOOiXGfpbRsI8B02zu3R4\/uPdD0vqZwbOkodv7jMompBhoh8EoCPkDHWhks0YbOA\/5eQHbaIVyMGS5eav5BZnAeiI4djKVxidjzQyH8\/Iizlp7AHhY8Qh6l41lLsWl+JDa2moy\/jyrGM1EJgvz66NH4YepSxI1Vzrb\/MXM9Fi5NQBqNEyglgqNj8cdRnoaGXIoDyf\/Ce\/GpYg95ER45E5Gh\/UWjL9y9DFFLLuDN1fPgadjcp4D8\/rTiBt7+1\/M4+nYkEqg8SHoNoV8NJL8YdNeMNwq2LEFUQrYo16zRoZi6dDWGXlqHV5bsh2tP2tc\/kwrV9XH0vfE9Wj71JuZNoHN4DS5300K8+tENvPmvZ\/HJtPnw\/vtyhHa\/RXWehT0PjMaAko2ITxWVgldAJGJmh8LF0Mryd6\/DwiUJyGPFg5MPwsd2xLZtNxAbH2Osh5oPgWobR02ZRJobuXh9Qv3KY8yrNAvzI18HrNVV4Hw77+Rl2hw5FwufXwQ81gvZKfxeXRC94l8Y5a55MVQg3i35h51rMP+1JKQzTi5eiJwZg9D+1M4EJoRzqwFofSRJtB3fyGWYF9rJanupzE1GZFQKQpbGI1Q0FsJ14Sx8lN8biz+Igju\/m+IsxE55HV1epnb1GJD8\/lKsSc0k\/RY5Jy+Ev\/QiIoZ35yc6AKkA695bhIQ0pf3AxRexc6MxvLvSeRfuXmnajjxCsIrycbXS0zj36kdIpGDvwdOIEgy\/GPu2EW2fcMx+cA8WJX2Jo6UT0J\/aeWHuIVGm8Y95UEGOCaxsf0dA7o7V+GBVIrL5eyDHktqM2dEI6m4n2pf2O1kwS4ze4dWVpcVK5G75NxYtT1LaK2nvfENm4MXpQXA2q4ueMB5t9p2Hi0MjTmPnx8sQl5givmMnwuqlBbMw3N3w0daCpSiw5scatm3yd2DxgjikG+roETAVc2ZOgNiJ2mY9DN9Yh+n4IMrP2Pdw\/5WEMMTPG6XJXYmrxcu8X1EiW\/9OlLYYr2CxYgrCUychPi7UyEjVb940j5cUsnlfIn5JBlJJ2mYn6jib6kjv4mLGSjz\/dgHeWvM6PFvW\/b0xHZuOND1iA\/T29qbR7LojJDIYRd87oYQ0pC6mn7Bp3LvsqUEqfWbSzODZqVI0M2rV8fK6ixcvoqWDombhdfHNmzUXaZ4e+zTmzJ2Dh3vxaJr2dG8uTlMRO+GxdoDpijl4CuM0fBIfpx8zZgz8\/f3Rrl07wdRb6FqA\/9jd3\/F+6Oxp+1VK7\/qAK7q6dUXz5s3FEj9Oe\/j7w8jNzYVjC8OHJlLV9uOIR\/x9KNJu5F7kuNSQt1BjI3XiUP\/h8CWftB05HIDSvGySC4Ahvg+K58vHC5H3bR5udRmIyGAaNZDr4BuCod1Z16+cH5OemIB97UIQHT2V9qsvROrSaHycwxN+PE8ZgRhi9td8QqgzjUWI1zWkElNUVUjnj1LHV3KW5PNqdzmf\/Aq\/xdVKO7gNGkHDEnJeAzE+ZCDamnVQdp084cv8gzqxgLBJ8O6ow\/n8\/SgsyRPM3sfHAy5desGVplzSEz5FfiXHZVeITUvTUNLSHZ0dy3C8pBCXyxT1Z+lZSpu0FPG7HRAeHY0wHxcaLMXjlRUHRMqLB1Zi+gJi9oRcNNUprHcBEhOJ8RXmU40tu9pwNE1Vv\/KYpHXsjA4263q774RzK6O65iGNmD28fODi5IpObWv2FPw1ZKYk4VDvcMTGRsKrMBvxMeFYZ7ABETinErO\/4AUvDye0amNvs704tu2Aa\/TeUr7mg4\/IlR7FRhplluSl4BvD\/Hjht6nILCmBi2sb7H4\/igZsR+E3dTbmEiP3bZmNxLgomtfmtlmAJc9OFszeNywac2OnUvnSERc1DpsMtGq0o85uNRikKIf606YXhlBbLPzqO\/rCyNHBTqzx9Ro8nIx\/B5NHHr45Wixi52ayfO+D\/oZBEmNl\/TsimjsWIooG5tntgzF77lzMDg8mculYFPU2tema34lLr2fw7tv\/wIPNaVyT+xmiFiUBvcMQ+8ZcTA12I4luESa+nyHKov3RWfnOeUowhZj9Q2GRiA4PoAIRVtPfQq5o8LVjqc2D7y1h63QmGSFRzOw9ED6b6jg1AHlpCZj87DLBWGurx+Wz1FftPapgb8iQv7vC45fNvsuaeJn3K7X1Xbq2vRASFkC9Dm1F3i8YIUO7mkjqfPiF9b4rj5g9SK1OfQt1XlzH2H8rfcvZw\/uM\/WFt9TVUsW4XEvoCmQVkJyAkdAaWrabjvQ\/koLBYD+\/Ql\/HevGkmglTdiP6yscxYQd0KI5i9QaXPEj2ry3l7XXaqap\/n1Y0b3VDcGxU38MILLxBwIcg7nofVa1bjqZFP4cKFCyKdkL4pHp+Ux2p71ZVXlmPG9Bl4NfZVrE9ZjylTpgg7gOvXr4u5fmbovr6+2LhhozDMK6fT6Fq0bIEO7Tvgetl1MY3g6OSIrdu2isNzYl6NAc\/z18W59+UOJxOZNMHo53gaXxJX9wj3gaOdKwYRx09P301d4HBc\/W4PxfPCwB4s5ZTCnsch1+1J2+iKMaMGUQeajcHjpiDIkzp4\/XmFUfvOxifzgkSDf9LLHiOnx6P0Kg0Xiw9jRSrJVj40AIgbJST64X4D0W5mCBJSViFryiDQGEg4reJReZEtaAtcHbyDnsWwNbQvQr8xmBDqqUTW\/Lp4B+HZpzYTMy\/DmP8KFUfK5giJBAiem4iXWWtBrmDLMWxclI7Nh4qF9FWasxX0zSFg8hOkUj0v4qg\/5eLGB0s\/jgNXE1Tv8tCJSNl7EMVRPbF9BXWe1Fkv\/Zi0Ehzu9zhc5j+LpekiocUfmzhaTFHtabs8\/an8WueMMTN8kWKtrsWZt\/lOlLx4gOZE732V4b1rS6Dei0GcL717kq4YpuH9OmPGuDlI+GArxr73BGrUqzgD4XG22stijKfRX0LqN7g4rT\/sDh8Ug1POL+NAHiaQZixzA01U0XQUT6dmnGe53gf+Q4egP4kufgN6Yt2aA\/BsZ4fC3Z+Cm2ZA7FrEDHdmEvQaPTFj9CwsXbEdgdRe7Sy0IxHR6k8bDBzhgaTEPThdGYHOPyiahcA+rtC5+Ihpte27jlD7e4jm77meQxWtBDFNBSsr3xHJjWUVzUlBEoJ33osSGjpSx6FT+RHMSrqMy3od+lv4TpwN0woFZ06KEvf2C8DwQQTMID9067oaJ6lvoa9UvBtjlSx85zkGBYj2e\/JAPqITL4M\/88KDtWPJ71\/ran2mzTUAACAASURBVGKrR\/LM0RTFAwtTlgstCL0R9O\/WHBPnpGBTVgSevHhSkLBWD6Urob5Kk5Hy3TH71bra+xXU8p3kTCFt4H8BW5LS0C9oEmmczGtoKQ8xDKSC+GLZxnkKg1X7lq+ob+E2rekPL9bnvWmrZ\/GephXfWItm\/\/4Ay5PSafC2lHRRinPyCMDLc2bCT1GjWEx9N3oqXLohJSOVOa97539NmzQVzJYZNTN5YTBH8+uqUwcBQU8Eif3xI6Mi0aFDB\/Tp20ekV+PxwIEN+NT46vV3j\/wOaz9eiz\/\/+c\/4atdXYsqAw\/iP1+6n707Hrt27sPX\/tuLD5R8iKYnUcCfycPr0aWz43w24dOkSfiz4Ee\/8\/R18+eWXana1Xu26eAlJ\/tvDp1F8bJ\/oKIcJdSIN\/IeTtECmRd\/lF+IISfPw8kcP8\/ZLMfQ0AGFXTss6tM7rEQ\/jB2XXqRd1bMDew7Ta4OwxMTIPmzhU06k44snwMIqRh+\/y1A9AS838Xq8wBlrSaM1VlIvuEtXF4mcPBNDpc6pzHRIiypXyWbrw2vdpIl29MObx6jhqXPHNuTwMNyMGOrTrwKHUmVQW4yRB5BT8tMLsRSIdhoYwhtfFU20\/1nC0ls5meSwkslXXxnknSqZumvduoRgCjbBxmnff5ncYRgwbBqMl83rVXjbg0dE0Oi3Zjh+KK3FiLw3ZqLNixVP2l0dQWkmDOmJOHmN9aTqKdpIcSpIoDXJjwkcLK\/nY+L3oNiSQbFN0uJx\/ShQ5LW46wsPDERoajvDnX1cGEEcLDUZVNduRpXpq\/Tx8FEn+yJlifL9HDClB\/J44DklYVM6S1G9RcPE4viWvgBFexu+GaVj7jjjMPehlvB\/9KHauXIL5sTMRSpb\/s5JYF0cnQYpf69+Jq\/dgMUhIobqKVTkzF+JsBx+MCvLWfJeCiEKpxnduwGFAzW+F864bltX0lTtzbCtRyl70BmIi6F2EhiKU3sv0OYwh8NW+PNS3HiKh1R\/reHGS2tsi9V001ctfvHl\/WJ2llTxc3FG9e7mmb6lOKO4at75E0s4ZQdPmIXnbRqxNXIE3SOsWTNrLkrw0LJgcjQOK8smsFHfvo+kgro7lZEbL8+UGoV5I+Czpqwyaw3TNdUYJX5X0mRH37tNb7MZXWFiIzH2ZQjPA0wE8DcDxWBXfzGA0w1b\/7FJSUpDwUQLCJoQJA75T1PE0a94M5TfKcfrUafTr30\/k7erqiojnIgSD59UCrMp3d3fHhx9+KHYD\/Ozzz9C\/X\/861pKi2XWBH\/WV6fv3YUf5fvLwxaMGdaLLI49Rh5CKPWlbUUYdpk90X4sdgaXMuMEP6KU9Ya5SSCstRGRluGpub6faETnSgMiis2cFp\/j6LQY3yFPnjd8HOyE7dTsOFLhhA\/F9p+AJCtO+UR+KZKQpolfUJ9HPG9dGXUlnI8pyu++k5nu3UkXr4zQLCWovm\/ug4XAiVcqe9F1ovrsEHpPGYGzLG0hdtAs7\/49UukQ12q+HoO0eFIOU3mOwc+tO7NmznaTqRPHnQ7YC4YbcfcPG45F29uLMC1r7Ckfe86KFR53bv3klHD0USX7\/7h1ovY\/b2FBh2MVydJ+R9AFm78X\/pV6lgbATpnu7GpPXxFP7HQEHVs5ETBKL2k7w8R2IsdEjUb59EYSXkYqVG2c\/JG5eiwNp27FtZwbSMtMQn01\/LuH4NDHCTENkhQZ71\/IubxdL5e07IWxSCNqRbFFO\/+xpbTv7t3DrCDh726hHqI2CNyRIKU29v5OGZGUtTb3eWzGydpPmq3VvDPeuOTArzd2EWVEbEbbqAwwnSd6ZBh38N2h4KMZtWYjJi9JwkIxN+xu0QtaKdDf5V4vh9SgVS\/XE34XqnRk9\/xd+BhrM+JlxqwMAtqZnl5efJ7a87dqtK37I\/gGXiy+L4285jA3rWMLnU+3U9fOCDs3j79ixQ6j\/o1+KxjD\/YQh+KhhPBD4h5vVZW5CwKgEOLR3EHD7P1ef8kEMS5UkUXS4S6n\/n9s5i2R\/P7dfP2cHTj6TQvCTEp+TBKcBPUScyEZp7JE0kzVvTHCF1KEP7dLFM2vDBq5bXxkg00jV33IE5dnxAzHGt30A9n9FVYg\/N67LxXlca5tIsB7kLuGIkUYnCk6eNsdWba+qNjatqRWwtyoBRkygoGzGTZ9EvMGlsH2tRrfvbdcIjQlL7XLMuWY+ta7lOyjDHemJDiDUca01Y9wjW6tqY74QlHFuO0UhNO1wdhebceSoJ7WmDkmpf411dygbnRzCW2mra0jihkh\/2SA+49+aBbzaWLiUlpVMwfMRA9iLWzQ\/Ha8llGBURhbjlydj26RtC0s3c9T2atmsr8u3QdxRJ96GYMGECTRn54\/IBGhDmFRrLVO8bNpD1oW8pMR5ppLUP9u9lJOHa24++h0JS+dO0g0sgHnY2Bik3FvDk74hXzmR\/RS2WpirWbktG3LwYRIwKQs+uNTt2S99JPhm2hk5eiXZBExAT9x4Zl27EbF+aCizchiOWpLp6tk+HRsWyJ4aMIel+gvJOxni1wIHte1BAQNRWj3IBlqKFFLCV5uGQogQRj5Z+LOHF8erUFi0RtOBnLQ8LUU28aquvSWQytn59wSLEpeQYva9eYkCu0zHl5Cou02A4D\/9c838mNg4cVEZT1OzsHawIYCL07vtROHEDyyWYPaVVr0yGpXQ2nuvg3AGl10iFQ47n79mxxN6xQ0ehHeDpAHZqWBkdHs+76rVs0VIwag7j+Xs1nJn4F5u\/wPmL5znIZIDB44\/KikpBl9X3ly5cEuv27XXKiLNz585iIKEv14u09flx8fYRDJjT+A311iRtA59hxMWE84MXm4sanObzgY4MCtliYP2K95C8O7e2AT+NyAdgCnV+JWlxmLEkGVm5WUhe8iJoepkUDGHoSXaHbn1700MJFry6BDsOZGAdhcdxT2l0Su9TkvQBlqy2vLmOMmjIw4pFq5F10ToT0nX3R5jaR7qEkYWxJbbDkkVNp\/pVEqsaPoXlw2zMCpmJ1ZuSsWzms4jPrJlG66OmZ7\/64qhNq9JU\/azV1mpdG+WdqKWwfWU9TUnqHMSu3oGcrB2YHxEjJPCp058QDF+tg5FKHcpGo1M8FkSNSjgyeutCbdWlD1h5z84jOEAwdeqy4VhUSKsIYmhjkS3Iyc3BFjoZklm5R79e6Bk4TpniiYnAkuTdyMnZTe9xIhLTs6Enycdiy7iRg9jAQLy8rrpTFZma\/OjQd7BaPrKF6amxsHDxRqDB5MZlCK+CqauzU2xpSvYidUcW8vOzsG7hDCxgi0Dq0Pm4D1X8tvSdOLS4QUawaZgVuxIZOTk4sGM9ksWyiX7opimeWhrz9lmlBli5ujcEyxq0aKpvegj5ZiJqfCy2kEFZFm3yNXk6GfFlH4X7Qy60RNlWPXRwfYiSFybhrZVkkJaxBQsjZhE1cjTy1H4nim6uln6lTm2RidtyNfOo0eYpueqnLSNTtV1fs3wdewr7FqTHIXbZOqxbFos53D6c+uEB6mcdPYMRRgPlkrSlZHs2k4z2kmk32XVYEhuOKDY+ooHycHWZlBnpu\/WRvvz6OxMGz6yXmLxqtc\/UWDLnw2uee+452oawjZD2y8rKhDqdJXg2rPP1p+UxkTOEWl5fpsewYcPEfvyt2rRCr169EDY+TKRVl9KJzXOILg8aOD8uAy8P5M13ngp+CkeOHOGJAXA+fEIeq\/zFBjxUPs5PlFFjV1DnWjs\/jGBieElkBevfy7S78XjUn6yhsmk53mMGFaRC1ZF7bTFyplkBl94IpkaTxOrA084Y\/vFAqzJte0d+HWwokojyRfPI2C8es1IVmh60xG1+zChlCUv\/CMwOOIRFaamIi+EIXggL8yXbhbNKZOrg+zzlg8SETKQmroF\/aBBoewAT5zFkNFzIqj47LRHvdO6DWIOxlUkk8eCMUZMDkBSXBt9JT5qoMrWyubbOKg3h56BIpjrvCHy6tB1ejV6KxKUkedHyKB+XdGRy\/2vFaWnWwNGvu0lZmER9ymM5S2t1bYx3Ylo+y\/krvi60J8XRxDgy8OJnUtfO\/QcmGJbUaTFRYtehbBSx++Mj4EQjrBKaL+8iOLMrBlPDTqMObnRAD4UUt73XFyP31dep3SwiC3jF28M3Em8960mNGViY+Abee2UOrRpZIAw4OYZvOG2LPcrdQIMbv6lj3nqt1LxrNo3Tpc9QqimXLxA9TNqqM3zpA0qhufcRA2nNqMZp37fGm5Qh\/B0RM3wxEl\/OiqdVBrNoRw1yTrR5Srg7EkhbsDOrkFSzLla\/Exe\/lxAbdgVxSUmYk8maKE7vg7n\/iDQMjhQv9de8fb45lnEwn2LT+Ok864ClSl291sS2Tf8orIi1x9y4JCyKEayaInsgcvFbyh4hNuthB+cXF2L3oRikU1\/A1XTyCYBvQRrSaTWUaCaGDW2UmcTa+pW6tUVr702ppXkeg1GzzdNafYaC+haFgbWkB0UnUL\/35ohn5r+BQ1FzaGVMgjLQob40drH6jp0x7YNEtKNlqvG0TDUlkfotg\/PwCcPsv04z6ffVsLv52oQYoSJq16OUiYmJ6Nixo1g+d\/XKVeha6HDu3DmaI9yDP\/7xj1jznzX4KOEjofZja33BnIlZM4M+dfIUDmUdwtNjnhbW8szQeTqA1fhfp3+Nn87\/JFT2vG6emTuvtef0HIefeWChThUwPf7H0wepm1Px2l9eE0Z\/BQUFwo+t8Z07OItd\/vgkv9+P+z06d+pcj5o2XlS9nnaOJv15ffbYqSwtJqMq6md1JHlZ2HC6krYTLtZXwpEGVRaCySBPT6N02q\/aUqComh6l1BvzIEz5cCzX98DKGTQXCiwmS2Bvk87YcvyavrSd5rK3sc8xCLMjaJWBIcKBZeGIIY3ywpREg4VxzZTmPg3B0ZyGrefa6nq778RW3tqwSn0xaOtu6OjdCv6lDbRyX1vZrCSz6K2ntkdNy2rbKxV7oVP5HOtePosZ3XFP3gOdhxx2Yg90S9nZ\/E709I2Jj8QRbRwVFmiJhurXkPbZOFhSPS9Sg6E+xtHSXu+11EMpAw0AKG1tziZehsS32xbrkofNctZSX9O0lYRdse198nkvfWoHPIPE+\/9b6o9Nad6dT2rf26DSMRPmf+xuVpKFPS2p4\/HDa6+9hoE+AwmcSrHZDTNqZuzM1DP2ZQh1+++f+T1aONBYj+b\/mTHzPvsjnhiBkcEjcSSHrIdpOuDRRx8V2+ayEaDYKY+zYpMBGjwIxk8Mn6\/89+zEZ9G9R3ckrUsSAwPe\/MepCekCDcMZkV6U9Jf5YaZaX2dHnakF7aGRjB01PGcb36ddLYycmi41XCO5GjeFBzYhedcepNBGOk4BcxvI7JmsjjQMx5GWmI4rpdGYONQN575OwaKUQlJORIppihqZW\/FoCI5WSJl417Wut\/tOTDK18WCnawNnG+\/GUtLaymYpjTU\/ZuS2sudBpo2mZ43sL+DPh53YqgnzSBsDXhpst6G\/urqGtM\/GwZLqaavB1FKP+pTBJl4GoG63LdYlD5vvpJb6mqalwaCzqfbWNJyeaCBVWzuqkeYu9GgQw1eZPNdHkbHplw6nqbxZiS9Sv4DfYD+4dnEVBnksqfNWt7yZTvt27cVyPF4uFxgQiMPZh3Hl6hVBg9fTO7V2Etb9vD\/+yZMn0bdPX1wtvWqU6FXmLZQSxPjFs4Ghc955p\/Lw9ddfo9fDvYQdAe+0ZywjDRK05RYB8scmAucPJhGzJ6ZMqtA3X\/KzGbe2QM\/xcQjPj0ViCqkODYtZXUgtNvev2p22aqNy58Ibs653rpSSskRAIiARaDgCDVLpr05cLXa3YybOc+gODg7IPpyNBz0eRNNmTcX+9yyJs+V9cx0xckcnYYzn5emFLVu3ID4+HkmfJAlJniVxlv45Lhve8Rw87y3PTP3adZqXYYZOf\/ws5vNZwmfi7OjCkjtL+OqVd+Lj+BnfZKBnz55wppHbsWPHxGl648LGobPLL6PSVwr8a\/sllT+t3dZZUhE2sCqVpGorJV2xtWmKBpJthGSNX9dGKJQkIRGQCEgEGg2BBkn4au4sMTPz5Z3tnFo5Yd+BfYLJqhbzzPzLy8vR5GYTcYBORVWFmJPn9fOswudT83j+nZl9yZUSwbSZYRcXFQvm3vH+jmJzH9VQjxk8W\/czc1elfM6f79moT13+d+rUKfAhOmKpH00nsONpAJFGLby81gEBng+sQ7R6RGFGX4uGtR7UGjNq49e1MUsnaUkEJAISgdtF4LYYvpo5r5Pv16+fmG\/nc+lZwmZm2+SGcjRt2fUysbc+G7SwBT0v22vdurXYIIcHBGxNzxqClo4thTFgdnY2Cs8V4pnxz5B1L0n5LNCzlK\/8iKtg3uQnHIWLeX1i+ny6XucHOosd+HKP5uKxxx8T8XlgwP+kkwhIBCQCEgGJwG8RgQYxfGEwR8yTd8fr2asnjh47KnbN43l4dsyYmamrTkjXVbdQ+FOhYOhsvFdwugA\/Ff4kGP\/10uvweNBDqObP\/ngWbt3c0KVLF\/C9YOyKkK6SU64q71aZPvkKjQMZ8vGGOzzwGDZ8mLKJD8X5pY32TAsvnyQCEgGJgERAIvDzItAghs\/GcLwkjpfinTlzBn7+fkK6p2XwijSuqQNL1cxs+dja7777Dp999pkw1uN5\/z9F\/0nEZHpiZz6KW1FRIdT\/dCvm83lwISR7DU3jLTN9DcMX\/qofXZnmls1bxLa6NukYCcqbhiFAe3rzMi06gczaEsGG0ZWpfh0I8LKmUuicbVv2\/zrqYq2UvOxND0eqY4M6TWtkpb9E4GdEoEFtl5fJsTTPRnhrPl6D48ePE38mDsv79mmk6Sa36HAbYuZiPT2l8Rvqh8OHD+PE8RN45plnhCSekZEhGHLWoSwxb+\/u4Y5jR46Bd8UbNGgQyvW0pxLRFQMHGlEY1fLM6Jm5k1Pn5lmToHX8zFqIJ0c+KU7TY6b\/m3Y3sjD9qT9j4LufYZp340zOl+bvwFuz4uh4VRVZJwRHv44\/jvK20DGWYt0MOvUvT4kbsngN3NZOwtJMHzoGuDfi6Pjc8MWfIsKkbHpsmT8ai85ORcryCcpSMH0WZtIJbYhciheRiKj4y3XaI6A0ZzVCaDebqXTc6ck5C5DmRTTfY5ql2L3un1iSQEf\/iqLRscHhL+OlCD8K02NT7OhayqjWXXO1UcbCA8lY+FY8skVmdM562EuYNW24qJulMi7yP4TZhm0JPcIXY3mEdsdHTZ6\/0G3BlrdoX\/FDeOPTZAxqnGbV6DW5Ru\/+6T+txrT4\/6UTAnmjltpcJfJ3fIZjXUYhqDstyys9hj9OnAXXaDrfflT32hLLcInAXYlAgxg+S\/ebNm3C8BHDEUjbZjZr2kyswb\/P7j7wMjw+8Y4Pz7FvZg\/75vZiYxceILRu05rOf4\/GnDlzMHbMWAHIY489Jg7LuVJ8BaOfHo2BAwZi7969+M9\/\/iPsAnjDHHWDHWsIqhoAHgyo9yIuDQp4457M\/Zlif32W+KVjBLQH694GIvocvEbbePJZAiHR\/42hna7g0\/cWIXUpMePW1cfs1sjByQvhkwLRp6MdvrushiqbZSq\/qh9v2BOtbCvsUm6y1SfvYeZAkSvszXczU9Nav5aTFukKB9MJdLz\/24GVkViQREezeAUjemR35G7+iHaaW4Ds0oVIpKN9L9sso\/V8LJWxsmATwmPiKZEXps4eidKMNbRDYhyOl7egvAYZiWnL6PDQCERG9sau+ARcMgXIGP8Xu6E2sIj2fXahgcjdyuy12JSW1e0Ap9KcjzE9LhFhi59Ukjt6Y26kF22pughZQxu6AZW2JPJeIvDzI9Aghh8QEID27dsL6Zm3s1WXy7EEzdI\/G+zx0jqeq2fVPf+1bNlSrMfnE+88vTzh2MpRHKbDafTX9Hj0sUfh6elJ1G7iYc+HMWbsGHEynr2Dsh++CTQa6V6o9FmwN\/fjBOxPfy2btsTUqVPFSoKqW1XiOF8O\/s255t5YsX17o1W7OHsnMXs6KTByMaIMW6vOe781wun89t17cvGyn4vlvFoOwvhQPu9dj9O0ihIXusC5hel71l\/MQvxfZ4H2\/FEc7dFkbKzMpcnR6QvKDf3WrRs3RG\/RGh15f\/aHukBXmYtEYvbEsfDRe4ZT0IJ84RQ+Dkkp21AQ5QVe6WmpjAZqli9Wynhow0cifvSqRRjF5y8EPQqEUl57D6OYGL6xjpoyunkPRw\/vSpTT9p+fWM7tF\/PNp9P0aHNpLBxzd2kdbhcQHQkr7LSHXnUPngKP+Fn4YFMOlk\/wvN0sZHqJwM+OgLF\/qU\/OvK3uk0FPClW6uRrdnI6QuIkZczxmtm3plKhhQ4eJaL\/z+p2JOp7DWf3fqlUrcRoeq+pro2+en\/mzSoOvPJgw0QCYR67xXImsTSvwDp0oRiyBnAtJsq9gOqur9blY+PyryG7vh7kLX0Z3HQUXZ2Hhq+8gu91TeD9uFNLnz8L2DsPQ7+oXSExjCqS+JVXxLKEqpjMrdq\/EK0v2w5W2CM\/MJM7mEYJVH0ShDanJFy+gAzCUTOn48qmYM3MC6IRGcpXI3fJvLFqehDxVJRwyAy9OD4Izvc3S\/N3459IVSMtWEruQ1Pri7EgM4sQ3cvH6hPnw\/vtyhAq1ZikOJP8L78WnGusXHDkTkaH9xS5rhRlUvr8fxpCxXUniTRXqbifaA\/+lmFl0iA4ru90Q4BuMof5duGCKc2wv9pfOpP0ZeENTUWQ1zHhVpXUdGWsS5810hAcNAtm1c1JSZCcqzN4nJAy67UlIN5xNICI5dkYvujnVth3aiTMAuuLBOmyGZkd7b7Pr49UTOXzToRMxfDv08HKBi\/9jml0N21B5qFyF+fip1HoZmYRVZ7GMlSjqNwPh7ZrBV3vYEr9Hg5bZYhlFJso54daU0YUZq+ldfYvHgrtib5LyPl18wjF3lh\/2Lqa95MWcC0+3vImXRylY6wsyEP\/BKqRy22Pn5ILgSa\/gj6E8HVOKTbW0XwII63mqwScavQ2qfKUce9Av0B27U5QpEhefEMS+Oh2ebZTupi757mk1AK2PJCGNiuZLR\/PO6ltovV1z2fUFWEfapYQ0w37nLr40TRSN4d0tzTEoddvzwGgMKNlI+6Qr9fei8ypiZofS95eM0VEJTBXro0fjh6lLEccMnva\/DwsA4hI+Rf4z8+jkTJpuWhiN5fm9sHjpy7ByrpSgI38kAncDAg1i+GyEx+fN1+YEszZI3mLunSVucrwrHjt17l080I\/xgJw60lfTiatWwlcDtH6UN2sTtOVQo1m7Zq1+EbMSaVtZ7rCCeyEv9Z9IInX1ocvKPGrYpN6YvigVr77ng+SYvlj96izRQU19UTlkpvRsHrLT6Y8O3Zj9xoso2rmKDu5YgONCVdwf5\/P3o7AkD4XcZ\/p4oEDnBqczyQiJYpWvB8JnT8L9RXuwKCEBk\/ddRmIyDQZyP0PUoiQ6eyYMsUE9cX7v50hIoYNObrTGtj+2x1vTFyCT8ouMnY42xd\/jn\/EpmDP5PFZsjoM7ycTHSwrhKtSaldi9JIJODysx1u\/I5\/9ESnwMvi18Q6iXzx9WypdEh0YEhEeiB44hng4eiZveHD22xcC1\/yjE9NeiRx3pIsqfvHyH9rHC7LXxqZZj38biIW1pi18dFi9cCjdDr\/ng2MVYOs4DnjRQWXfIjOETax63eCEldqUh2ItY2KlCmds3JV3jSef+BJYufAidaS8At7cXo39bOjSG8o16z3BKjJriYgaS+PRBl7Fi2187K2VUo1u+WiojbeE5KAjuQnNfitysw9ibugq88aDXiL7KgMNSGS1nYOJ7\/vAe0ZZS6LD34KnRaH9uIxJJ+o6aSHUj5hcZ3RP7P0qg6ZZodPXaiNAO2Xh+8hxi2R4Ii45Fz2bF2JEcT4fizEL7XimIIP5WW\/vV52wVB+gEjPAxaibUcqTScdLBkXPhY\/89FtCAOXrcVWqDMXDXH6hTvpn03dAcC7w8TqOV00+227VdAZY8O1kc\/esbRkzeoxSfxyUgLiod11dsxCgLnJjrlplOuz7y9BJNM5bvSaJ3Ho9XWnVF4pSBiAzeRQOBbHTwDcHQ7qziYWcH76F0Ol1aCtJySskOBijKz0NJnoPB9kOJJX8lAncrAg1i+MzIWXUvHDNxlbFqrxyohomIys+tJoaT7jhQtaHjdOwM8W3SV2Iqv1r66r161dBT6YpEHF4XV5mDj4jZs\/TyCUnrDNRwP390mT8SixI\/Qs749+AZ9FfMzhhPp9YtQGi2Ex2nyertZZggjM5oPwLhvLB4dZyyD\/2gPnC8QgZgKSuQFbGcaCqnXwXPVee79UieOZpSedCBMssNB8r4oX+35pg4JwWbsiLw5MWTgmpvvwAMH+QODPJDt66rcZI2P9Lrr0JMN7d8GP60csLZzg\/eXd2wPpe2NxapND\/FmVhBzJ7r9zHVj+Xq4X4D0W4mGdWlrELWFFIv2yupQt5Yi6hByl7TD5XnY1YSS76AqyIwG4jSWep0VCodHkiKirn4a5CrJjPrtzrn7vBWSMO7vyJ5cuw27t4GiVvFUUvDDq7e6kjDFf3rrE12hKcaubtKX0uX7i8eQOzEOcqRtLGGbX+tlNEspdljLWW8uA9RZOyourbtWhlu61BGNZHmqr6r4LlraSqFAfXBpd3hxAR9sWzVPHSnBhzsUY7RZLR4uURP2peLaO\/igZC5H5C2R+kGHqPwkSTZlosz5tWuwXr7dStT3k1fT8MLpFyry6G2aT8k0hGt4XGp2HzoBUxpV3u+ipmCD5Z+HAdPbpilBzCD62qlXRfu\/lQw+4DYtYgZrpTF73FPzCDDzqUrtiOQ2re5q5HHKDIQDp2IlL0HaWplGsbQMzP8weOmIEgUQqHg3KsfDTJT8OO5YsDbFROWb8MEc+LyWSJwlyKgftX1L57K3LUpVWarMlXzOPQsXUk3LwAAD9VJREFUJGytv3p\/00BITcuPHMbO3M+wGkAJtPCr0tQGWfLThpvd688cEfPTyFyK8eF0VNy1a2SHQEpMYupk7YUyoaSwQ9C8fyAnlKSLQpKUfWfjjdBqC95yVkP7jkT1kck6+AQHkwp7N67Q9rLtxfGZHgjoq8510\/I2tvQidhMTEU4dyzVcq84UX+3Lw7Sxg8k\/DSlx0+mPmKtXAIJ+Pwaj\/DyJaV\/EYC9KnZ2IiSNZsvNCyFNjMPJJf7jwm1aOFuAMSHo7JtT4YROHaiRxOlI0PAwJdDTed3mlxDK4MB7w7aPt0EXyGmZ\/+ZsWC2bvM3UxqT\/rzIEVYnfJb3HOJvyRju\/lVxy+cK3hSNo7VDjn4di8eTipovPx8Vukcl8ahXU9N5IFOXO4hjjlXQX0Vd+VIzp1IDot3dHJ8JVrdXI69yCayvHCjq0fY+HHPyD\/eCbyRNuuzru29ns6+xBF9kAnk+P8DOUYoLZpaoaPB1CsVOw9eBpR02rPV8yeuzwMNxUKx64223VO\/ilR6DT6JrJXteRPlb7Va+I94mihmFoyN1OtkQd9Be0Yr+v2YnCvpyO12ZXTKWkmE1O6FuIY5uNneGhdt0Et05FOInA3INAwhs\/MUyudqwxZZdBqzdhf9eN79VmbVo2rZeIqc1bjcxxzP22Yeq+9au8tpVXztXKtNEgvbLk9yb+r2CKYTHjg2Ja4fkULPKB2RsWXcZ4EZXYltNyQ+0yTbqBVa9GBiAj8U3HDeGvpRjEVojPQJ4WgHfU55fTPnk7FY\/8Wbh0BZ28kbl6LA2nbsW1nBtIy0xCfTX9kdPZpYgQi3tsMv6xdSEvbjf2705FCIndKwj8xe9XHCOIOzeiUnOzNWoCdoWd0pJUWRqflFEZP05uS00fJIwDRv1Jmn7tpIVlgp1EdPDB7xWIEkY3CnXClFwtwrkSH7u7OylHJju54dsp4mmNPwNGj5+jgevc7kW0NmqW56tQRjwt90W9IJELbncIisucwcXVpv5qmYpLW7IHtMuucr0laZ5vtWrUg8Q0bj0fa2SvfKhkMO9IfWniIAa1mrGtCuf4Pdaxs\/QnLFBKBO46Aynrrl5HKTFVGyqn5np02TA3X+pnfmz+b01DD1atKU2Rm+FHzboifNo3m3tGjD3X95Fx6IzQ0FBMmTKC\/UHhcy8H2PUdRIphgsZi3zySZOzjEl8T\/FPxp4Q6j7bh9C0qfugX5RrqVyNzGTKUDWls9o54j98SQMaEIpfw43zFeLXBg+x4UkMYgf8sShE5eiXZBExAT9x62bduI2b5sYLYNWTk7MJO0Dd\/YPY5pL8\/D8uRtSJxLc440w3jmJ5ZUqp1jxwfIhJCMkjbsq\/akku9JIW0G1adrJ3VEowm2cesx5nW8sXgSpfz1ufxN8wWzdyIjt8Rty+8YsydxHlv\/OhlR0\/+KHM3ruHiGGD25Dp3a\/mzgnT6wS+QVuYzm+t+bh5enheLRzs1N8q+t\/bp5DaD4eTh+RlMZMXmUJzREKrGL+9PEFElvLzfUJV81nXrVF9hu1w5kCMyuQ99R1d9qqD8uH9iOA+ZqC5VobVfDIFdrpS+SFBfiAt14eajz+rURkuESgbsHgYYxfJXpqkyY68P3\/Kd1arg5Q1bjqv7qs5rWnL5KR43H4do4ajr1yvG0Tk2n9avtXljk0rx8Gh3runAdDuTkYMvKWESTBJR92R4diB9mrX4dPM3vNTUWL0fNQ2yAEv\/93Sznqy4d02csQ0ZOFpKXvEgbuBA7DZls5Wx5UqlPZwadiajxsdhyIAdZO9ZhMq11T88+CveHXGhp4w2yFUjDrNiVRDMHB3asR3I6qxj6oYcbnU9AhgQJ0TFI3p1FRmG7kfz5dlGQdu3MGLjzAEzxoaEA1W\/GkmRk5SrloyXVNA0RVq8z6kluw841H2DOO2tMGJnIuBF\/DH2wdYo3chBL+0K8vC7HehzzkOIMzF3KleZh0SV6R0uwkP6WLFmI+QtXIlfLy0zSliKZ5vhHhM63EcckAT3o8PikALrm0X4US7Cb3l9G8hJE0fw2z7mP8LJkUW5OQ3m+lrNO7IGxLof01w1wDo6KfcaubduRm5+PjE3LMI7sRNjt\/+6shqL19qszrHq4XFYTpMToSKyjNnhgy0pMX8D1C8BIql9d8lWU6dVF0NH+HbbatXvgONrVAEiJicCS5N3IydmNZWRPkpieDb2Lu2bKqpqmeR4covpxO9N1vF8ZEK94j76lXOMgvvRygTDQ60w77nG7r38b4Jykkwj8Mgg0TD+lMmAus3qvXlU\/8\/pwuOq0jJ791Gc13JyWytzN42nTqmnUK4ep9+pV9eNrrc4Ow2NW4HrzN7E0NQExLJiTc\/IKwdtvRsCxYBNZ8GeTBjiclrp5irDhM9\/E7rRopC5YiKCNbwo\/keYCWcpHK52pR0A03jJusKJ0usaIdNOmfxRWxNpjblwSFsXQ6EA4D0QufgvCFsvvJcSGXUFcUhLmZLI0To6s8uf+IxIujjq888ZUvDInAfELZilh1G0Fz16GULZUptkEVjooTodRbySifNE8Mk6Kxyzuk8l5BERifswog9U7l08YFYgw5ceSH3WWhTTyKXSAsPfSxG602\/bK3KptepVivvZCaa1DAyOZ0tOKLQOBSOOsVGExbwwkJjxuZvWT+V15GQ20So7jat2zg4vfTCyMBGJo4Lgg2gg67bw3W1naaZ6J1WeFPZVWqjsQWH4vmhcOOwdFKrWnPTLcA6cgZPtRpKQsRZTSNBEcHo7z6xOR+e0RlEa4GXN2stJ+dR7egtEmpXyD\/\/IOMpm6cnK5hgS1DdIqgTfema0sW6tDvmIsct2YPeDY33a7hicWJr6B916ZQ6sMFoiVA5zaN\/wNvGrYH0KlRkp+4WrkQb7CjwYxPDS2I81eMKn4kni67LQzGbR2F0akh7dso1AP9PHgKZ9SNKQNUELpJAK\/DAK0NK7ejpbV3aJlecqfes9X9U8N46u5nxpfDVOvlRp6ahxrfmq4elVpqFdr6Qzh9a1wRUnRrQsXLtwqKimrR9KSW2unB94KnL72VgmlKikqulVSVlGP9GW3ijjPopJbFlOVlSjhFstUQemKxF9dSsz14\/j1K189qmKMWo1JXcplTFaPm73vjr0V8G5mPVI0PGrZsbW3AgPfvXWhISTo\/XGbukDvt26u4tbaSYG3Qv51qG7R6xiL2yW\/+5pNs\/pd2Wq\/2WujCYNJtzKLlAyz\/2c6PUffyqYXrLQry\/Wznq+tgtferpnuBW7LFj8aW7Qth5WVld2qUGmVHbo1PTDw1iTNO7itNmA5S+krEbhjCDRIwm\/ahJbksdSsOu09+5k\/m\/tpw9V7wyo\/lWSdaajptXnUhZYxo9pv7OhQeOcG2HAJGey6IonxoTL1czq0cTZTw2sJiHPlrRWK1nvXIz+uX31Lpy1Kfe4FGnlfYM06RwwcGghvFxt1rA9hiltZsAWvfVGC6H\/1qmfKhkQvxSevJpCCZzFUu\/h6UaH350x\/dXGl+RnYevAYMgqN+\/PUJVmd4thql3Vpv55jp8MrIRorNtDuc7x4X7gysYrFVruyla\/1gtferplu3VC1nos2REf7NKguP3UtTcbQklmjYepttgGVsLxKBH4mBBrE8H+msv3qsxEqwl99LRqzAna0TS2pzsmQKilhKeDp26gM3841CNu3BzVmgW3QckQEGUVG2IjRWEF5aasQn0RTJuQ8VJ10YxG3QadO7ZdsXWJiA2id\/WvIGJOMVoYdH8yXwdnI5tcRRIchzaVdBX1mrzDsj8HF\/vnawK8DJFnKux2BJqw7uNsLKcsnEZAI3N0I8PHIOpKu710Jgo4ALtaT5qwx9Qd39zuVpbv3EJAM\/957p7JGEgGJgERAIiARqIFAw5bl1SAjPSQCEgGJgERAIiARuJsRkAz\/bn47smwSAYmAREAiIBFoJAQkw28kICUZiYBEQCIgEZAI3M0ISIZ\/N78dWTaJgERAIiARkAg0EgL3rlFtIwHEZM5lfIqdNwZi4pCuClX9OXy1eTuOXqBd6JxcEfhUEDxamS7+L0inIztzikxLYdcTf5gyBHT8Tg136qtE7Go6DOG+rjXCpIdEQCIgEZAISARuFwHJ8G0geLUgG\/uzcnCioAhOPdWIFfh240YcreyJ0eMfxrmvN2H7up2YMD2A1iBrHe23atcNo58ZjJY3K3CTg+7TWWT2aqqKxjvSSyUprxIBiYBEQCIgERAISIZvqyFUVaF5u27odqUIP6nxKs4imwT3QeOHoBNtT9dpxFB8t2onfqIzTFqZiO68wXordCRPU9m\/Cqe+TcOWzJOCYoee\/hg1pBeaNrVDZc6XWHuiTJzE59DBE8FjfNHeNLFaCnmVCEgEJAISAYlAvRCQDN8GXK26esOXtPjnKo+gwOQYewc63taQsJkzXOksrdMXr6F7Sy3HJ2grc\/FF6mWxGUnljUp0G\/wEDR52EbO\/hsDxEehy30\/YvG4Ltt3fGd6CXAV6PjEBnq2uYtdnqfg8zRnTn\/g5tom1AYIMkghIBCQCEoF7AgHJ8OvwGsstqNqrvZqiOaF4o9pDQ9ERnVy7ojmqxClyrXVNUfQD6wrskH\/oG5yhOx5HFB47A+\/WpBHoNhT9XHlioBX8h3bDye2ncRW9zKYKKFg6iYBEQCIgEZAI1BMByfDrCRjxbnJlMA4CKi7iNPHqAc5a6Z7j8Bx+B\/Tx9oJ2X\/FTHNS2M1ycnVFFUwZtffrihp0jymmawK5ptf6+qbi\/ocz9cxrpJAISAYmAREAicBsIyGV59QVP5wx3GiZ9nZEreP+57w8R+3dBB1OLPQPVKihn5VVn0tq5NVB0Be0e9IK3dw9UnjqI49ftYc9z+Cf24Ugxn29+Fd99e4IGBi58Srt0EgGJgERAIiARuG0EpIRfBwir5W6O3BKPPj0YZz7\/EgknvqRnO3gHPYP2ZnSaNqdJfofmZgZ7QBuvJzDoxxRsXL1CSeFAlvz9O6HqG34swq5PVmEX39q5ICisd430HCSdREAiIBGQCEgE6ouAPDynvogZ41dBr69AUzovW6uyNwbXclNVoUdFVVPodOapK4guLPjXQlAGSwQkAhIBiYBEwAYCkuHbAEcGSQQkAhIBiYBE4F5BQM7h3ytvUtZDIiARkAhIBCQCNhCQDN8GODJIIiARkAhIBCQC9woCkuHfK29S1kMiIBGQCEgEJAI2EJAM3wY4MkgiIBGQCEgEJAL3CgKS4d8rb1LWQyIgEZAISAQkAjYQkAzfBjgySCIgEZAISAQkAvcKApLh3ytvUtZDIiARkAhIBCQCNhCQDN8GODJIIiARkAhIBCQC9woCkuHfK29S1kMiIBGQCEgEJAI2EJAM3wY4MkgiIBGQCEgEJAL3CgKS4d8rb1LWQyIgEZAISAQkAjYQ+H+IjOImOICzNAAAAABJRU5ErkJggg==\" alt=\"\" width=\"508\" height=\"85\" \/><br \/>\nThis was obviously a trick question.\u00a0 Presumably some programmer expected this expression to produce an array like <code>[1, 2, 3]<\/code> and it doesn\u2019t. Why not? What does it actually produce?\u00a0 I didn\u2019t cheat by immediately typing it into a browser but I did quickly look up something in my copy of the <a title=\"http:\/\/www.ecma-international.org\/publications\/standards\/Ecma-262.htm\" href=\"http:\/\/www.ecma-international.org\/publications\/standards\/Ecma-262.htm\" target=\"_blank\">ECMAScript 5 Specification<\/a>. From the spec. it appeared clear that the answer would be:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">&#x5B;1, NaN, NaN]<\/pre>\n<\/div>\n<p>I then typed the expression into a browser and that was exactly what I got.\u00a0 Before I explain why, you may want to stop here and see if you can figure it out.<\/p>\n<p>OK, here is the explanation. <code>parseInt<\/code> is\u00a0 the built-in function that attempts to parse a string as a numeric literal and return the resulting number value. \u00a0So, a function call like:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">var n = parseInt(&quot;123&quot;);<\/pre>\n<\/div>\n<p>should assign the numeric value <code>123<\/code> to the local variable <code>n<\/code>.<\/p>\n<p>You might also know, that if the string can\u2019t be parsed as numeric literal, <code>parseInt<\/code> will return as the result the value <code>NaN<\/code>.\u00a0 <code>NaN<\/code>, which is an abbreviation for \u201cNot a Number\u201d, is a value that generally indicates that some sort of numeric computation error has occurred.\u00a0 So, a statement like:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">var x = parseInt(&quot;xyz&quot;);<\/pre>\n<\/div>\n<p>assigns <code>NaN<\/code> to <code>x<\/code>.<\/p>\n<p><code>map<\/code> is a built-in Array method that is in ECMAScript 5 and which has been available in many browsers for a while. <code>map<\/code> takes a function object as its argument.\u00a0 It iterates, over each element of an array and calls the argument function once for each element, passing the element value as an argument. It accumulates the results of these function calls into a new array.\u00a0 Consider this example,<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">&#x5B;1,2,3].map(function (value) {return value+1})<\/pre>\n<\/div>\n<p>it will return a new array <code>[2,3,4]<\/code>. It is probably most common to see a function expression such as this passed to <code>map<\/code> but it is perfectly valid to pass an already existing function object such <code>parseInt<\/code>.<\/p>\n<p>So, knowing the basics of <code>parseInt<\/code> and <code>map<\/code> it is pretty clear that the original expression was intended to take an array of numeric strings and to return a corresponding array containing the numeric value of each string.\u00a0 Why doesn\u2019t it work?\u00a0 To find the answer we will need to look more closely at the definition of both <code>parseInt<\/code> and <code>map<\/code>.<\/p>\n<p>Looking at the <a title=\"http:\/\/es5.github.com\/#x15.1.2.2\" href=\"http:\/\/es5.github.com\/#x15.1.2.2\" target=\"_blank\">specification of parseInt<\/a> you should notice that it is defined as accepting two arguments.\u00a0 The first argument is the string to be parsed and the second specifics the radix of the number to be parsed.\u00a0 So, <code>parseInt(\u201cffff\u201d,16)<\/code> will return <code>65535<\/code> while <code>parseInt(\"ffff\"\u201d,8)<\/code> will return <code>NaN<\/code> because <code>\"ffff\"<\/code> doesn\u2019t parse as an octal number.\u00a0 If the second argument is missing or <code>0<\/code> it defaults to <code>10<\/code> so <code>parseInt(\"12\",10)<\/code>,\u00a0 <code>parseInt(\"12\")<\/code>, and <code>parseInt(\"12\",0)<\/code> all produce the number 12.<\/p>\n<p>Now look carefully at the <a title=\"http:\/\/es5.github.com\/#x15.4.4.19\" href=\"http:\/\/es5.github.com\/#x15.4.4.19\" target=\"_blank\">specification of the map method<\/a>.\u00a0 It refers to the function that is passed as the first argument to <code>map<\/code> as the <em>callbackfn<\/em>.\u00a0 The specification says, \u201cthe <em>callbackfn<\/em> is called with <em>three<\/em> arguments: the value of the element, the index of the element, and the object that is being traversed.\u201d Read that carefully.\u00a0 It means that rather than three calls to <code>parseInt<\/code> that look like:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">parseInt(&quot;1&quot;)\r\nparseInt(&quot;2&quot;)\r\nparseInt(&quot;3&quot;)\r\n<\/pre>\n<\/div>\n<p>we are actually going to have three calls that look like:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">parseInt(&quot;1&quot;, 0, theArray)\r\nparseInt(&quot;2&quot;, 1, theArray)\r\nparseInt(&quot;3&quot;, 2, theArray)\r\n<\/pre>\n<\/div>\n<p>where <code>theArray<\/code> is the original array <code>[\"1\",\"2\",\"3\"]<\/code>.<\/p>\n<p>JavaScript functions generally ignore extra arguments and <code>parseInt<\/code> only expects two arguments so we don\u2019t have to worry about the effect of the <code>theArray<\/code> argument in these calls.\u00a0 But what about the second argument?\u00a0 In the first call the second argument is <code>0<\/code> which we know defaults the radix to 10 so <code>parseInt(\"1\",0)<\/code> will return <code>1<\/code>.\u00a0 The second call passes <code>1<\/code> as the radix argument.\u00a0 The specification is quite clear what happens in that case.\u00a0 If the radix is non-zero and less than 2 the function returns <code>NaN<\/code> without even looking at the string.<\/p>\n<p>The third call passes <code>2<\/code> as the radix argument.\u00a0 This means that the string to convert is supposed to be a binary number consisting only of the digit characters <code>\"0\"<\/code> and <code>\"1\"<\/code>. The <code>parseInt<\/code> specification (step 11) says it only tries to parse the substring to the left of the first character that is not a valid digit of the requested radix.\u00a0 The first character of the string is <code>\"3\"<\/code> which is not a valid base 2 digit so the substring to parse is the empty string. Step 12 says that if the substring to parse is the empty string, the function returns <code>NaN<\/code>. So, the result of the three calls will be <code>1<\/code>, <code>NaN<\/code>, and <code>NaN<\/code>.<\/p>\n<p>The programmer of the original expression made at least one of two possible mistakes that caused this bug. The first possibility is that they either forgot or never knew that <code>parseInt<\/code> accepts an optional second argument.\u00a0 The second possibility is that they forgot or never knew that <code>map<\/code> calls its <em>callbackfn<\/em> with three arguments. Most likely, it was a combination of both mistakes. The most common usage of <code>parseInt<\/code> passes only a single argument and most functions passed to <code>map<\/code> only use the first argument so it would be easy to forget that additional arguments are possible in both cases.<\/p>\n<p>There is a straight forward way to rewrite the original expression to avoid the problem. Use:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">&#x5B;&quot;1&quot;,&quot;2&quot;,&quot;3&quot;].map(function(value) {return parseInt(value)})<\/pre>\n<\/div>\n<p>instead of:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">&#x5B;&quot;1&quot;,&quot;2&quot;,&quot;3&quot;].map(parseInt)<\/pre>\n<\/div>\n<p>This makes it clear that the <em>callbackfn<\/em> only cares about a single argument and it explicitly calls <code>parseInt<\/code> with only one argument.\u00a0 However, as you can see it is much more verbose and arguably less elegant.<\/p>\n<p>After I tweeted about this, there was an exchange about how JavaScript might be extended to avoid this problem or to at least make the fix less verbose. \u00a0<a href=\"http:\/\/twitter.com\/#!\/angusTweets\/status\/35774944293953537\">Angus Croll (@angusTweets)<\/a> suggested the problem could be avoided simply by using the <code>Number<\/code> constructor as the <em>callbackfn<\/em> instead of <code>parseInt<\/code>. <code>Number<\/code> called in this manner will also parse a string argument as a decimal number and it only looks at one argument.<\/p>\n<p><a href=\"http:\/\/twitter.com\/#!\/__DavidFlanagan\/status\/35769732795736064\">@__DavidFlanagan<\/a> suggested that perhaps a <code>mapValues<\/code> method should be added which only passes a single argument to the <em>callbackfn<\/em>.\u00a0 However, ECMAScript 5 has seven distinct Array method that operate similarly to <code>map<\/code>, so we would really have to add seven such methods.<\/p>\n<p>I suggest the possibility of adding a method that might be defined like:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nFunction.prototype.only = function(numberOfArgs) {\r\n   var self = this; \/\/the original function\r\n   return function() {\r\n      return self.apply(this,&#x5B;].slice.call(arguments,0,numberOfArgs))\r\n   }\r\n};\r\n<\/pre>\n<p>This is a <a title=\"http:\/\/en.wikipedia.org\/wiki\/Higher_order_functions\" href=\"http:\/\/en.wikipedia.org\/wiki\/Higher_order_functions\" target=\"_blank\">higher order function<\/a> that takes a function as an argument and returns a new function that calls the original function but with an explicitly limited number of arguments.\u00a0 Using <code>only<\/code>, the original expression could have been written as:<\/p>\n<div style=\"padding-left: 30px;\">\n<pre class=\"brush: jscript; light: true; title: ; notranslate\" title=\"\">&#x5B;&quot;1&quot;,&quot;2&quot;,&quot;3&quot;].map(parseInt.only(1))<\/pre>\n<\/div>\n<p>which is only slight more verbose and arguably retains a degree of elegance.<\/p>\n<p>This led to a further discussion of <em>curry functions<\/em> (really <a title=\"http:\/\/en.wikipedia.org\/wiki\/Partial_application\" href=\"http:\/\/en.wikipedia.org\/wiki\/Partial_application\" target=\"_blank\">partial function application<\/a>) in JavaScript. Partial function application takes a function that requires a certain number of arguments and produces a new function that takes fewer arguments. My <code>only<\/code> method is an example of a function that performs partial function evaluation.\u00a0 So is the <code>Function.prototype.bind<\/code> method that was added to ES5. Does JavaScript need such additional  methods?\u00a0 For example, a <code>bindRight<\/code> method that fixes the rightmost arguments rather than the leftmost.\u00a0 Perhaps, but what does rightmost even mean when a variable number of arguments are allowed?\u00a0 Probably <code>bindStartingAt<\/code> that took an argument position would be a better match to JavaScript.<\/p>\n<p>However, all this discussion of extensions really misses the key issue with the original problem. <em>In order to use any of them, you first have to be aware of the optional argument mismatch between <\/em><code>map<\/code><em> and <\/em><code>parseInt<\/code><em>.<\/em> If you are aware of the problem there are many way to work around it.\u00a0 If you aren\u2019t aware then none of the proposed solutions help at all.\u00a0 This really seems to be mostly an API design problem and raises some fundamental questions about the appropriate use of optional arguments in JavaSript.<\/p>\n<p>Supporting optional arguments can simplify the design of an API by reducing the total number of API functions and by allowing many users to only have to think about the details of the most common use cases.\u00a0 But as we see above, this simplification can cause problems when the functions are naively combined in unexpected ways.\u00a0 What we are seeing in this example is that there are really two quite different use cases for optional arguments.<\/p>\n<p>One use case looks at optional arguments from the perspective of the caller. The other use case is from the perspective of the callee.\u00a0 In the case of <code>parseInt<\/code>, its design assumes that the caller knows that it is calling <code>parseInt<\/code> and has chosen actual argument values appropriately.\u00a0 The second argument is <em>optional from the perspective of the caller.<\/em> If it wants to use the default radix it can  ignore that argument.\u00a0 However, the actual specification of <code>parseInt<\/code> carefully defines what it (the callee) will do when called with either one or two arguments and with various argument values.<\/p>\n<p>The other use case is more from the perspective of a different kind of function caller. A caller that doesn\u2019t know what function it is actually calling and that always passes a fixed sized set of arguments. The specification of <code>map<\/code> clearly defines that it will always pass three arguments to any <em>callbackfn<\/em> it is provided. Because the caller doesn\u2019t actually know the identify of the callee or what actual information the callee will need, <code>map<\/code> passes all available information as arguments.\u00a0 The assumption is that an actual callee will ignore any arguments that it doesn\u2019t need. \u00a0In this use case the second and third arguments are <em>optional from the perspective of the callee.<\/em><\/p>\n<p>Both of these are valid optional argument use cases, but when we combine them we get a software \u201cimpedance mismatch\u201d.\u00a0 Callee optional arguments will seldom match with caller optional arguments. Higher order functions such as the <code>bind<\/code> or <code>only<\/code> methods can be used to fix such mismatches but are only useful if the programmer is aware that the mismatch exists. JavaScript API designers need to keep this mind and every JavaScript programmer needs to take extra care to understand what exactly will be passed to a function used as a &#8220;call back&#8221;.<\/p>\n<p><strong>Update 1<\/strong>: Correctly credit Angus Croll for map(Number) suggestion.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>My recent post on testing for negative 0 in JavaScript created a lot of interest.\u00a0 So today, I\u2019m going to talk about another bit of JavaScript obscurity that was also inspired by a Twitter thread. I recently noticed this tweet go by: This was obviously a trick question.\u00a0 Presumably some programmer expected this expression to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[32,15,60,13,34],"_links":{"self":[{"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/posts\/166"}],"collection":[{"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/comments?post=166"}],"version-history":[{"count":37,"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/posts\/166\/revisions"}],"predecessor-version":[{"id":805,"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/posts\/166\/revisions\/805"}],"wp:attachment":[{"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/media?parent=166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/categories?post=166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wirfs-brock.com\/allen\/wp-json\/wp\/v2\/tags?post=166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}