{"id":19093171,"url":"https://github.com/ufocoder/javascript.anomaly","last_synced_at":"2025-04-16T14:27:36.699Z","repository":{"id":92639547,"uuid":"49929384","full_name":"ufocoder/javascript.anomaly","owner":"ufocoder","description":"Examples of not obvious behaviors for javascript beginner programmers ","archived":false,"fork":false,"pushed_at":"2019-06-12T13:57:24.000Z","size":11,"stargazers_count":135,"open_issues_count":0,"forks_count":18,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-29T05:22:43.073Z","etag":null,"topics":["anomaly","closure","javascript","logic","math"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ufocoder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-01-19T05:43:36.000Z","updated_at":"2024-08-12T10:51:39.000Z","dependencies_parsed_at":"2023-04-01T05:50:50.525Z","dependency_job_id":null,"html_url":"https://github.com/ufocoder/javascript.anomaly","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ufocoder%2Fjavascript.anomaly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ufocoder%2Fjavascript.anomaly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ufocoder%2Fjavascript.anomaly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ufocoder%2Fjavascript.anomaly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ufocoder","download_url":"https://codeload.github.com/ufocoder/javascript.anomaly/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249250434,"owners_count":21237897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anomaly","closure","javascript","logic","math"],"created_at":"2024-11-09T03:23:32.474Z","updated_at":"2025-04-16T14:27:36.678Z","avatar_url":"https://github.com/ufocoder.png","language":null,"readme":"# Javascript Anomaly Page\n\nThis page created for javascript beginner programmers to show not obvious behaviors, let's call all of them \"anomalies\"\n\n* [Assignment Anomaly](#assignment-anomaly)\n* [Reference Anomaly](#reference-anomaly)\n* [New Anomaly](#new-anomaly)\n* [Closure Anomaly](#closure-anomaly)\n* [Context Anomay](#context-anomaly)\n* [Delete Anomaly](#delete-anomaly)\n* [Type Anomaly](#type-anomaly)\n* [Compare Anomaly](#compare-anomaly)\n* [Math Anomaly](#math-anomaly)\n* [Logic Anomaly](#logic-anomaly)\n* [Variable scope Anomaly](#variable-scope-anomaly)\n* [Function Arguments Anomaly](#function-arguments-anomaly)\n* [toString Anomaly](#tostring-anomaly)\n* [New line Anomaly](#new-line-anomaly)\n* [Variable hoisting Anomaly](#variable-hoisting-anomaly)\n\n### Assignment Anomaly\n\n```\n(function(){\n  var a = b = 3;\n})();\n\nconsole.log(typeof a);\n// output: undefined\n\nconsole.log(typeof b);\n// output: number\n\n\nvar a={},\n    b={key:'b'},\n    c={key:'c'};\n\na[b]=123;\na[c]=456;\n\nconsole.log(a[b]);\n// output: 456\n```\n\n### Reference Anomaly\n\n```\nvar a = { value: 1 };\nvar b = a;\nb.value = 2;\n\nconsole.log(a.value);\n// output: 2\n```\n\n### New Anomaly \n\n```\nvar myClass = function() {\n  this.a = 1;\n  this.b = 2;\n};\n\nvar myClass2 = function() {\n  this.a = 1;\n  this.b = 2;\n\n  return {\n    a: 2\n  };\n};\n\nvar myObject = new myClass();\nvar myObject2 = new myClass2();\n\nconsole.log(typeof myObject.b);\n// output: number\nconsole.log(typeof myObject2.b);\n// output: undefined\n```\n\n### Closure Anomaly\n```\nfor (var i = 0; i \u003c 3; i++) {\n  setTimeout(function() {\n    console.log(i);\n  }, 100);\n}\n\n// output: 3\n// output: 3\n// output: 3\n```\n\n### Context Anomaly\n\n```\nvar message = {\n  content: 'Hello world!',\n  send: function () {\n    console.log(this.content)\n  }\n};\n\nsetTimeout(message.send);\n\n// output: undefined\n```\n\n### Delete Anomaly\n\n```\nvar x = 1;\nvar output = (function(){\n  delete x;\n  return x;\n})();\n\nconsole.log(output);\n// output: 1\n```\n\n\n### Type Anomaly\n\n```\nconsole.log(typeof null);\n// output: object\n\n\nconsole.log(null instanceof Object);\n// output: false\n\nconsole.log(typeof NaN);\n// output: number\n\nconsole.log(typeof function () {});\n// output: function\n// but there's no function type http://ecma-international.org/ecma-262/5.1/#sec-8\n```\n\n\n### Compare Anomaly\n\n\n```\nconsole.log('' == '0');\n// output: false\n\nconsole.log(0 == '');\n// output: true\n\nconsole.log(0 == '0');\n// output: true\n\nconsole.log(false == 'false');\n// output: false\n\nconsole.log(false == '0');\n// output: true\n\nconsole.log(false == undefined);\n// output: false\n\nconsole.log(false == null);\n// output: false\n\nconsole.log(null == undefined);\n// output: true\n\nconsole.log(' \\t\\r\\n ' == 0);\n// output: true\n\nconsole.log(\"abc\" == new String(\"abc\"));\n// output: true\n\nconsole.log(\"abc\" === new String(\"abc\"));\n// output: false\n\nconsole.log(0.1 + 0.2 == 0.3);\n// output: false\n// sum of float values is not equals obvious float value\n\nconsole.log(NaN != NaN);\n// output: true\n\nconsole.log(NaN == NaN);\n// output: false\n\nconsole.log(NaN === NaN);\n// output: false\n\nconsole.log(!!undefined);\n// output: false\n\nconsole.log(!!NaN);\n// output: false\n\nconsole.log(!!null);\n// output: false\n\nconsole.log([1, 2, 3] == [1, 2, 3]);\n// output: false\n// How to detect array equality in JavaScript?\n\nconsole.log(new Array(3) == \",,\");\n// output: true\n\nconsole.log(new Array(3) === \",,\");\n// output: false\n\nconsole.log(\"a\" \u003e \"b\");\n// output: false\n\nconsole.log(\"abcd\" \u003c \"abcd\");\n// output: false\n\nconsole.log(\"abcd\" \u003c \"abdc\");\n// output: true\n\nconsole.log(\"123\" \u003e \"13\");\n// output: false\n```\n\n\n### Math Anomaly\n\n```\nconsole.log(\"2\" * \"3\");\n// output: 6\n\nconsole.log(\"2\" * \"3\" + \"4\");\n// output: \"64\"\n\nconsole.log(\"2\" * \"3\" + \"4\" * \"5\")\n// output: 26\n\nconsole.log(\"test \" + 1);\n// output: test 1\n\nconsole.log(\"test \" + 1 + 1);\n// output: test 11\n\nconsole.log(\"days\" * 2);\n// output: NaN\n\nconsole.log(null + null);\n// output: 0\n\nconsole.log({} + {});\n// output: [object Object][object Object]\n\nconsole.log({} + []);\n// output: [object Object]\n\nconsole.log({} + 5);\n// output: [object Object]5\n\nconsole.log([] + {});\n// output: [object Object]\n\nconsole.log([] + []);\n// output:\n// will output empty string ''\n\nconsole.log([] + 5);\n// output: 5\n\nconsole.log(++[[]][+[]]+[+[]]);\n// output: \"10\"\n```\n\n### Logic Anomaly\n\n```\nconsole.log(0 || 'a');\n// output: a\n\nconsole.log(0 || undefined);\n// output: undefined\n\nconsole.log({} \u0026\u0026 'a');\n// output: a\n\nconsole.log(0 \u0026\u0026 'a');\n// output: 0\n```\n\n### Variable scope Anomaly\n\n```\nfunction Foo(value) {\n    this.bar = value;\n}\nvar test = new Foo('test');\nconsole.log(test.bar);\n// output: test\n\nFoo('test');\nconsole.log(bar);\n// output: test\n```\n\n\n### Function Arguments Anomaly\n\n```\n(function (foo, bar) {\n    console.log(typeof arguments);\n    // output: object\n\n    arguments[0] = 999;\n    console.log(foo);\n    // output: 999\n})(1, 2);\n```\n\n\n### toString Anomaly\n\n```\ntry {\n    eval(\"2.toString()\")\n} catch (err) {\n    console.log(err.message)\n    // output: Unexpected token ILLEGAL\n}\n\nconsole.log(2..toString());\n// output: 2\n\nconsole.log(2 .toString());\n// output 2\n\nconsole.log((2).toString());\n// output: 2\n\nconsole.log([1, 2, 3].toString())\n// output: 1,2,3\n\nvar a = {b: 2, c: 3};\nconsole.log(a.toString())\n// output: [object Object]\n```\n\n### New line Anomaly\n\n```\nfunction foo() {\n  return \"Yeah\";\n}\n \nfunction bar() {\n  return \n    \"Yeah\";\n}\n\nconsole.log(foo());\n// output: Yeah\n\nconsole.log(bar());\n// output:\n```\n\n### Variable hoisting Anomaly\n\n```\nvar a = 1; \nfunction bar() { \n    if (!a) { \n        var a = 10; \n    } \n    console.log(a); \n} \nbar();\n// output: 10\n```\n\n```\nvar a = 1;\nfunction b() {\n    a = 10;\n    return;\n    function a() {}\n} \nb(); \nconsole.log(a);\n// output: 1\n```\n\nNote that `anomaly` word has only literary turnover, it's not a technical term.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fufocoder%2Fjavascript.anomaly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fufocoder%2Fjavascript.anomaly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fufocoder%2Fjavascript.anomaly/lists"}