From afab2fa0eca4aa91ec2315948685f0a6c0194ff7 Mon Sep 17 00:00:00 2001 From: adrianbienias Date: Wed, 5 Jul 2023 13:27:04 +0000 Subject: [PATCH] deploy: c1b6be4611084d299b9692e214b28b82f4bd75ee --- 100-bugow-js.html | 8 ++++---- 100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html | 8 ++++---- .../05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html | 8 ++++---- .../07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html | 8 ++++---- .../0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html | 8 ++++---- .../0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html | 8 ++++---- .../0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html | 8 ++++---- .../111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../111bba83-a18f-4245-ae3d-66e71e46db03/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html | 8 ++++---- .../1257df57-264f-4f1c-984c-89222207e885/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../1257df57-264f-4f1c-984c-89222207e885/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html | 8 ++++---- .../12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../12e5df98-c0ca-429c-a9e8-8517c1873211/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html | 8 ++++---- .../1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html | 8 ++++---- .../13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html | 8 ++++---- .../14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html | 8 ++++---- .../14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html | 8 ++++---- .../16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../16de4343-9b81-49c5-92ea-e3e6b377132f/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html | 8 ++++---- .../1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../1748706a-b38f-403a-ab65-6666bd6bede7/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html | 8 ++++---- .../17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../17c27ac8-01d9-463d-84b4-f81cee835696/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html | 8 ++++---- .../1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html | 8 ++++---- .../28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../28eab874-606d-49f2-bc6c-f8382476a776/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html | 8 ++++---- .../2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html | 8 ++++---- .../2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html | 8 ++++---- .../2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../2da281dc-b213-448d-b3d2-4b90f901b93f/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html | 8 ++++---- .../31a6b892-4183-4589-a877-6c172e38d143/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../31a6b892-4183-4589-a877-6c172e38d143/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html | 8 ++++---- .../35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html | 8 ++++---- .../39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html | 8 ++++---- .../3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html | 8 ++++---- .../3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html | 8 ++++---- .../3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html | 8 ++++---- .../3f068db0-5299-4701-866c-36414d360814/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../3f068db0-5299-4701-866c-36414d360814/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html | 8 ++++---- .../4049d287-c406-4bb7-926c-43627310b896/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../4049d287-c406-4bb7-926c-43627310b896/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html | 8 ++++---- .../4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html | 8 ++++---- .../47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../47183b47-e13d-4247-9ef5-a447a35e530c/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html | 8 ++++---- .../49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../49405a75-e352-4a37-8afd-d231628e01e1/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html | 8 ++++---- .../4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html | 8 ++++---- .../4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html | 8 ++++---- .../52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html | 8 ++++---- .../546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html | 8 ++++---- .../574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html | 8 ++++---- .../5838b978-3b1c-433d-b118-9801923593e0/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../5838b978-3b1c-433d-b118-9801923593e0/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html | 8 ++++---- .../5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html | 8 ++++---- .../5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html | 8 ++++---- .../5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html | 8 ++++---- .../5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../5e53d805-c959-40a2-9acd-f85e690d58e8/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html | 8 ++++---- .../602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../602b9a01-9e69-4966-9cc6-610bebf8466b/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html | 8 ++++---- .../62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html | 8 ++++---- .../63408939-dd63-4ec2-9eca-719a80260815/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../63408939-dd63-4ec2-9eca-719a80260815/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html | 8 ++++---- .../64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html | 8 ++++---- .../69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../69dd4421-faf2-484d-ab27-26a65940faf7/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html | 8 ++++---- .../6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html | 8 ++++---- .../6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html | 8 ++++---- .../71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html | 8 ++++---- .../74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../74f05a57-ccd6-44f8-a982-aacec55d6132/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html | 8 ++++---- .../7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../7a984008-730d-41bf-be00-1493e1c1cdc6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html | 8 ++++---- .../855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html | 8 ++++---- .../86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html | 8 ++++---- .../87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../87616015-586b-4477-ac08-cb1bc0e28e09/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html | 8 ++++---- .../880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html | 8 ++++---- .../88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../88306d48-4df5-4c3e-9452-4fee2be681fd/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html | 8 ++++---- .../8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html | 8 ++++---- .../8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../8c1883e7-6c29-41ff-938b-81d605c565ed/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html | 8 ++++---- .../9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../9040ce84-a478-468c-aca6-16b9f909e115/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html | 8 ++++---- .../90b2a251-a246-4713-adfc-adf089197961/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../90b2a251-a246-4713-adfc-adf089197961/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html | 8 ++++---- .../967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html | 8 ++++---- .../979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html | 8 ++++---- .../98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../98a75ad0-f321-4391-8167-a4dea7dfe153/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html | 8 ++++---- .../a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html | 8 ++++---- .../a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html | 8 ++++---- .../a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../a8adcbd8-2151-494e-b538-44c1503f3beb/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html | 8 ++++---- .../ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html | 8 ++++---- .../aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html | 8 ++++---- .../b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html | 8 ++++---- .../b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html | 8 ++++---- .../b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../b625f893-5173-40ab-b1ce-257b5bff5910/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html | 8 ++++---- .../b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html | 8 ++++---- .../b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../b85b88a3-7e88-4091-a7f1-62ee08894050/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html | 8 ++++---- .../b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html | 8 ++++---- .../bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html | 8 ++++---- .../bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html | 8 ++++---- .../bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html | 8 ++++---- .../be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html | 8 ++++---- .../c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../c240b7f1-fb67-434c-9965-b41432f128c6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html | 8 ++++---- .../c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html | 8 ++++---- .../c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html | 8 ++++---- .../c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../c58e01be-7092-47d4-ba65-cffd25192ba4/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html | 8 ++++---- .../c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html | 8 ++++---- .../cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html | 8 ++++---- .../cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../cdc9845a-3304-4646-b257-3238bad1e179/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html | 8 ++++---- .../cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html | 8 ++++---- .../d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html | 8 ++++---- .../dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../dd95137e-f378-4224-a3e7-5db4b217508e/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html | 8 ++++---- .../df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html | 8 ++++---- .../e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html | 8 ++++---- .../e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html | 8 ++++---- .../ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html | 8 ++++---- .../ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html | 8 ++++---- .../f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../f4493212-ffba-4a48-818a-b82a22bce47a/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html | 8 ++++---- .../f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html | 8 ++++---- .../f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html | 8 ++++---- .../f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html | 8 ++++---- .../fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html | 8 ++++---- .../fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html | 8 ++++---- .../ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html | 8 ++++---- .../bugDescription.html | 8 ++++---- .../ffc67d5d-0437-493c-b712-e1e3571caaef/links.html | 8 ++++---- .../solutionCode.html | 8 ++++---- .../solutionDescription.html | 8 ++++---- 100-bugow-js/sukces.html | 8 ++++---- 100-bugow-js/wymagane-potwierdzenie.html | 8 ++++---- 404.html | 8 ++++---- assets/js/26a6d6fe.2e29b319.js | 1 - assets/js/26a6d6fe.88a609bd.js | 1 + assets/js/{main.1ba32202.js => main.1d5c8ab5.js} | 4 ++-- ...a32202.js.LICENSE.txt => main.1d5c8ab5.js.LICENSE.txt} | 0 ...{runtime~main.68c9289d.js => runtime~main.23df0b90.js} | 2 +- docs/frontend/aplikacje-mobilne.html | 8 ++++---- docs/frontend/css/css.html | 8 ++++---- ...17-debugowanie-css-przez-narzedzia-developerskie.html" | 8 ++++---- ...357\270\217-organizacja-styli-css-i-preprocesory.html" | 8 ++++---- .../css/\342\226\266\357\270\217-wprowadzenie-w-css.html" | 8 ++++---- docs/frontend/dostepnosc.html | 8 ++++---- docs/frontend/frontend.html | 8 ++++---- docs/frontend/html/html.html | 8 ++++---- ...-i-multimedia-osadzanie-skrypty-sledzenie-edycji.html" | 8 ++++---- .../\342\226\266\357\270\217-rdzen-metadane-sekcje.html" | 8 ++++---- ...bele-formularze-elementy-interaktywne-komponenty.html" | 8 ++++---- "docs/frontend/html/\342\226\266\357\270\217-tekst.html" | 8 ++++---- .../\342\226\266\357\270\217-wprowadzenie-do-htmla.html" | 8 ++++---- .../html/\342\226\266\357\270\217-zadanie-domowe.html" | 8 ++++---- docs/frontend/javascript/javascript.html | 8 ++++---- .../\342\226\266\357\270\217-node-js-na-frontendzie.html" | 8 ++++---- .../\342\226\266\357\270\217-podstawy-javascript.html" | 8 ++++---- docs/frontend/komponenty.html | 8 ++++---- docs/frontend/pakiety/pakiety.html | 8 ++++---- docs/frontend/pakiety/webpack/webpack.html | 8 ++++---- ...weloperski-serwer-webpack-i-gorace-przeladowania.html" | 8 ++++---- ...66\357\270\217-generowanie-pliku-html-z-szablonu.html" | 8 ++++---- .../webpack/\342\226\266\357\270\217-ladowarki.html" | 8 ++++---- .../\342\226\266\357\270\217-plik-konfiguracyjny.html" | 8 ++++---- ...342\226\266\357\270\217-podstawowy-sposob-uzycia.html" | 8 ++++---- ...\266\357\270\217-podzial-plikow-konfiguracyjnych.html" | 8 ++++---- ...357\270\217-rozwiazywanie-sciezek-importu-plikow.html" | 8 ++++---- ...tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian.html" | 8 ++++---- docs/frontend/progresywne-aplikacje.html | 8 ++++---- docs/frontend/seo.html | 8 ++++---- docs/frontend/webassembly.html | 8 ++++---- docs/frontend/zarzadzanie-stanem/redux/redux.html | 8 ++++---- .../\342\226\266\357\270\217-asynchroniczne-akcje.html" | 8 ++++---- ...42\226\266\357\270\217-koncept-dzialania-redux-a.html" | 8 ++++---- .../\342\226\266\357\270\217-laczenie-reduktorow.html" | 8 ++++---- ...226\266\357\270\217-modyfikowanie-stanu-magazynu.html" | 8 ++++---- ...0\217-modyfikowanie-stanu-pojedynczych-elementow.html" | 8 ++++---- ...6\266\357\270\217-podzial-kodu-na-mniejsze-pliki.html" | 8 ++++---- ...0\217-predefiniowane-typy-akcji-i-kreatory-akcji.html" | 8 ++++---- ...270\217-przygotowanie-srodowiska-deweloperskiego.html" | 8 ++++---- .../redux/\342\226\266\357\270\217-redux-thunk.html" | 8 ++++---- ...\226\266\357\270\217-zarzadzanie-wieloma-stanami.html" | 8 ++++---- docs/frontend/zarzadzanie-stanem/zarzadzanie-stanem.html | 8 ++++---- docs/informatyka/aplikacje.html | 8 ++++---- docs/informatyka/architektura-oprogramowania.html | 8 ++++---- docs/informatyka/bezpieczenstwo.html | 8 ++++---- docs/informatyka/debugowanie.html | 8 ++++---- docs/informatyka/dns-i-domeny.html | 8 ++++---- docs/informatyka/dokumentacje.html | 8 ++++---- docs/informatyka/dzialanie-komputerow.html | 8 ++++---- docs/informatyka/formatowanie-kodu.html | 8 ++++---- docs/informatyka/haszowanie.html | 8 ++++---- docs/informatyka/hosting.html | 8 ++++---- docs/informatyka/informatyka.html | 8 ++++---- docs/informatyka/kontrola-wersji.html | 8 ++++---- docs/informatyka/licencje.html | 8 ++++---- docs/informatyka/pamiec-podreczna.html | 8 ++++---- docs/informatyka/praca-w-it.html | 8 ++++---- docs/informatyka/programowanie/algorytmy.html | 8 ++++---- docs/informatyka/programowanie/api.html | 8 ++++---- docs/informatyka/programowanie/biblioteki.html | 8 ++++---- docs/informatyka/programowanie/frameworki.html | 8 ++++---- docs/informatyka/programowanie/jezyki-programowania.html | 8 ++++---- .../programowanie/programowanie-deklaratywne.html | 8 ++++---- .../programowanie/programowanie-funkcyjne.html | 8 ++++---- .../programowanie/programowanie-imperatywne.html | 8 ++++---- .../programowanie/programowanie-obiektowe.html | 8 ++++---- docs/informatyka/programowanie/programowanie.html | 8 ++++---- .../programowanie/struktury-i-bazy-danych.html | 8 ++++---- .../programowanie/typowanie-statyczne-i-dynamiczne.html | 8 ++++---- docs/informatyka/programowanie/wzorce-projektowe.html | 8 ++++---- docs/informatyka/siec.html | 8 ++++---- docs/informatyka/systemy-operacyjne/chrome-os.html | 8 ++++---- docs/informatyka/systemy-operacyjne/free-bsd.html | 8 ++++---- docs/informatyka/systemy-operacyjne/linux.html | 8 ++++---- docs/informatyka/systemy-operacyjne/macos-i-ios.html | 8 ++++---- .../systemy-operacyjne/systemy-operacyjne.html | 8 ++++---- docs/informatyka/systemy-operacyjne/windows.html | 8 ++++---- docs/informatyka/testowanie.html | 8 ++++---- docs/informatyka/warstwy-abstrakcji.html | 8 ++++---- docs/informatyka/wydajnosc.html | 8 ++++---- docs/informatyka/zarzadzanie-projektami.html | 8 ++++---- docs/tags.html | 8 ++++---- docs/tags/a-11-y.html | 8 ++++---- docs/tags/accessibility.html | 8 ++++---- docs/tags/agile.html | 8 ++++---- docs/tags/algorytm.html | 8 ++++---- docs/tags/api.html | 8 ++++---- docs/tags/app.html | 8 ++++---- docs/tags/apple.html | 8 ++++---- docs/tags/big-o.html | 8 ++++---- docs/tags/bsd.html | 8 ++++---- docs/tags/bug.html | 8 ++++---- docs/tags/bundle.html | 8 ++++---- docs/tags/cache.html | 8 ++++---- docs/tags/chrome.html | 8 ++++---- docs/tags/cloud.html | 8 ++++---- docs/tags/cpu.html | 8 ++++---- docs/tags/cs.html | 8 ++++---- docs/tags/css.html | 8 ++++---- docs/tags/db.html | 8 ++++---- docs/tags/ddd.html | 8 ++++---- docs/tags/dev-tools.html | 8 ++++---- docs/tags/dns.html | 8 ++++---- docs/tags/docs.html | 8 ++++---- docs/tags/free-bsd.html | 8 ++++---- docs/tags/frontend.html | 8 ++++---- docs/tags/ftp.html | 8 ++++---- docs/tags/git.html | 8 ++++---- docs/tags/google.html | 8 ++++---- docs/tags/hardware.html | 8 ++++---- docs/tags/hash.html | 8 ++++---- docs/tags/hosting.html | 8 ++++---- docs/tags/html.html | 8 ++++---- docs/tags/http.html | 8 ++++---- docs/tags/i-o.html | 8 ++++---- docs/tags/i-os.html | 8 ++++---- docs/tags/internet.html | 8 ++++---- docs/tags/ip.html | 8 ++++---- docs/tags/java-script.html | 8 ++++---- docs/tags/js.html | 8 ++++---- docs/tags/kernel.html | 8 ++++---- docs/tags/library.html | 8 ++++---- docs/tags/linux.html | 8 ++++---- docs/tags/mac-os.html | 8 ++++---- docs/tags/microsoft.html | 8 ++++---- docs/tags/mobile.html | 8 ++++---- docs/tags/network.html | 8 ++++---- docs/tags/node-js.html | 8 ++++---- docs/tags/oop.html | 8 ++++---- docs/tags/os.html | 8 ++++---- docs/tags/owasp.html | 8 ++++---- docs/tags/performance.html | 8 ++++---- docs/tags/pwa.html | 8 ++++---- docs/tags/ram.html | 8 ++++---- docs/tags/readme.html | 8 ++++---- docs/tags/redux.html | 8 ++++---- docs/tags/sass.html | 8 ++++---- docs/tags/scrum.html | 8 ++++---- docs/tags/scss.html | 8 ++++---- docs/tags/security.html | 8 ++++---- docs/tags/sem-ver.html | 8 ++++---- docs/tags/seo.html | 8 ++++---- docs/tags/ssd.html | 8 ++++---- docs/tags/ssh.html | 8 ++++---- docs/tags/state.html | 8 ++++---- docs/tags/tcp-ip.html | 8 ++++---- docs/tags/tdd.html | 8 ++++---- docs/tags/ui.html | 8 ++++---- docs/tags/ux.html | 8 ++++---- docs/tags/vcs.html | 8 ++++---- docs/tags/vps.html | 8 ++++---- docs/tags/web-components.html | 8 ++++---- docs/tags/webpack.html | 8 ++++---- docs/tags/windows.html | 8 ++++---- ...42\226\266\357\270\217-01-nagranie-z-webinaru-ux.html" | 8 ++++---- ...226\266\357\270\217-02-material-uzupelniajacy-ui.html" | 8 ++++---- .../\342\226\266\357\270\217-0-wprowadzenie.html" | 8 ++++---- ...\342\226\266\357\270\217-1-1-korzystanie-z-figmy.html" | 8 ++++---- ...226\266\357\270\217-1-2-zapoznanie-z-interfejsem.html" | 8 ++++---- .../\342\226\266\357\270\217-2-1-tablica-inspiracji.html" | 8 ++++---- ...\342\226\266\357\270\217-2-2-persona-uzytkownika.html" | 8 ++++---- ...\226\266\357\270\217-2-3-scenariusze-uzytkownika.html" | 8 ++++---- ...\266\357\270\217-3-1-schemat-dzialan-uzytkownika.html" | 8 ++++---- .../\342\226\266\357\270\217-3-2-mapa-strony.html" | 8 ++++---- ...\270\217-3-3-1-przygotowanie-elementow-szkieletu.html" | 8 ++++---- ...26\266\357\270\217-3-3-2-projektowanie-szkieletu.html" | 8 ++++---- .../\342\226\266\357\270\217-3-4-prototyp.html" | 8 ++++---- .../\342\226\266\357\270\217-4-1-tresci-tekstowe.html" | 8 ++++---- .../\342\226\266\357\270\217-4-2-tresci-graficzne.html" | 8 ++++---- ...\342\226\266\357\270\217-5-1-identyfikacja-marki.html" | 8 ++++---- ...\270\217-5-2-1-dostosowanie-typografii-i-kolorow.html" | 8 ++++---- ...66\357\270\217-5-2-2-formularzdostepnosci-uslugi.html" | 8 ++++---- .../\342\226\266\357\270\217-5-2-3-glebia.html" | 8 ++++---- ...26\266\357\270\217-5-2-4-dostosowanie-ilustracji.html" | 8 ++++---- ...\226\266\357\270\217-5-2-5-rozmieszczenie-grafik.html" | 8 ++++---- .../\342\226\266\357\270\217-5-2-6-detale.html" | 8 ++++---- docs/ux-ui/ux-ui.html | 8 ++++---- index.html | 8 ++++---- lunr-index-1688562608076.json | 1 - lunr-index-1688563514768.json | 1 + lunr-index.json | 2 +- search-doc-1688562608076.json | 1 - search-doc-1688563514768.json | 1 + search-doc.json | 2 +- 794 files changed, 3140 insertions(+), 3140 deletions(-) delete mode 100644 assets/js/26a6d6fe.2e29b319.js create mode 100644 assets/js/26a6d6fe.88a609bd.js rename assets/js/{main.1ba32202.js => main.1d5c8ab5.js} (99%) rename assets/js/{main.1ba32202.js.LICENSE.txt => main.1d5c8ab5.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.68c9289d.js => runtime~main.23df0b90.js} (99%) delete mode 100644 lunr-index-1688562608076.json create mode 100644 lunr-index-1688563514768.json delete mode 100644 search-doc-1688562608076.json create mode 100644 search-doc-1688563514768.json diff --git a/100-bugow-js.html b/100-bugow-js.html index c24f82d90..d516d38b7 100644 --- a/100-bugow-js.html +++ b/100-bugow-js.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

100 Bugów JS 🪲

Poznaj lepiej JavaScript, odnajdując drobne błędy w kodzie.

Zapisz się podając swój email, a przez 100 dni będziesz otrzymywał na swoją skrzynkę krótki fragment kodu JavaScript z ukrytym błędem.

Każda wiadomość będzie zawierać również link do rozwiązania.

- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html index e8ce87082..c1a909d3f 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #098

🪲 Znajdź buga

function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
b = 0
}
}
}

console.log(nested(1)(2)(3)(4))

Jak wartość zostanie zalogowana do konsoli?

Czy cały kod w przykładzie jest napisany prawidłowo?

🧪 Rozwiązanie

function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
// b = 0
}
}
}

console.log(nested(1)(2)(3)(4)) // 9

JavaScript umożliwia zamykanie funkcji wewnątrz innej. Umożliwia też zwracanie funkcji z funkcji.

Jest to przydatny sposób np. na przechowywanie informacji w zmiennych, które nie ulegają zniszczeniu po wykonaniu funkcji.

Jest to też efektywny sposób na tworzenie fabryki funkcji, które mogą różnić się stanem początkowym, ale współdzielić tą samą logikę.

Te dwa koncepty w JavaScript'u nazywamy closure czyli domknięcia oraz currying czyli wyprawianie.

Przejdźmy do odnalezienia błędu w kodzie. W naszym przypadku błąd w występuje w postaci próby nadpisania parametru b.

Jest to niemożliwe ze względu na wystąpienie tego fragmentu kodu po wyrażeniu return.

Każde wyrażenie return wewnątrz funkcji zakańcza wykonywanie dalszego jej kodu (z wyjątkiem użycia return w try/catch gdy dodatkowo użyte zostanie finally).

b = 0 jest więc martwym kodem, który nigdy nie zostaje wykonany.

a = 0 jest już jednak skuteczne i nadpisuje przekazany w głównej funkcji nested() parametr a, zmieniając jego wartość na 0.

Sam zapis nested(1)(2)(3)(4) to po prostu ciąg wywołań zagnieżdżonych funkcji, jedna po drugiej.

Wywołanie nested(1) zwraca funkcję zagnieżdżoną na pierwszym poziomie. Funkcja ta z kolei zwraca kolejną funkcję, którą znów możemy wykonać.

Moglibyśmy zapisać to również jako const fn1 = nested(1), a następnie wywołać fn1(2) przypisując zwróconą z takiego wywołania funkcję do kolejnej stałej const fn2 = fn1(2), itd.

Finalnie, wywołanie ostatniej funkcji z całego ciągu zagnieżdżeń, powoduje zsumowanie argumentów przekazanych do każdej z tych funkcji.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html index af955ba0b..2bc042171 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
b = 0
}
}
}

console.log(nested(1)(2)(3)(4))
- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html index 0ddf326a4..feb0dd89b 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jak wartość zostanie zalogowana do konsoli?

Czy cały kod w przykładzie jest napisany prawidłowo?

- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html index a6d4c1645..2dab86196 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html index 7f83896ae..88215a1fc 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
// b = 0
}
}
}

console.log(nested(1)(2)(3)(4)) // 9
- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html index 89f6462a6..f6b3a945d 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

JavaScript umożliwia zamykanie funkcji wewnątrz innej. Umożliwia też zwracanie funkcji z funkcji.

Jest to przydatny sposób np. na przechowywanie informacji w zmiennych, które nie ulegają zniszczeniu po wykonaniu funkcji.

Jest to też efektywny sposób na tworzenie fabryki funkcji, które mogą różnić się stanem początkowym, ale współdzielić tą samą logikę.

Te dwa koncepty w JavaScript'u nazywamy closure czyli domknięcia oraz currying czyli wyprawianie.

Przejdźmy do odnalezienia błędu w kodzie. W naszym przypadku błąd w występuje w postaci próby nadpisania parametru b.

Jest to niemożliwe ze względu na wystąpienie tego fragmentu kodu po wyrażeniu return.

Każde wyrażenie return wewnątrz funkcji zakańcza wykonywanie dalszego jej kodu (z wyjątkiem użycia return w try/catch gdy dodatkowo użyte zostanie finally).

b = 0 jest więc martwym kodem, który nigdy nie zostaje wykonany.

a = 0 jest już jednak skuteczne i nadpisuje przekazany w głównej funkcji nested() parametr a, zmieniając jego wartość na 0.

Sam zapis nested(1)(2)(3)(4) to po prostu ciąg wywołań zagnieżdżonych funkcji, jedna po drugiej.

Wywołanie nested(1) zwraca funkcję zagnieżdżoną na pierwszym poziomie. Funkcja ta z kolei zwraca kolejną funkcję, którą znów możemy wykonać.

Moglibyśmy zapisać to również jako const fn1 = nested(1), a następnie wywołać fn1(2) przypisując zwróconą z takiego wywołania funkcję do kolejnej stałej const fn2 = fn1(2), itd.

Finalnie, wywołanie ostatniej funkcji z całego ciągu zagnieżdżeń, powoduje zsumowanie argumentów przekazanych do każdej z tych funkcji.

- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html index 4d0bb01ae..e32b3a8cf 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #029

🪲 Znajdź buga

let booleanValue = false

if (booleanValue = !false) {
console.log("It's not false!")
}

Czy w powyższym przykładzie konsola coś zaloguje, czy nie?

🧪 Rozwiązanie

let booleanValue = false

if (booleanValue === !false) {
console.log("It's not false!")
}

W przykładzie z błędem, w konsoli zostanie zalogowana wartość It's not false!

W kodzie pojawił się błąd wewnątrz instrukcji warunkowej. Zamiast operatora porównania użyty został operator przypisania.

W przypadku operatora przypisania, domyślnie zwracana jest wartość przypisywana.

booleanValue = !false to po prostu przypisanie zanegowanej wartości false, czyli wartości true.

Przypisanie true do zmiennej booleanValue zwraca wartość true, więc instrukcja warunkowa się wykonuje i console.log() zostaje wywołany.

Naprawienie błędu polega na poprawieniu błędnie użytego operatora przypisania i zastąpieniu go operatorem porównania.

Możemy też użyć alternatywnej konstrukcji i zamiast === !false, zapisać to jako !== false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html index 46754ca92..81dd19db8 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let booleanValue = false

if (booleanValue = !false) {
console.log("It's not false!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html index 1b0ac9aa2..44b22bf26 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy w powyższym przykładzie konsola coś zaloguje, czy nie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html index 9eea753e2..3ffeffea3 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html index 62d5010d8..15525e270 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let booleanValue = false

if (booleanValue === !false) {
console.log("It's not false!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html index 067180541..29461cde0 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli zostanie zalogowana wartość It's not false!

W kodzie pojawił się błąd wewnątrz instrukcji warunkowej. Zamiast operatora porównania użyty został operator przypisania.

W przypadku operatora przypisania, domyślnie zwracana jest wartość przypisywana.

booleanValue = !false to po prostu przypisanie zanegowanej wartości false, czyli wartości true.

Przypisanie true do zmiennej booleanValue zwraca wartość true, więc instrukcja warunkowa się wykonuje i console.log() zostaje wywołany.

Naprawienie błędu polega na poprawieniu błędnie użytego operatora przypisania i zastąpieniu go operatorem porównania.

Możemy też użyć alternatywnej konstrukcji i zamiast === !false, zapisać to jako !== false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html index 52fa81e5f..468f060a2 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #003

🪲 Znajdź buga

const numA = "8"
const numB = "4"

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)

Jakie wyniki powyższych działań zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numA = 8
const numB = 4

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)

W przykładzie z błędem, wszystkie działania oprócz "8" + "4" zwrócą poprawne wyniki. Jedynie "8" + "4" zwróci "84".

Aby naprawić ten błąd musimy zapisywać liczby w formacie liczbowym, zamiast jako ciągi znaków.

Wystarczy więc pozbyć się cudzysłowu, zapisując liczby jako 8 i 4.

W przedstawionych działaniach tylko dodawanie zwraca błędny wynik, ponieważ w odróżnieniu od pozostałych operatorów, + ma dwojakie działanie. Sumuje wartości liczbowe lub łączy ciągi znaków.

Jeśli któryś ze składników działania dodawania jest ciągiem znaków, JavaScript zamienia również pozostałe składniki na ciągi znaków i łączy je ze sobą.

"text" + 1 (string + number) zwróci "text1" (string)

5 + "5" (number + string) zwróci "55" (string)

5 + 5 (number + number) zwróci 10 (number)

Pozostałe operatory, przed wykonaniem działania, dokonują konwersji typów danych na typ liczbowy.

Przykładowo, "5" - 5 (string - number) będzie skonwertowane na 5 - 5 (number - number) i zwróci 0 (number).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html index 5457decaa..3a626170d 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numA = "8"
const numB = "4"

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)
- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html index 44db10122..2dcb96bbe 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wyniki powyższych działań zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html index f9eddc074..44a3f478f 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html index bd924e69a..b3ba0058b 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numA = 8
const numB = 4

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)
- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html index 4e165ee2c..25ca9672a 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, wszystkie działania oprócz "8" + "4" zwrócą poprawne wyniki. Jedynie "8" + "4" zwróci "84".

Aby naprawić ten błąd musimy zapisywać liczby w formacie liczbowym, zamiast jako ciągi znaków.

Wystarczy więc pozbyć się cudzysłowu, zapisując liczby jako 8 i 4.

W przedstawionych działaniach tylko dodawanie zwraca błędny wynik, ponieważ w odróżnieniu od pozostałych operatorów, + ma dwojakie działanie. Sumuje wartości liczbowe lub łączy ciągi znaków.

Jeśli któryś ze składników działania dodawania jest ciągiem znaków, JavaScript zamienia również pozostałe składniki na ciągi znaków i łączy je ze sobą.

"text" + 1 (string + number) zwróci "text1" (string)

5 + "5" (number + string) zwróci "55" (string)

5 + 5 (number + number) zwróci 10 (number)

Pozostałe operatory, przed wykonaniem działania, dokonują konwersji typów danych na typ liczbowy.

Przykładowo, "5" - 5 (string - number) będzie skonwertowane na 5 - 5 (number - number) i zwróci 0 (number).

- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html index 8807db0a2..e16fa5c35 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #069

🪲 Znajdź buga

let a
let { a: b = "foo" } = { a }

console.log(a)
console.log(b)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

let a
let { a: b = "foo" } = { a }

console.log(a) // undefined
console.log(b) // "foo"

Przejdźmy po kolei przez operacje jakie wykonuje JavaScript.

Utworzona zostaje zmienna a bez przypisania wartości, czyli jej wartość to undefined.

Operator przypisania = przechodzi do ewaluacji wartości po prawej stronie operatora.

Utworzony zostaje obiekt z własnością a, której wartość to undefined.

Destrukturyzując obiekt, przemianowujemy własność obiektu o nazwie a na nazwę b, tworząc tym samym zmienną b.

Wprowadzony zostaje domyślny parametr "foo", który zostaje przypisany jako wartość zmiennej, w przypadku gdy wartość destrukturyzowanej własności obiektu okazałaby się fałszywa.

Z uwagi na to, że obiekt ma kształt { a: undefined }, to rozbijając go na zmienną a, przemianowaną na b, wartość własności a jest fałszywa, zostaje więc użyty parametr domyślny "foo".

Finalnie utworzona zostaje więc zmienna b z wartością "foo".

Zmienna a nie ulega po drodze żadnym modyfikacjom i zachowuje swoją początkową wartość undefined.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html index 2eaaad99c..3ee73d3da 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let a
let { a: b = "foo" } = { a }

console.log(a)
console.log(b)
- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html index bff1332e1..2e2722580 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html index 193d0c841..cc4d8c12f 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html index 86e928a12..3aed376e2 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let a
let { a: b = "foo" } = { a }

console.log(a) // undefined
console.log(b) // "foo"
- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html index 609ae25db..5d36ab798 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Przejdźmy po kolei przez operacje jakie wykonuje JavaScript.

Utworzona zostaje zmienna a bez przypisania wartości, czyli jej wartość to undefined.

Operator przypisania = przechodzi do ewaluacji wartości po prawej stronie operatora.

Utworzony zostaje obiekt z własnością a, której wartość to undefined.

Destrukturyzując obiekt, przemianowujemy własność obiektu o nazwie a na nazwę b, tworząc tym samym zmienną b.

Wprowadzony zostaje domyślny parametr "foo", który zostaje przypisany jako wartość zmiennej, w przypadku gdy wartość destrukturyzowanej własności obiektu okazałaby się fałszywa.

Z uwagi na to, że obiekt ma kształt { a: undefined }, to rozbijając go na zmienną a, przemianowaną na b, wartość własności a jest fałszywa, zostaje więc użyty parametr domyślny "foo".

Finalnie utworzona zostaje więc zmienna b z wartością "foo".

Zmienna a nie ulega po drodze żadnym modyfikacjom i zachowuje swoją początkową wartość undefined.

- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html index 9ae2bd07e..3d2a7dff6 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #054

🪲 Znajdź buga

const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar")
func2("foo", "bar")
func3("foo", "bar")
func4("foo", "bar")

Czy powyższe wywołania funkcji, zalogują do konsoli przekazane argumenty?

🧪 Rozwiązanie

const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar") // ["foo", "bar"]
func2("foo", "bar") // ["foo", "bar"]
func3("foo", "bar") // { 0: "foo", 1: "bar"}
func4("foo", "bar") // arguments is not defined

Wywołania func1() i func2() zalogują do konsoli to samo, czyli tablice z listą przekazanych argumentów.

Nazwę parametru reszty (występującego po wielokropku) możemy zdefiniować dowolnie, nie musi nazywać się arguments.

Następnie w tak zdefiniowanym parametrze reszty otrzymujemy dostęp do tablicy z pozostałymi parametrami przekazanymi do funkcji.

Pozostałymi, czyli jeśli w funkcji zdefiniujemy np. func(a, ...rest), to w rest będziemy mieli dostęp do tablicy z resztą parametrów, bez parametru a.

W kolejnych funkcjach, func3() i func4() wywołane zostały predefiniowane obiekty arguments.

Funkcje mają dostęp do takiego obiektu, mimo, że nie jest on wyraźnie zadeklarowany. Podobna sytuacja ma miejsce np. z this.

Analogicznie do this, obiekt arguments jest dostępny tylko w przypadku deklaracji funkcji z użyciem słowa kluczowego function. Jeśli zdefiniowana funkcja jest funkcją strzałkową, wtedy obiekt arguments nie jest dostępny.

W wywołaniu func4() JavaScript wyrzuci więc błąd ReferenceError: arguments is not defined.

Jeśli jednak sprawdzisz kod w środowisku StackBlitz (Plac zabaw poniżej), obiekt arguments wewnątrz funkcji strzałkowej zwróci dziwne rzeczy.

Jest to spowodowane zdefiniowaniem obiektu arguments w globalnym zakresie poprzez StackBlitz i to samo zostanie zwrócone gdy wywołamy console.log(arguments) bezpośrednio w globalnym polu, bez zagnieżdżania go w funkcji

Podsumowując, preferowane jest używanie parametru reszty, zamiast predefiniowanego obiektu arguments.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html index f22d31fb6..7b2191335 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar")
func2("foo", "bar")
func3("foo", "bar")
func4("foo", "bar")
- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html index 4f97c5334..71dd6f9b5 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy powyższe wywołania funkcji, zalogują do konsoli przekazane argumenty?

- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html index 46ff64683..713d20b03 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html index caee195bd..50a400a32 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar") // ["foo", "bar"]
func2("foo", "bar") // ["foo", "bar"]
func3("foo", "bar") // { 0: "foo", 1: "bar"}
func4("foo", "bar") // arguments is not defined
- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html index 5981752ac..2979327ba 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wywołania func1() i func2() zalogują do konsoli to samo, czyli tablice z listą przekazanych argumentów.

Nazwę parametru reszty (występującego po wielokropku) możemy zdefiniować dowolnie, nie musi nazywać się arguments.

Następnie w tak zdefiniowanym parametrze reszty otrzymujemy dostęp do tablicy z pozostałymi parametrami przekazanymi do funkcji.

Pozostałymi, czyli jeśli w funkcji zdefiniujemy np. func(a, ...rest), to w rest będziemy mieli dostęp do tablicy z resztą parametrów, bez parametru a.

W kolejnych funkcjach, func3() i func4() wywołane zostały predefiniowane obiekty arguments.

Funkcje mają dostęp do takiego obiektu, mimo, że nie jest on wyraźnie zadeklarowany. Podobna sytuacja ma miejsce np. z this.

Analogicznie do this, obiekt arguments jest dostępny tylko w przypadku deklaracji funkcji z użyciem słowa kluczowego function. Jeśli zdefiniowana funkcja jest funkcją strzałkową, wtedy obiekt arguments nie jest dostępny.

W wywołaniu func4() JavaScript wyrzuci więc błąd ReferenceError: arguments is not defined.

Jeśli jednak sprawdzisz kod w środowisku StackBlitz (Plac zabaw poniżej), obiekt arguments wewnątrz funkcji strzałkowej zwróci dziwne rzeczy.

Jest to spowodowane zdefiniowaniem obiektu arguments w globalnym zakresie poprzez StackBlitz i to samo zostanie zwrócone gdy wywołamy console.log(arguments) bezpośrednio w globalnym polu, bez zagnieżdżania go w funkcji

Podsumowując, preferowane jest używanie parametru reszty, zamiast predefiniowanego obiektu arguments.

- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html index ae76fc48d..21284b6eb 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #008

🪲 Znajdź buga

function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = (distance) => {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)

Chcemy stworzyć obiekt samochodu, który będzie zwiększał swój przebieg (mileage) podczas jazdy, o wartość przekazaną w argumencie metody drive().

Jaki przebieg zostanie zalogowany do konsoli dla obiektu myCar?

🧪 Rozwiązanie

function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = function (distance) {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)

W przykładzie z błędem, wartość mileage obiektu myCar wyniesie 0.

Niedziałanie zwiększania wartości przez this.mileage += distance wynika z tego, że funkcje strzałkowe nie mają własnego this i nie powinny być używane jako metody obiektów.

this.milage nie odnosi się więc do obiektu, tak jakbyśmy tego chcieli.

Aby naprawić ten problem, musimy zamienić funkcję strzałkową drive na zwykłą funkcję.

Po tej zmianie, obiekt myCar zwróci już wartość mileage równą 1000.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html index 089be5ebc..2f07622df 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = (distance) => {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)
- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html index 5ea5c09bb..ced669f9b 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy stworzyć obiekt samochodu, który będzie zwiększał swój przebieg (mileage) podczas jazdy, o wartość przekazaną w argumencie metody drive().

Jaki przebieg zostanie zalogowany do konsoli dla obiektu myCar?

- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html index 8bb1c23cb..dea17373a 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html index 8e34687cb..9e7f8b530 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = function (distance) {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)
- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html index 1d6e4552a..8e03c879e 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, wartość mileage obiektu myCar wyniesie 0.

Niedziałanie zwiększania wartości przez this.mileage += distance wynika z tego, że funkcje strzałkowe nie mają własnego this i nie powinny być używane jako metody obiektów.

this.milage nie odnosi się więc do obiektu, tak jakbyśmy tego chcieli.

Aby naprawić ten problem, musimy zamienić funkcję strzałkową drive na zwykłą funkcję.

Po tej zmianie, obiekt myCar zwróci już wartość mileage równą 1000.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html index 14b241251..be86a62d0 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #048

🪲 Znajdź buga

console.log({} instanceof Object)

console.log([] instanceof Array)
console.log([] instanceof Object)

console.log((() => {}) instanceof Function)
console.log((() => {}) instanceof Object)

console.log("foo" instanceof String)
console.log(String("foo") instanceof String)
console.log(new String("foo") instanceof String)

console.log("foo" instanceof Object)
console.log(String("foo") instanceof Object)
console.log(new String("foo") instanceof Object)

Czy w JavaScript wszystko jest obiektem?

Jakie wartości logiczne zostaną zalogowane do konsoli dla poszczególnych wywołań instanceof ?

🧪 Rozwiązanie

console.log({} instanceof Object) // true

console.log([] instanceof Array) // true
console.log([] instanceof Object) // true

console.log((() => {}) instanceof Function) // true
console.log((() => {}) instanceof Object) // true

console.log("foo" instanceof String) // false
console.log(String("foo") instanceof String) // false
console.log(new String("foo") instanceof String) // true

console.log("foo" instanceof Object) // false
console.log(String("foo") instanceof Object) // false
console.log(new String("foo") instanceof Object) // true

Można by błędnie założyć, że instanceof sprawdza czy obiekt został utworzony przez dany konstruktor, czyli, czy jego instancja została utworzona poprzez wywołanie new na funkcji konstruującej obiekt.

W rzeczywistości instanceof sprawdza jednak, czy utworzona instancja obiektu ma w całym swoim łańcuchu prototypów dany konstruktor.

W JavaScript obiekty dziedziczą po sobie przekazując swoje prototypy, jednocześnie tworząc łańcuch, w którym "foo".__proto__.constructor zwróci String, a "foo".__proto__.__proto__.constructor zwróci Object.

Ciąg znaków dziedziczy więc w łańcuchu prototypów zarówno konstruktor String, jak i Object.

Podobnie wygląda sytuacja w przypadku innych typów danych.

Obiekt daty będzie miał w swoim łańcuchu prototypów zarówno konstruktor Date, jak i Object.

Tablica (array) również będzie miała w swoim łańcuchu prototypów konstruktor Array, jak i Object.

Funkcja również, Function i Object.

Nie bez powodu mówi się, że w JavaScript wszystko jest obiektem.

Typy prymitywne (jak np. ciąg znaków) z użyciem instanceof nie będą się jednak przedstawiały jako instancje Object, mimo, że w łańcuchu prototypów jasno widać, że "foo".__proto__.__proto__.constructor to Object.

NaN również nie przedstawi się jako instancja obiektu, ale w swoim łańcuchu prototypów ma konstruktor Number i Object.

Podobnie w przypadku wartości logicznych true i false. Tak jak wartości prymitywne, nie zgłoszą się one jako instancja obiektu, ale mają w swoim łańcuchu prototypów konstruktory Boolean i Object.

Jedynie wartości null i undefined nie mają swoich prototypów i konstruktorów, ale żeby było śmieszniej typeof null zwróci object. Jest to jednak uznawane za znany bug w języku JavaScript i ze względu na zachowanie kompatybilności wstecznej, nie zostaje naprawiany.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html index 001d514ae..8736cf0d4 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log({} instanceof Object)

console.log([] instanceof Array)
console.log([] instanceof Object)

console.log((() => {}) instanceof Function)
console.log((() => {}) instanceof Object)

console.log("foo" instanceof String)
console.log(String("foo") instanceof String)
console.log(new String("foo") instanceof String)

console.log("foo" instanceof Object)
console.log(String("foo") instanceof Object)
console.log(new String("foo") instanceof Object)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html index 157579ced..6a0796b0e 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy w JavaScript wszystko jest obiektem?

Jakie wartości logiczne zostaną zalogowane do konsoli dla poszczególnych wywołań instanceof ?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html index 7050b023f..0b0b07fbf 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html index a3717fc00..e4f33172b 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log({} instanceof Object) // true

console.log([] instanceof Array) // true
console.log([] instanceof Object) // true

console.log((() => {}) instanceof Function) // true
console.log((() => {}) instanceof Object) // true

console.log("foo" instanceof String) // false
console.log(String("foo") instanceof String) // false
console.log(new String("foo") instanceof String) // true

console.log("foo" instanceof Object) // false
console.log(String("foo") instanceof Object) // false
console.log(new String("foo") instanceof Object) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html index 3183caeed..fbd9dbd2d 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Można by błędnie założyć, że instanceof sprawdza czy obiekt został utworzony przez dany konstruktor, czyli, czy jego instancja została utworzona poprzez wywołanie new na funkcji konstruującej obiekt.

W rzeczywistości instanceof sprawdza jednak, czy utworzona instancja obiektu ma w całym swoim łańcuchu prototypów dany konstruktor.

W JavaScript obiekty dziedziczą po sobie przekazując swoje prototypy, jednocześnie tworząc łańcuch, w którym "foo".__proto__.constructor zwróci String, a "foo".__proto__.__proto__.constructor zwróci Object.

Ciąg znaków dziedziczy więc w łańcuchu prototypów zarówno konstruktor String, jak i Object.

Podobnie wygląda sytuacja w przypadku innych typów danych.

Obiekt daty będzie miał w swoim łańcuchu prototypów zarówno konstruktor Date, jak i Object.

Tablica (array) również będzie miała w swoim łańcuchu prototypów konstruktor Array, jak i Object.

Funkcja również, Function i Object.

Nie bez powodu mówi się, że w JavaScript wszystko jest obiektem.

Typy prymitywne (jak np. ciąg znaków) z użyciem instanceof nie będą się jednak przedstawiały jako instancje Object, mimo, że w łańcuchu prototypów jasno widać, że "foo".__proto__.__proto__.constructor to Object.

NaN również nie przedstawi się jako instancja obiektu, ale w swoim łańcuchu prototypów ma konstruktor Number i Object.

Podobnie w przypadku wartości logicznych true i false. Tak jak wartości prymitywne, nie zgłoszą się one jako instancja obiektu, ale mają w swoim łańcuchu prototypów konstruktory Boolean i Object.

Jedynie wartości null i undefined nie mają swoich prototypów i konstruktorów, ale żeby było śmieszniej typeof null zwróci object. Jest to jednak uznawane za znany bug w języku JavaScript i ze względu na zachowanie kompatybilności wstecznej, nie zostaje naprawiany.

- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html index 9ebfcd3fb..9aa62c64d 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #088

🪲 Znajdź buga

const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000)
console.log(date_1999_ < date_2001)
console.log(date_1999 < date_1999)
console.log(date_1999 < date_1999_)
console.log(date_1999 == date_1999)
console.log(date_1999 == date_1999_)
console.log(date_1999 <= date_1999_)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000) // true
console.log(date_1999_ < date_2001) // true
console.log(date_1999 < date_1999) // false
console.log(date_1999 < date_1999_) // false
console.log(date_1999 == date_1999) // true
console.log(date_1999 == date_1999_) // false
console.log(date_1999 <= date_1999_) // true

Daty przypisane do stałych date_1999 i date_1999_ są takie same.

Są jednak różnymi obiektami i porównywanie ich za pomocą operatora == lub === zawsze zwróci fałsz.

Prawda z takiego porównania zostanie zwrócona tylko wtedy, gdy porównywany ze sobą będzie ten sam referencyjny obiekt.

Moglibyśmy stworzyć alias np. const date_1999_x = date_1999.

Wtedy porównanie date_1999_x == date_1999 zwróciłoby prawdę.

Wiązałoby się to jednak też i z innymi implikacjami jakie niosą za sobą aliasy obiektów w JavaScript.

Mutując taki alias lub referencyjny obiekt, zmieniałby się on jednocześnie w obu stałych/zmiennych.

Operator <, ale również i <= oraz ich odwrotności > i >=, działają na podstawie innego algorytmu niż ==

Porównywane są tutaj wartości liczbowe, do których zostaną sprowadzone operandy (w naszym przypadku obiekty dat).

Nie ma znaczenia czy wartości są przekazywane jako referencja.

Jeśli chcemy więc porównać dwie daty pod kątem, która data jest wcześniejsza (mniejsza) lub późniejsza (większa), to używanie operatorów <, <=, >, >= nadaje się bardzo dobrze.

Jeśli chcemy jednak dowiedzieć się, czy dwie daty są identyczne, musimy najpierw samodzielnie sprowadzić je do wartości liczbowych np. metodą getTime().

Dopiero tak zaprezentowane daty w postaci wartości liczbowych możemy porównywać za pomocą == lub ===.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html index 69369fbae..7eb3fa1e1 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000)
console.log(date_1999_ < date_2001)
console.log(date_1999 < date_1999)
console.log(date_1999 < date_1999_)
console.log(date_1999 == date_1999)
console.log(date_1999 == date_1999_)
console.log(date_1999 <= date_1999_)
- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html index 1dd46ed37..139bd6ab9 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html index 4020dec8e..6bf0435c8 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html index c7350e02c..920192af0 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000) // true
console.log(date_1999_ < date_2001) // true
console.log(date_1999 < date_1999) // false
console.log(date_1999 < date_1999_) // false
console.log(date_1999 == date_1999) // true
console.log(date_1999 == date_1999_) // false
console.log(date_1999 <= date_1999_) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html index e65cdf87b..7dab104d4 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Daty przypisane do stałych date_1999 i date_1999_ są takie same.

Są jednak różnymi obiektami i porównywanie ich za pomocą operatora == lub === zawsze zwróci fałsz.

Prawda z takiego porównania zostanie zwrócona tylko wtedy, gdy porównywany ze sobą będzie ten sam referencyjny obiekt.

Moglibyśmy stworzyć alias np. const date_1999_x = date_1999.

Wtedy porównanie date_1999_x == date_1999 zwróciłoby prawdę.

Wiązałoby się to jednak też i z innymi implikacjami jakie niosą za sobą aliasy obiektów w JavaScript.

Mutując taki alias lub referencyjny obiekt, zmieniałby się on jednocześnie w obu stałych/zmiennych.

Operator <, ale również i <= oraz ich odwrotności > i >=, działają na podstawie innego algorytmu niż ==

Porównywane są tutaj wartości liczbowe, do których zostaną sprowadzone operandy (w naszym przypadku obiekty dat).

Nie ma znaczenia czy wartości są przekazywane jako referencja.

Jeśli chcemy więc porównać dwie daty pod kątem, która data jest wcześniejsza (mniejsza) lub późniejsza (większa), to używanie operatorów <, <=, >, >= nadaje się bardzo dobrze.

Jeśli chcemy jednak dowiedzieć się, czy dwie daty są identyczne, musimy najpierw samodzielnie sprowadzić je do wartości liczbowych np. metodą getTime().

Dopiero tak zaprezentowane daty w postaci wartości liczbowych możemy porównywać za pomocą == lub ===.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html index 454821054..187cccdf0 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #016

🪲 Znajdź buga

const myDog = new Dog()
const myCat = new Cat()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

console.log(myDog.name)
console.log(myCat.name)

Czy przedstawiony kod zadziała poprawnie? Jeśli nie, to gdzie kryje się błąd?

🧪 Rozwiązanie

const myDog = new Dog()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

const myCat = new Cat()

console.log(myDog.name)
console.log(myCat.name)

Uruchomienie kodu z błędem wyrzuci nam do konsoli błąd Cannot access 'Cat' before initialization.

W JavaScript deklaracje funkcji oraz zmiennych definiowanych wyrażeniem var są podciągane na początek wykonywanego kodu. Własność tą z j. angielskiego nazywamy hoisting.

Hoisting w JS oznacza, że możemy najpierw wywołać funkcję, a dopiero w dalszej części kodu ją zdefiniować.

Nie możemy jednak zrobić tego samego z klasą. Deklaracja class nie jest podciągana, przez co nie możemy jej wywołać przed jej zdeklarowaniem.

I dokładnie to jest powodem wystąpienia błędu w wcześniej przedstawionym błędnym kodzie.

Aby naprawić błąd, musimy po prostu przenieść wywołanie new Cat() do dalszej części kodu, aby wywołanie nastąpiło już po deklaracji klasy.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html index 2049928a9..9e264d5c1 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myDog = new Dog()
const myCat = new Cat()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

console.log(myDog.name)
console.log(myCat.name)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html index 3796a9ac0..b75a381e8 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy przedstawiony kod zadziała poprawnie? Jeśli nie, to gdzie kryje się błąd?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html index 845d00cd4..380691382 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html index f7b043bb3..5cae44179 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myDog = new Dog()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

const myCat = new Cat()

console.log(myDog.name)
console.log(myCat.name)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html index 87aef2252..bf1c3c458 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Uruchomienie kodu z błędem wyrzuci nam do konsoli błąd Cannot access 'Cat' before initialization.

W JavaScript deklaracje funkcji oraz zmiennych definiowanych wyrażeniem var są podciągane na początek wykonywanego kodu. Własność tą z j. angielskiego nazywamy hoisting.

Hoisting w JS oznacza, że możemy najpierw wywołać funkcję, a dopiero w dalszej części kodu ją zdefiniować.

Nie możemy jednak zrobić tego samego z klasą. Deklaracja class nie jest podciągana, przez co nie możemy jej wywołać przed jej zdeklarowaniem.

I dokładnie to jest powodem wystąpienia błędu w wcześniej przedstawionym błędnym kodzie.

Aby naprawić błąd, musimy po prostu przenieść wywołanie new Cat() do dalszej części kodu, aby wywołanie nastąpiło już po deklaracji klasy.

- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html index 88ee39100..675a6acaf 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #049

🪲 Znajdź buga

const numbers = [43, 12, 1, 5, 26]

console.log(numbers.sort())

Chcemy posortować tablicę z liczbami od najmniejszej do największej.

Czy do konsoli zostanie zalogowana właściwa kolejność?

🧪 Rozwiązanie

const numbers = [43, 12, 1, 5, 26]
const compareNumbers = (a, b) => a - b

console.log(numbers.sort(compareNumbers))

W przykładzie z błędem zostanie zalogowana tablica 1,12,26,43,5.

Wyraźnie została ona zmieniona względem oryginału, ale sortowanie nastąpiło nie według wartości liczbowych, a alfabetycznych.

Domyślne działanie metody sort() polega na sprowadzeniu porównywanych wartości do ciągów znaków i posortowaniu ich według tablicy kodowania znaków UTF-16.

1 występuje przed 2 tak samo jak a przed b.

Kolejność 1,12,26... można więc porównać np. do a,ab,bf....

Aby posortować wartości z tablicy pod kątem liczbowym, musimy samodzielnie napisać funkcję porównującą i przekazać ją jako argument do funkcji sort().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html index 9a3f066f3..3f5d03a5d 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [43, 12, 1, 5, 26]

console.log(numbers.sort())
- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html index ae0504300..97d342ced 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy posortować tablicę z liczbami od najmniejszej do największej.

Czy do konsoli zostanie zalogowana właściwa kolejność?

- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html index 4ada0c000..717d5d2f2 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html index 7bc76102f..ed682ea3b 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [43, 12, 1, 5, 26]
const compareNumbers = (a, b) => a - b

console.log(numbers.sort(compareNumbers))
- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html index 036496a57..191d65693 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem zostanie zalogowana tablica 1,12,26,43,5.

Wyraźnie została ona zmieniona względem oryginału, ale sortowanie nastąpiło nie według wartości liczbowych, a alfabetycznych.

Domyślne działanie metody sort() polega na sprowadzeniu porównywanych wartości do ciągów znaków i posortowaniu ich według tablicy kodowania znaków UTF-16.

1 występuje przed 2 tak samo jak a przed b.

Kolejność 1,12,26... można więc porównać np. do a,ab,bf....

Aby posortować wartości z tablicy pod kątem liczbowym, musimy samodzielnie napisać funkcję porównującą i przekazać ją jako argument do funkcji sort().

- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html index 2ca98238f..0367f900e 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #025

🪲 Znajdź buga

function sum(a, b) {
return a + b
}

function sum(a, b, c) {
return a + b + c
}

console.log(sum(1, 2))

Chcemy przeciążyć funkcję, tj. zdefiniować kolejną funkcję o tej samej nazwie, ale z innymi parametrami.

Jaki będzie efekt wywołania powyższego kodu?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

function sum(a, b, c) {
return a + b + c
}

function sum(a, b) {
return a + b
}

console.log(sum(1, 2))

W błędnym przykładzie, wywołanie funkcji sum(1, 2) zaloguje do konsoli wartość NaN.

JavaScript w przeciwieństwie do innych języków np. C++, Java, Swift, nie pozwala na przeciążanie funkcji, czyli deklarowania ich używając tej samej nazwy funkcji ale z innymi parametrami.

Co ciekawe TypeScript zezwala na definiowanie funkcji przeciążających.

O ile przeciążanie funkcji nie jest możliwe w JavaScript, to nadpisywanie ich już jak najbardziej tak.

Nie dostajemy więc błędu o zdefiniowaniu funkcji z nazwą, która już istnieje, bo jest to dozwolone.

Do konsoli zostaje zalogowane NaN (skrót od Not-A-Number), bo JavaScript nie może wykonywać operacji matematycznych na typach danych innych niż Number.

Nadpisując funkcję sum(), nadpisujemy ją deklarując w jej nowej wersji trzy parametry.

Wywołując sum() przekazujemy tylko dwa argumenty. Trzeci, brakujący, używany wewnątrz funkcji jako parametr pozostaje niezdefiniowany.

Operacja wewnątrz funkcji 1 + 2 + undefined zwraca więc NaN.

Aby rozwiązać problem, najprościej będzie nam nadpisać funkcję w odwrotnej kolejności, lub kompletnie pozbyć się deklaracji funkcji sum() z trzema parametrami.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html index 6b2cfdcbc..510fadbf4 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function sum(a, b) {
return a + b
}

function sum(a, b, c) {
return a + b + c
}

console.log(sum(1, 2))
- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html index d72c7409b..94d1d82fd 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy przeciążyć funkcję, tj. zdefiniować kolejną funkcję o tej samej nazwie, ale z innymi parametrami.

Jaki będzie efekt wywołania powyższego kodu?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html index ecb52bca0..b74386d70 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html index 12855dc52..a2bcb95bf 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function sum(a, b, c) {
return a + b + c
}

function sum(a, b) {
return a + b
}

console.log(sum(1, 2))
- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html index 833fff3da..c4051577c 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W błędnym przykładzie, wywołanie funkcji sum(1, 2) zaloguje do konsoli wartość NaN.

JavaScript w przeciwieństwie do innych języków np. C++, Java, Swift, nie pozwala na przeciążanie funkcji, czyli deklarowania ich używając tej samej nazwy funkcji ale z innymi parametrami.

Co ciekawe TypeScript zezwala na definiowanie funkcji przeciążających.

O ile przeciążanie funkcji nie jest możliwe w JavaScript, to nadpisywanie ich już jak najbardziej tak.

Nie dostajemy więc błędu o zdefiniowaniu funkcji z nazwą, która już istnieje, bo jest to dozwolone.

Do konsoli zostaje zalogowane NaN (skrót od Not-A-Number), bo JavaScript nie może wykonywać operacji matematycznych na typach danych innych niż Number.

Nadpisując funkcję sum(), nadpisujemy ją deklarując w jej nowej wersji trzy parametry.

Wywołując sum() przekazujemy tylko dwa argumenty. Trzeci, brakujący, używany wewnątrz funkcji jako parametr pozostaje niezdefiniowany.

Operacja wewnątrz funkcji 1 + 2 + undefined zwraca więc NaN.

Aby rozwiązać problem, najprościej będzie nam nadpisać funkcję w odwrotnej kolejności, lub kompletnie pozbyć się deklaracji funkcji sum() z trzema parametrami.

- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html index 03e07be07..b72266ed0 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #061

🪲 Znajdź buga

const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1)
console.log(promise2)

promise2.then((value) => {
console.log(value)
console.log(value === promise1)
})

Mamy 2 obietnice: promise1 rozwiązuje się zwracając wartość foo, a promise2 rozwiązuje się zwracając promise1.

Co zostanie zalogowane do konsoli w poszczególnych miejscach?

Czy rozwiązanie promise2 poprzez then zwróci w value tą samą obietnicę, która została przekazana w resolve()?

🧪 Rozwiązanie

const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1) // Promise {}
console.log(promise2) // Promise {}

promise2.then((value) => {
console.log(value) // foo
console.log(value === promise1) // false
})

promise1 i promise2 to obiekty Promise, co jest wyraźnie logowane do konsoli w liniach 8 i 9.

promise2, mimo że w założeniu rozwiązuje się do obiektu promise1, finalnie zostaje rozwiązane do wartości foo.

resolve() spłaszcza przekazane obietnice jeśli takie zostają przekazane jako wartość rozwiązania obietnicy i rozwiązuje je wszystkie.

value po rozwiązaniu promise2, będzie więc wartością przekazaną w resolve() w promise1.

value === promise1 zwróci więc fałsz, bo value to foo, a nie obiekt obietnicy promise1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html index 33888adbb..cfc0cec78 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1)
console.log(promise2)

promise2.then((value) => {
console.log(value)
console.log(value === promise1)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html index 0c2612944..d4a4eda84 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Mamy 2 obietnice: promise1 rozwiązuje się zwracając wartość foo, a promise2 rozwiązuje się zwracając promise1.

Co zostanie zalogowane do konsoli w poszczególnych miejscach?

Czy rozwiązanie promise2 poprzez then zwróci w value tą samą obietnicę, która została przekazana w resolve()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html index c7894c28c..46ee218de 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html index 9319a8a2b..d0545af6a 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1) // Promise {}
console.log(promise2) // Promise {}

promise2.then((value) => {
console.log(value) // foo
console.log(value === promise1) // false
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html index 3b1038b00..bd350223f 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

promise1 i promise2 to obiekty Promise, co jest wyraźnie logowane do konsoli w liniach 8 i 9.

promise2, mimo że w założeniu rozwiązuje się do obiektu promise1, finalnie zostaje rozwiązane do wartości foo.

resolve() spłaszcza przekazane obietnice jeśli takie zostają przekazane jako wartość rozwiązania obietnicy i rozwiązuje je wszystkie.

value po rozwiązaniu promise2, będzie więc wartością przekazaną w resolve() w promise1.

value === promise1 zwróci więc fałsz, bo value to foo, a nie obiekt obietnicy promise1.

- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html index e6221601f..7a2a65fc1 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #041

🪲 Znajdź buga

const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4 === "Hello World")

Czy wszystkie porównania zalogują do konsoli wartość true?

🧪 Rozwiązanie

const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4.toString() === "Hello World")

W przykładzie z błędem, do konsoli zostanie zalogowana wartość false dla ostatniego porównania z str4.

Użycie operatora new tworzy nową instancję obiektu. Zwracana wartość jest więc obiektem, a nie typem prymitywnym string.

Operator new służy do stworzenia instancji obiektu w oparciu o konstruktor. W języku JavaScript konstruktorem może być funkcja o nazwie constructor, znajdująca się wewnątrz definicji klasy (class), ale nie musi. Może to być też samodzielna funkcja o dowolnej nazwie.

Ścisłe porównanie obiektu z wartością prymitywną prowadzi więc do zwrócenia fałszu.

Aby w czwartym porównaniu uzyskać true musimy na utworzonym obiekcie String wywołać metodę toString(), która wyciągnie z obiektu wartość prymitywną "Hello World" typu string.

Sytuacja z odrębnym zachowaniem się funkcji w zależności od tego czy została ona wywołana z, czy bez operatora new wygląda podobnie również w przypadku innych funkcji, w tym tych predefiniowanych jak String, Number, czy Boolean.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html index 5e148517e..9dee51cf1 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4 === "Hello World")
- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html index f297ee775..a2befc13d 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy wszystkie porównania zalogują do konsoli wartość true?

- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html index 0df1a5c83..b7225fb9b 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html index 2c94fbf67..b8bea0e14 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4.toString() === "Hello World")
- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html index 8dd615a45..17fd0f144 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie zalogowana wartość false dla ostatniego porównania z str4.

Użycie operatora new tworzy nową instancję obiektu. Zwracana wartość jest więc obiektem, a nie typem prymitywnym string.

Operator new służy do stworzenia instancji obiektu w oparciu o konstruktor. W języku JavaScript konstruktorem może być funkcja o nazwie constructor, znajdująca się wewnątrz definicji klasy (class), ale nie musi. Może to być też samodzielna funkcja o dowolnej nazwie.

Ścisłe porównanie obiektu z wartością prymitywną prowadzi więc do zwrócenia fałszu.

Aby w czwartym porównaniu uzyskać true musimy na utworzonym obiekcie String wywołać metodę toString(), która wyciągnie z obiektu wartość prymitywną "Hello World" typu string.

Sytuacja z odrębnym zachowaniem się funkcji w zależności od tego czy została ona wywołana z, czy bez operatora new wygląda podobnie również w przypadku innych funkcji, w tym tych predefiniowanych jak String, Number, czy Boolean.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html index 5d8f42116..095253a60 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #097

🪲 Znajdź buga

const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2)
console.log(sym1 === sym1)

console.log(obj1 === obj2)
console.log(obj1 === obj1)

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1])
console.log(test[sym2])

console.log(test[obj1])
console.log(test[obj2])

console.log(test)

Jaki wartości zostaną zalogowane do konsoli?

Czy są jakieś różnice pomiędzy użyciem obiektu, a symbolu jako nazwy własności innego obiektu?

🧪 Rozwiązanie

const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2) // false
console.log(sym1 === sym1) // true

console.log(obj1 === obj2) // false
console.log(obj1 === obj1) // true

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1]) // "Foo"
console.log(test[sym2]) // "Bar"

console.log(test[obj1]) // "Qux"
console.log(test[obj2]) // "Qux"

console.log(test) // {[object Object]: "Qux"}

Porównywanie ze sobą symboli oraz obiektów, które zostały zdefiniowane niezależnie, da nam ten same efekt - fałsz.

Jedynie porównywanie tych samych stałych, które przechowują dany obiekt lub symbol zwróci prawdę.

Wówczas porównywane będą rzeczywiście te same obiekty/symbole, przechowywane w pamięci pod adresem na który wskazuje dana stała.

Na tym etapie podobieństwa obiektów i symboli z grubsza się kończą.

Symbole z natury służą do utworzenia unikalnej wartości.

Nie są też konwertowane do ciągu znaków w sytuacjach wymuszających tego typu operację.

test[sym1] i test[sym2] zalogują do konsoli "Foo" i "Bar".

Co ważne, test[Symbol()] zwróci undefined, bo jak już wcześniej ustaliliśmy, każdy nowo utworzony symbol jest unikalny.

Jednocześnie własności zdefiniowane za pomocą symboli nie będą widoczne po zalogowania do konsoli obiektu test (będą prywatne).

Nazwy własności w test[obj1] i test[obj2] ulegną konwersji do ciągu znaków "[object Object]".

Istotne jest aby omyłkowo nie zinterpretować takiego zapisu jako tablicy z elementami object i Object.

"[object Object]" to zwykły ciąg znaków powstający w wyniku konwersji ({}).toString()

Ten sam ciąg znaków użyty dwukrotnie jako nazwa własności obiektu test powoduje, że każde kolejne jego użycie nadpisuje poprzednio zdefiniowaną własność o tej samej nazwie.

test[obj1] i test[obj2] logują do konsoli "Qux" bo taka wartość została przypisana jako ostatnia dla test["[object Object]"].

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html index 74a9159e8..2d3abbc1a 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2)
console.log(sym1 === sym1)

console.log(obj1 === obj2)
console.log(obj1 === obj1)

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1])
console.log(test[sym2])

console.log(test[obj1])
console.log(test[obj2])

console.log(test)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html index ebcbcee91..eec84c65c 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaki wartości zostaną zalogowane do konsoli?

Czy są jakieś różnice pomiędzy użyciem obiektu, a symbolu jako nazwy własności innego obiektu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html index bbb093d14..7a2422a17 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html index 706ad4144..370f8cd7a 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2) // false
console.log(sym1 === sym1) // true

console.log(obj1 === obj2) // false
console.log(obj1 === obj1) // true

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1]) // "Foo"
console.log(test[sym2]) // "Bar"

console.log(test[obj1]) // "Qux"
console.log(test[obj2]) // "Qux"

console.log(test) // {[object Object]: "Qux"}
- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html index aa902045a..bb5a96274 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Porównywanie ze sobą symboli oraz obiektów, które zostały zdefiniowane niezależnie, da nam ten same efekt - fałsz.

Jedynie porównywanie tych samych stałych, które przechowują dany obiekt lub symbol zwróci prawdę.

Wówczas porównywane będą rzeczywiście te same obiekty/symbole, przechowywane w pamięci pod adresem na który wskazuje dana stała.

Na tym etapie podobieństwa obiektów i symboli z grubsza się kończą.

Symbole z natury służą do utworzenia unikalnej wartości.

Nie są też konwertowane do ciągu znaków w sytuacjach wymuszających tego typu operację.

test[sym1] i test[sym2] zalogują do konsoli "Foo" i "Bar".

Co ważne, test[Symbol()] zwróci undefined, bo jak już wcześniej ustaliliśmy, każdy nowo utworzony symbol jest unikalny.

Jednocześnie własności zdefiniowane za pomocą symboli nie będą widoczne po zalogowania do konsoli obiektu test (będą prywatne).

Nazwy własności w test[obj1] i test[obj2] ulegną konwersji do ciągu znaków "[object Object]".

Istotne jest aby omyłkowo nie zinterpretować takiego zapisu jako tablicy z elementami object i Object.

"[object Object]" to zwykły ciąg znaków powstający w wyniku konwersji ({}).toString()

Ten sam ciąg znaków użyty dwukrotnie jako nazwa własności obiektu test powoduje, że każde kolejne jego użycie nadpisuje poprzednio zdefiniowaną własność o tej samej nazwie.

test[obj1] i test[obj2] logują do konsoli "Qux" bo taka wartość została przypisana jako ostatnia dla test["[object Object]"].

- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html index 6663eae23..21563a5d3 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #009

🪲 Znajdź buga

function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer)

console.log(sum)

Chcemy zsumować wszystkie elementy z tablicy numbers, jednocześnie zwiększając każdą z wartości tablicy o 1.

Jaka wartość zostanie zalogowana do konsoli jako sum?

🧪 Rozwiązanie

function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer, 0)

console.log(sum)

W przykładzie z błędem, wartość zwrócona z sum wyniesie 8 zamiast 9.

Działanie metody reduce() polega na zredukowaniu wielu wartości z tablicy (array) do jednej, zgodnie z zasadami zdefiniowanymi w funkcji callback, którą w naszym przykładzie nazwaliśmy reducer.

Pułapka myślowa w przykładzie, polega na tym, że możemy błędnie założyć, że reduce() wywoła funkcję reducer tyle razy, ile elementów zawiera tablica numbers.

W rzeczywistości jednak tak się nie dzieje.

Gdy do metody reduce(), oprócz funkcji callback, nie przekażemy drugiego argumentu, definiującego wartość początkową reduktora, to reduce() użyje jako wartości początkowej, pierwszej wartości z tablicy, pomijając tym samym pierwsze wywołanie callbacku.

reduce() ustawi więc wartość początkową na 1, a następnie wykona w pętli działania kumulujące dla kolejnych 2 elementów.

Można to zapisać w formie równania 1 + (2 + 1) + (3 + 1).

Aby naprawić ten problem, musimy w metodzie reduce() przekazać drugi argument, który będzie wartością początkową. W naszym przykładzie, gdy zależy nam na zsumowaniu wartości, powinniśmy przekazać tam po prostu 0.

Z wyraźnym ustawieniem wartości początkowej, będziemy mieli do czynienia z równaniem 0 + (1 + 1) + (2 + 1) + (3 + 1).

W takim przypadku funkcja reducer() zostanie wywołana trzykrotnie.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html index 61ba684dc..2ff1e47cc 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer)

console.log(sum)
- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html index 93dcd447f..86f226a53 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy zsumować wszystkie elementy z tablicy numbers, jednocześnie zwiększając każdą z wartości tablicy o 1.

Jaka wartość zostanie zalogowana do konsoli jako sum?

- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html index 4b3593d2e..3308f3fcc 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html index 1f560a1d5..c221032d5 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer, 0)

console.log(sum)
- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html index 0c8a10c7d..5f4e8e0cf 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, wartość zwrócona z sum wyniesie 8 zamiast 9.

Działanie metody reduce() polega na zredukowaniu wielu wartości z tablicy (array) do jednej, zgodnie z zasadami zdefiniowanymi w funkcji callback, którą w naszym przykładzie nazwaliśmy reducer.

Pułapka myślowa w przykładzie, polega na tym, że możemy błędnie założyć, że reduce() wywoła funkcję reducer tyle razy, ile elementów zawiera tablica numbers.

W rzeczywistości jednak tak się nie dzieje.

Gdy do metody reduce(), oprócz funkcji callback, nie przekażemy drugiego argumentu, definiującego wartość początkową reduktora, to reduce() użyje jako wartości początkowej, pierwszej wartości z tablicy, pomijając tym samym pierwsze wywołanie callbacku.

reduce() ustawi więc wartość początkową na 1, a następnie wykona w pętli działania kumulujące dla kolejnych 2 elementów.

Można to zapisać w formie równania 1 + (2 + 1) + (3 + 1).

Aby naprawić ten problem, musimy w metodzie reduce() przekazać drugi argument, który będzie wartością początkową. W naszym przykładzie, gdy zależy nam na zsumowaniu wartości, powinniśmy przekazać tam po prostu 0.

Z wyraźnym ustawieniem wartości początkowej, będziemy mieli do czynienia z równaniem 0 + (1 + 1) + (2 + 1) + (3 + 1).

W takim przypadku funkcja reducer() zostanie wywołana trzykrotnie.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html index 22d9e26d3..0e60b76d0 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #081

🪲 Znajdź buga

if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}

Czy któreś z instrukcji warunkowych zostaną wykonane i zalogują swoją wartość do konsoli?

🧪 Rozwiązanie

if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}

Instrukcja warunkowa if (new Boolean(false)) zostanie wykonana i do konsoli zostanie zalogowana wartość "Third".

Pozostałe instrukcje nie wykonają się.

if (false) powinno być oczywiste. Instrukcja nie wykonuje się, bo przekazany warunek jest fałszywy.

Funkcja Boolean zwraca wartość logiczną true lub false w zależności od przekazanego argumentu i jego ewentualnej konwersji na wartość logiczną, jeśli jest innego typu.

Boolean(false) zwraca wartość false więc tutaj mamy tą samą sytuację co w pierwszej instrukcji.

new Boolean(false) może wydawać się ekwiwalentem Boolean(false), ale użycie słowa kluczowego new powoduje utworzenie nowego obiektu, traktując funkcję Boolean() jako konstruktor obiektu,

new Boolean() zwraca więc obiekt, a nie wartość logiczną.

Obiekty z natury są wartościami prawdziwymi (nie ma znaczenia, że wprowadziliśmy do konstruktora wartość false), więc trzecia instrukcja warunkowa zostaje wykonana.

Czwarta i ostatnia instrukcja nie zostaje wykonana bo podwójny wykrzyknij działa tak samo, jak funkcja Boolean().

Z !false generowana jest wartość przeciwna true, a następnie z !true, wartość przeciwna, czyli false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html index 13b7154ed..d303c8edc 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html index 69ef16014..554a68f98 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy któreś z instrukcji warunkowych zostaną wykonane i zalogują swoją wartość do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html index 91918c956..9a04b29fb 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html index 8c8578393..8e9471814 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html index 816848e04..9f4d2cdfa 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Instrukcja warunkowa if (new Boolean(false)) zostanie wykonana i do konsoli zostanie zalogowana wartość "Third".

Pozostałe instrukcje nie wykonają się.

if (false) powinno być oczywiste. Instrukcja nie wykonuje się, bo przekazany warunek jest fałszywy.

Funkcja Boolean zwraca wartość logiczną true lub false w zależności od przekazanego argumentu i jego ewentualnej konwersji na wartość logiczną, jeśli jest innego typu.

Boolean(false) zwraca wartość false więc tutaj mamy tą samą sytuację co w pierwszej instrukcji.

new Boolean(false) może wydawać się ekwiwalentem Boolean(false), ale użycie słowa kluczowego new powoduje utworzenie nowego obiektu, traktując funkcję Boolean() jako konstruktor obiektu,

new Boolean() zwraca więc obiekt, a nie wartość logiczną.

Obiekty z natury są wartościami prawdziwymi (nie ma znaczenia, że wprowadziliśmy do konstruktora wartość false), więc trzecia instrukcja warunkowa zostaje wykonana.

Czwarta i ostatnia instrukcja nie zostaje wykonana bo podwójny wykrzyknij działa tak samo, jak funkcja Boolean().

Z !false generowana jest wartość przeciwna true, a następnie z !true, wartość przeciwna, czyli false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html index 30d0a6d2d..91cd893c8 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #067

🪲 Znajdź buga

console.log("".split(" "))
console.log("".split(""))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log("".split(" ")) // [""]
console.log("".split("")) // []

Metoda split() dzieli ciąg znaków formując tablicę z fragmentami ciągów znaków.

Podział zostaje wykonany na podstawie wartości rozdzielacza, przekazanego jako argument metody.

Przykładowo, "a b c".split(" "), podzieli ciąg znaków "a b c" używając białego znaku spacji jako rozdzielacza.

Uformowana zostanie tablica ["a", "b", "c"].

"".split(" ") zwraca tablicę z jednym elementem pustego ciągu znaków [""].

Mimo, że nie ma czego dzielić (pusty ciąg znaków), przekazanie rozdzielacza powoduje, że następuje podział, którego efektem jest pusty ciąg znaków.

W przypadku próby podziału pustego ciągu znaków, element rozdzielacza jest nieistotny, zawsze wygeneruje tablicę z jednym elementem pustego ciągi znaków.

"".split("?"), "".split("asd"), "".split("-"), bez znaczenia, zawsze zwróci [""].

Z kolei "".split("") to próba podzielenia pustego ciągu znaków za pomocą pustego znaku rozdzielacza.

Jest to jedyna sytuacja, w której w efekcie działania metody split(), zostaje zwrócona pusta tablica.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html index 7463de51b..f99158822 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("".split(" "))
console.log("".split(""))
- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html index 7ee42b30b..020d2e721 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html index 457634af1..0c16d48a0 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html index 71912c81e..2d435f037 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("".split(" ")) // [""]
console.log("".split("")) // []
- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html index f07ecf11b..0168600e0 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Metoda split() dzieli ciąg znaków formując tablicę z fragmentami ciągów znaków.

Podział zostaje wykonany na podstawie wartości rozdzielacza, przekazanego jako argument metody.

Przykładowo, "a b c".split(" "), podzieli ciąg znaków "a b c" używając białego znaku spacji jako rozdzielacza.

Uformowana zostanie tablica ["a", "b", "c"].

"".split(" ") zwraca tablicę z jednym elementem pustego ciągu znaków [""].

Mimo, że nie ma czego dzielić (pusty ciąg znaków), przekazanie rozdzielacza powoduje, że następuje podział, którego efektem jest pusty ciąg znaków.

W przypadku próby podziału pustego ciągu znaków, element rozdzielacza jest nieistotny, zawsze wygeneruje tablicę z jednym elementem pustego ciągi znaków.

"".split("?"), "".split("asd"), "".split("-"), bez znaczenia, zawsze zwróci [""].

Z kolei "".split("") to próba podzielenia pustego ciągu znaków za pomocą pustego znaku rozdzielacza.

Jest to jedyna sytuacja, w której w efekcie działania metody split(), zostaje zwrócona pusta tablica.

- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html index 48b8aa347..d3b3c7d55 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #089

🪲 Znajdź buga

function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
console.log(iterate(array).next().value)

Chcemy stworzyć generator, który przy wywołaniu będzie zwracał nam kolejne wartości z tablicy.

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

const numbersIterator = iterate(array)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)

W błędnym przykładzie wszystkie trzy wywołania zalogują do konsoli wartość 1.

Funkcja generatora (z gwiazdką *) zwraca obiekt generatora, który możemy iterować wywołując metodę next().

Wywołując funkcję iterate(array), zwrócony zostaje nowy obiekt generatora.

Wywołując wielokrotnie iterate(array).next() za każdym razem dostajemy nowy obiekt, więc wywoływanie na nim metody next() zawsze zwraca tylko pierwszą iterację z tablicy.

Aby to naprawić, musimy zwracany z funkcji obiekt generatora przypisać do stałej (lub zmiennej) i dopiero wtedy wywoływać metody next() na tym obiekcie.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html index 329428f64..7ea64157d 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html index 1e2a9770f..6e87f6783 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy stworzyć generator, który przy wywołaniu będzie zwracał nam kolejne wartości z tablicy.

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html index 45c9d296a..0945c57f0 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html index b46e41359..9d32069ef 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

const numbersIterator = iterate(array)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html index efafd1ec0..600c8acc4 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W błędnym przykładzie wszystkie trzy wywołania zalogują do konsoli wartość 1.

Funkcja generatora (z gwiazdką *) zwraca obiekt generatora, który możemy iterować wywołując metodę next().

Wywołując funkcję iterate(array), zwrócony zostaje nowy obiekt generatora.

Wywołując wielokrotnie iterate(array).next() za każdym razem dostajemy nowy obiekt, więc wywoływanie na nim metody next() zawsze zwraca tylko pierwszą iterację z tablicy.

Aby to naprawić, musimy zwracany z funkcji obiekt generatora przypisać do stałej (lub zmiennej) i dopiero wtedy wywoływać metody next() na tym obiekcie.

- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html index ec2a293be..56441fd3c 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #060

🪲 Znajdź buga

function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true))
console.log(js(false))
console.log(js(null))

console.log(js(NaN))
console.log(js(Infinity))

console.log(js([1, 2, 3]))
console.log(js(new Set([1, 2, 3])))

console.log(js(undefined))
console.log(js([undefined]))
console.log(js({ prop: undefined }))

console.log(js(() => "foo"))
console.log(js([() => "foo"]))
console.log(js({ prop: () => "foo" }))

console.log(js(Symbol("foo")))
console.log(js([Symbol("foo")]))
console.log(js({ prop: Symbol("foo") }))

Dla jakich typów danych nie możemy polegać na konwersji z użyciem JSON.stringify()?

Co zostanie zalogowane do konsoli w powyższych przykładach?

🧪 Rozwiązanie

function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true)) // true
console.log(js(false)) // false
console.log(js(null)) // null

console.log(js(NaN)) // null
console.log(js(Infinity)) // null

console.log(js([1, 2, 3])) // [1,2,3]
console.log(js(new Set([1, 2, 3]))) // {}

console.log(js(undefined)) // undefined
console.log(js([undefined])) // [null]
console.log(js({ prop: undefined })) // {}

console.log(js(() => "foo")) // undefined
console.log(js([() => "foo"])) // [null]
console.log(js({ prop: () => "foo" })) // {}

console.log(js(Symbol("foo"))) // undefined
console.log(js([Symbol("foo")])) // [null]
console.log(js({ prop: Symbol("foo") })) // {}

Do formatu JSON możemy skonwertować jedynie niektóre typy danych.

Ciągi znaków i wartości liczbowe nie stanowią problemu.

Podobnie wartości logiczne, true/false.

Wartość null również zostanie poprawnie skonwertowana.

Do nulla skonwertowane zostaną także wartości NaN i Infinity.

Tablice [] zostaną poprawnie skonwertowane do formatu JSON, ale kolekcje Map i Set zostaną skonwertowane do pustego obiektu {}.

Funkcje, symbole oraz wartość undefined, konwertują się różnie, w zależności od kontekstu wystąpienia.

Samodzielne wystąpienia zamieniane są na undefined. Jako elementy tablicy, stają się nullem, a jako elementy obiektu, zostają pominięte.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html index 48f481bfe..9c9065787 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true))
console.log(js(false))
console.log(js(null))

console.log(js(NaN))
console.log(js(Infinity))

console.log(js([1, 2, 3]))
console.log(js(new Set([1, 2, 3])))

console.log(js(undefined))
console.log(js([undefined]))
console.log(js({ prop: undefined }))

console.log(js(() => "foo"))
console.log(js([() => "foo"]))
console.log(js({ prop: () => "foo" }))

console.log(js(Symbol("foo")))
console.log(js([Symbol("foo")]))
console.log(js({ prop: Symbol("foo") }))
- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html index 5fac72c3b..0a2756d7e 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Dla jakich typów danych nie możemy polegać na konwersji z użyciem JSON.stringify()?

Co zostanie zalogowane do konsoli w powyższych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html index 509ec0669..78e217dcb 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html index fe161ac88..1170eb496 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true)) // true
console.log(js(false)) // false
console.log(js(null)) // null

console.log(js(NaN)) // null
console.log(js(Infinity)) // null

console.log(js([1, 2, 3])) // [1,2,3]
console.log(js(new Set([1, 2, 3]))) // {}

console.log(js(undefined)) // undefined
console.log(js([undefined])) // [null]
console.log(js({ prop: undefined })) // {}

console.log(js(() => "foo")) // undefined
console.log(js([() => "foo"])) // [null]
console.log(js({ prop: () => "foo" })) // {}

console.log(js(Symbol("foo"))) // undefined
console.log(js([Symbol("foo")])) // [null]
console.log(js({ prop: Symbol("foo") })) // {}
- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html index 8f8bb840a..eb55d173e 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Do formatu JSON możemy skonwertować jedynie niektóre typy danych.

Ciągi znaków i wartości liczbowe nie stanowią problemu.

Podobnie wartości logiczne, true/false.

Wartość null również zostanie poprawnie skonwertowana.

Do nulla skonwertowane zostaną także wartości NaN i Infinity.

Tablice [] zostaną poprawnie skonwertowane do formatu JSON, ale kolekcje Map i Set zostaną skonwertowane do pustego obiektu {}.

Funkcje, symbole oraz wartość undefined, konwertują się różnie, w zależności od kontekstu wystąpienia.

Samodzielne wystąpienia zamieniane są na undefined. Jako elementy tablicy, stają się nullem, a jako elementy obiektu, zostają pominięte.

- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html index eb0a6451b..49c511d2c 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #013

🪲 Znajdź buga

document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.map((li) => {
const updatedText =
li
.innerText
.replace("Item", "Element")

li.innerText = updatedText
})

W dokumencie mamy listę <ul> z elementami <li>. Chcemy zaktualizować tekst w tych elementach, zamieniając wyrazy Item na Element.

Gdzie w przedstawionym przykładzie wkradł się błąd?

🧪 Rozwiązanie

document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.forEach((li) => {
const updatedText = li.innerText.replace("Item", "Element")

li.innerText = updatedText
})

Próbując wykonać kod z przykładu z błędem, ujrzymy w konsoli Error: lis.map is not a function.

Do stałej lis chcieliśmy przypisać listę z elementami li i do tego momentu kod wykonywany jest poprawnie.

Jednak document.querySelector() nie tworzy kolekcji w formie Array, a jako NodeList.

Obiekt NodeList w przeciwieństwie do obiektu Array nie zawiera metody map, więc wyrzucany jest błąd.

NodeList zawiera jednak metodę forEach, której możemy użyć zamiast map.

Użycie map było tutaj bezzasadne. Nie potrzebujemy wygenerować nowej tablicy z elementami na podstawie istniejącej.

Jeśli jednak mielibyśmy faktyczną potrzebę użycia map na obiekcie NodeList to musimy go skonwertować do Array, najprościej za pomocą konstrukcji Array.from(lis).

Po takiej konwersji, lista węzłów (node'ów) będzie już obiektem Array razem ze wszystkimi dostępnymi w tym obiekcie metodami (jak np. map).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html index b52f725ef..e464cf1ae 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.map((li) => {
const updatedText =
li
.innerText
.replace("Item", "Element")

li.innerText = updatedText
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html index ab3f5bd34..9832da616 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W dokumencie mamy listę <ul> z elementami <li>. Chcemy zaktualizować tekst w tych elementach, zamieniając wyrazy Item na Element.

Gdzie w przedstawionym przykładzie wkradł się błąd?

- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html index a3575d419..0e7aec804 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html index a234ec9ba..93473adcf 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.forEach((li) => {
const updatedText = li.innerText.replace("Item", "Element")

li.innerText = updatedText
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html index cb1b07649..a1d3cf196 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Próbując wykonać kod z przykładu z błędem, ujrzymy w konsoli Error: lis.map is not a function.

Do stałej lis chcieliśmy przypisać listę z elementami li i do tego momentu kod wykonywany jest poprawnie.

Jednak document.querySelector() nie tworzy kolekcji w formie Array, a jako NodeList.

Obiekt NodeList w przeciwieństwie do obiektu Array nie zawiera metody map, więc wyrzucany jest błąd.

NodeList zawiera jednak metodę forEach, której możemy użyć zamiast map.

Użycie map było tutaj bezzasadne. Nie potrzebujemy wygenerować nowej tablicy z elementami na podstawie istniejącej.

Jeśli jednak mielibyśmy faktyczną potrzebę użycia map na obiekcie NodeList to musimy go skonwertować do Array, najprościej za pomocą konstrukcji Array.from(lis).

Po takiej konwersji, lista węzłów (node'ów) będzie już obiektem Array razem ze wszystkimi dostępnymi w tym obiekcie metodami (jak np. map).

- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html index d663c9268..41a5864f7 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #086

🪲 Znajdź buga

console.log(/^[A-z]+$/.test("ABCD"))
console.log(/^[A-z]+$/.test("wxyz"))
console.log(/^[A-z]+$/.test("QwEr"))
console.log(/^[A-z]+$/.test("\\[]"))
console.log(/^[A-z]+$/.test("^_``"))
console.log(/^[A-z]+$/.test("1234"))
console.log(/^[A-z]+$/.test("a1b2"))
console.log(/^[A-z]+$/.test("\nnn"))
console.log(/^[A-z]+$/.test("a b "))

Chcemy przetestować różne ciągi znaków za pomocą wyrażenia regularnego ^[A-z]+$.

^ oznacza początek ciągu znaków.

[A-z] oznacza dowolny znak z zakresu od A do z.

+ oznacza jeden lub więcej znaków.

$ oznacza koniec ciągu znaków.

Metoda test() wykonana na wyrażeniu regularnym zwraca wartość logiczną true/false w zależności od tego czy przekazany w argumencie ciąg znaków jest zgodny z wyrażeniem regularnym.

Jakie wartości zostaną zalogowane do konsoli dla przykładowych testów?

🧪 Rozwiązanie

console.log(/^[A-z]+$/.test("ABCD")) // true
console.log(/^[A-z]+$/.test("wxyz")) // true
console.log(/^[A-z]+$/.test("QwEr")) // true
console.log(/^[A-z]+$/.test("\\[]")) // true
console.log(/^[A-z]+$/.test("^_``")) // true
console.log(/^[A-z]+$/.test("1234")) // false
console.log(/^[A-z]+$/.test("a1b2")) // false
console.log(/^[A-z]+$/.test("\nnn")) // false
console.log(/^[A-z]+$/.test("a b ")) // false

Wartości false zostają zwracane dla ciągów znaków, w których występują liczby, ponieważ zakres od A do z nie zawiera liczb.

Białe znaki jak spacje czy przejścia do nowej linii (\n) również nie wchodzą w skład zakresu z wyrażenia regularnego, więc ich obecność w ciągu znaków również poskutkuje zwróceniem wartości false.

Ciągi znaków składające się wyłącznie ze znaków z zakresu od A do z zwracają true.

Duża niespodzianka czeka na nas gdy w ciągu znaków pojawią się znaki\ [ \ ] ^ _ `

Okazuje się, że są one również elementem zakresu [A-z] w wyrażeniach regularnych.

Tablica kodowania znaków Unicode plasuje te znaki dokładnie pomiędzy zakresem [A-Z] a [a-z].

Tworząc więc wyrażenie regularne dla zakresu znaków [A-z] niejawnie szukamy też znaków [ \ ] ^ _ `.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html index b948a5542..d3fb75941 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(/^[A-z]+$/.test("ABCD"))
console.log(/^[A-z]+$/.test("wxyz"))
console.log(/^[A-z]+$/.test("QwEr"))
console.log(/^[A-z]+$/.test("\\[]"))
console.log(/^[A-z]+$/.test("^_``"))
console.log(/^[A-z]+$/.test("1234"))
console.log(/^[A-z]+$/.test("a1b2"))
console.log(/^[A-z]+$/.test("\nnn"))
console.log(/^[A-z]+$/.test("a b "))
- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html index c6b74b34e..f78d1b78a 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy przetestować różne ciągi znaków za pomocą wyrażenia regularnego ^[A-z]+$.

^ oznacza początek ciągu znaków.

[A-z] oznacza dowolny znak z zakresu od A do z.

+ oznacza jeden lub więcej znaków.

$ oznacza koniec ciągu znaków.

Metoda test() wykonana na wyrażeniu regularnym zwraca wartość logiczną true/false w zależności od tego czy przekazany w argumencie ciąg znaków jest zgodny z wyrażeniem regularnym.

Jakie wartości zostaną zalogowane do konsoli dla przykładowych testów?

- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html index 0f23e5160..628be06af 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html index 74fa4da64..e708e4690 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(/^[A-z]+$/.test("ABCD")) // true
console.log(/^[A-z]+$/.test("wxyz")) // true
console.log(/^[A-z]+$/.test("QwEr")) // true
console.log(/^[A-z]+$/.test("\\[]")) // true
console.log(/^[A-z]+$/.test("^_``")) // true
console.log(/^[A-z]+$/.test("1234")) // false
console.log(/^[A-z]+$/.test("a1b2")) // false
console.log(/^[A-z]+$/.test("\nnn")) // false
console.log(/^[A-z]+$/.test("a b ")) // false
- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html index 33532ea0c..726ff4196 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Wartości false zostają zwracane dla ciągów znaków, w których występują liczby, ponieważ zakres od A do z nie zawiera liczb.

Białe znaki jak spacje czy przejścia do nowej linii (\n) również nie wchodzą w skład zakresu z wyrażenia regularnego, więc ich obecność w ciągu znaków również poskutkuje zwróceniem wartości false.

Ciągi znaków składające się wyłącznie ze znaków z zakresu od A do z zwracają true.

Duża niespodzianka czeka na nas gdy w ciągu znaków pojawią się znaki\ [ \ ] ^ _ `

Okazuje się, że są one również elementem zakresu [A-z] w wyrażeniach regularnych.

Tablica kodowania znaków Unicode plasuje te znaki dokładnie pomiędzy zakresem [A-Z] a [a-z].

Tworząc więc wyrażenie regularne dla zakresu znaków [A-z] niejawnie szukamy też znaków [ \ ] ^ _ `.

- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html index 99a6c7faf..03666e8b3 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #036

🪲 Znajdź buga

async function getData() {
const url =
"https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = getData()
console.log(data)
}

processData()

Czy dane zostaną poprawnie pobrane z API i przetworzone?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

async function getData() {
const url = "https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = await getData()
console.log(data)
}

processData()

W błędnym przykładzie do konsoli zostanie zalogowany obiekt Promise.

Nie mamy w nim dostępu do danych, bo obietnica nie została wypełniona.

Aby rozwiązać ten problem musimy dodać brakujące słowo kluczowe await przed wywołaniem getData().

Moglibyśmy się też dostać do pobranych danych poprzez wywołanie metody then() na obiekcie Promise.

getData().then(resp => console.log(resp)) zwróciłoby nam dane, ale nie zostałyby one przypisane do stałej data.

Poprzez użycie konstrukcji await getData(), wykonywanie kodu zaczeka na pobranie danych i przypisze je do stałej data. Dzięki temu będziemy je mogli przetworzyć w dalszej części funkcji np. logując je do konsoli.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html index fa392e281..47c283a6d 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
async function getData() {
const url =
"https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = getData()
console.log(data)
}

processData()
- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html index 461c03585..bba738525 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy dane zostaną poprawnie pobrane z API i przetworzone?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html index b1a75ec1f..e8547d5f2 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html index a9e2ef5b3..3fb30984b 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
async function getData() {
const url = "https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = await getData()
console.log(data)
}

processData()
- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html index b407ba612..0f9929f95 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W błędnym przykładzie do konsoli zostanie zalogowany obiekt Promise.

Nie mamy w nim dostępu do danych, bo obietnica nie została wypełniona.

Aby rozwiązać ten problem musimy dodać brakujące słowo kluczowe await przed wywołaniem getData().

Moglibyśmy się też dostać do pobranych danych poprzez wywołanie metody then() na obiekcie Promise.

getData().then(resp => console.log(resp)) zwróciłoby nam dane, ale nie zostałyby one przypisane do stałej data.

Poprzez użycie konstrukcji await getData(), wykonywanie kodu zaczeka na pobranie danych i przypisze je do stałej data. Dzięki temu będziemy je mogli przetworzyć w dalszej części funkcji np. logując je do konsoli.

- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html index aefcd5496..9588e0d5f 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #027

🪲 Znajdź buga

if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()

Czy wywołanie funkcji w powyższym kodzie zadziała poprawnie?

Czy nie zmieniając logiki kodu, można wymusić zmianę jego działania?

🧪 Rozwiązanie

"use strict"

if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()

W przykładzie z błędem, w konsoli zalogowana zostanie wartość 1 jako efekt wywołania funkcji getFirst().

Zostanie zalogowany też błąd, getSecond is not a function.

Błąd ten mówi nam, że nazwa getSecond jest dostępna w miejscu jej wywołania, nie jest jednak typem funkcji.

Dostępność nazwy getSecond jest efektem podnoszenia (hoisting) deklaracji funkcji na początek wykonywanego kodu.

W naszym przykładzie getSecond jest jednak deklarowane warunkowo.

Interpreter JavaScript podnosi nazwę zadeklarowanej funkcji na początek wykonywanego kodu, ale nie przypisuje jej konkretnej wartości. Nazwa getSecond jest więc zdefiniowana jako undefined, ponieważ nie zostaje spełniony warunek w instrukcji warunkowej if.

Tego typu sposób interpretowania kodu jest mylący i może prowadzić do powstawania błędów. Aby tego uniknąć, możemy aktywować tryb ścisły.

Możemy to zrobić np. poprzez wywołanie "use strict".

W trybie ścisłym, kod z naszego przykładu będzie interpretowany inaczej.

Deklaracje funkcji zostaną podniesione tylko na początek bloku, w którym zostały zdefiniowane.

Zagnieżdżając więc deklaracje funkcji wewnątrz bloku instrukcji warunkowej, pętli, lub innej funkcji, zadeklarowana w ten sposób funkcja nie będzie dostępna na zewnątrz bloku, który ograniczają nawiasy klamrowe {}.

Po aktywowaniu trybu ścisłego, w konsoli zalogowany zostanie błąd getFirst is not defined. Oznacza to, że dla interpretera JavaScript, funkcje getFirst i getSecond są niezdefiniowane w globalnym zakresie, w których są wywoływane.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html index cdf870986..3f8354261 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()
- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html index 732edc971..2abed1c07 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy wywołanie funkcji w powyższym kodzie zadziała poprawnie?

Czy nie zmieniając logiki kodu, można wymusić zmianę jego działania?

- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html index 89b72f861..2934da87c 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html index 23e4df85f..765b3d387 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
"use strict"

if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()
- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html index 84dfe32ff..0b885a6b7 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli zalogowana zostanie wartość 1 jako efekt wywołania funkcji getFirst().

Zostanie zalogowany też błąd, getSecond is not a function.

Błąd ten mówi nam, że nazwa getSecond jest dostępna w miejscu jej wywołania, nie jest jednak typem funkcji.

Dostępność nazwy getSecond jest efektem podnoszenia (hoisting) deklaracji funkcji na początek wykonywanego kodu.

W naszym przykładzie getSecond jest jednak deklarowane warunkowo.

Interpreter JavaScript podnosi nazwę zadeklarowanej funkcji na początek wykonywanego kodu, ale nie przypisuje jej konkretnej wartości. Nazwa getSecond jest więc zdefiniowana jako undefined, ponieważ nie zostaje spełniony warunek w instrukcji warunkowej if.

Tego typu sposób interpretowania kodu jest mylący i może prowadzić do powstawania błędów. Aby tego uniknąć, możemy aktywować tryb ścisły.

Możemy to zrobić np. poprzez wywołanie "use strict".

W trybie ścisłym, kod z naszego przykładu będzie interpretowany inaczej.

Deklaracje funkcji zostaną podniesione tylko na początek bloku, w którym zostały zdefiniowane.

Zagnieżdżając więc deklaracje funkcji wewnątrz bloku instrukcji warunkowej, pętli, lub innej funkcji, zadeklarowana w ten sposób funkcja nie będzie dostępna na zewnątrz bloku, który ograniczają nawiasy klamrowe {}.

Po aktywowaniu trybu ścisłego, w konsoli zalogowany zostanie błąd getFirst is not defined. Oznacza to, że dla interpretera JavaScript, funkcje getFirst i getSecond są niezdefiniowane w globalnym zakresie, w których są wywoływane.

- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html index e7779ed43..bc11e2911 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #043

🪲 Znajdź buga

const object = {}
object?.property = "value";

console.log(object)

Chcemy dodać własność do obiektu. Zależy nam jednak na obsłużeniu sytuacji, w której obiekt jest niezdefiniowany, lub zamiast obiektu, zwracana jest wartość null.

Jak zadziała powyższy kod? Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

const object = {}
if (object) {
object.property = "value"
}

console.log(object)

Operator opcjonalnego łańcuchowania ?. działa poprawnie przy odczycie własności obiektów.

W przykładzie z błędem użyliśmy go do przypisania wartości, a w takim kontekście nie może on zostać użyty. Konsola zaloguje więc błąd Invalid left-hand side in assignment.

Operacja przypisania nie zostanie zrealizowana ze względu na błąd składniowy po lewej stronie operatora przypisania =.

Używanie ?. zapobiega wystąpieniu błędu krytycznego Cannot read properties of undefined w sytuacji gdy obiekt, z którego chcemy odczytać wartość jest niezdefiniowany lub jest nullem.

Gdy chcemy przypisać własność do obiektu, ale nie jesteśmy pewni czy obiekt istnieje, rozsądnie będzie użyć instrukcji warunkowej if.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html index 01f1b0a6b..a640bb6b7 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const object = {}
object?.property = "value";

console.log(object)
- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html index 5044e1f06..bae2d53fb 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy dodać własność do obiektu. Zależy nam jednak na obsłużeniu sytuacji, w której obiekt jest niezdefiniowany, lub zamiast obiektu, zwracana jest wartość null.

Jak zadziała powyższy kod? Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html index d093e2c7a..fa2119ab7 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html index 42cce56d6..084bb068a 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const object = {}
if (object) {
object.property = "value"
}

console.log(object)
- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html index 81384c5f1..33b5683ae 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Operator opcjonalnego łańcuchowania ?. działa poprawnie przy odczycie własności obiektów.

W przykładzie z błędem użyliśmy go do przypisania wartości, a w takim kontekście nie może on zostać użyty. Konsola zaloguje więc błąd Invalid left-hand side in assignment.

Operacja przypisania nie zostanie zrealizowana ze względu na błąd składniowy po lewej stronie operatora przypisania =.

Używanie ?. zapobiega wystąpieniu błędu krytycznego Cannot read properties of undefined w sytuacji gdy obiekt, z którego chcemy odczytać wartość jest niezdefiniowany lub jest nullem.

Gdy chcemy przypisać własność do obiektu, ale nie jesteśmy pewni czy obiekt istnieje, rozsądnie będzie użyć instrukcji warunkowej if.

- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html index b20372308..594c0cd80 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #066

🪲 Znajdź buga

console.log("A" || alert("B") && alert("C"))

Co zostanie zalogowane do konsoli?

Czy funkcje alert() zostaną wykonane?

🧪 Rozwiązanie

console.log("A" || alert("B") && alert("C")) // A

Do konsoli zostanie zalogowany wyłącznie ciąg znaków A.

Bug polega na założeniu, że funkcja alert("B") powinna zostać wykonana, jako efekt pierwszeństwa działania operatora &&.

Tak się jednak nie stanie. Poniżej wyjaśnienie dlaczego.

Tablica pierwszeństwa wykonywania operatorów plasuje operator logiczny AND && ponad operatorem OR ||.

Analogicznie, w przypadku operatorów arytmetycznych, operator mnożenia * plasuje się ponad operatorem dodawania +.

Wykonując działanie 1 + 2 * 3 otrzymamy więc 7 a nie 9.

Najpierw zostanie wykonane mnożenie operandów 2 i 3. Dopiero później dodawanie 1 z otrzymaną wartością 6 z mnożenia.

Wykonane jest tutaj bardzo istotnym słowem.

Skoro operator && ma wyższy priorytet wykonywania od operatora ||, można oczekiwać od JavaScript, że wykona funkcje, które są operandami && aby poznać zwracane z nich wartości w celu ewaluacji operacji logicznej AND.

Tak się jednak nie dzieje. JavaScript nie wykonuje operacji logicznej AND ze względu na efekt zwarcia operatora OR.

Zwarcie (short circuiting) polega na tym, że jeśli pierwszy z operandów użytych z operatorami || lub && zwraca wartość, która przesądza o końcowej wartości, drugi operand nie jest już w ogóle sprawdzany (ani wykonywany).

W naszym przykładzie dla || drugim operandem byłby efekt działania operatora && czyli (alert("B") && alert("C")).

Nie ma on jednak żadnego znaczenia, ponieważ algorytm OR dąży w pierwszej kolejności do zwrócenia wartości pierwszego operandu, jeśli ta wartość jest prawdziwa.

W sytuacji gdy pierwsza wartość okaże się fałszywa, wtedy, i tylko wtedy, sprawdzany (wykonywany) jest drugi operand i zwracana jest jego (niezależnie jaka) wartość.

Odwrotnie jest w przypadku algorytmu operatora AND, który w pierwszej kolejności dąży do zwrócenia wartości fałszywej z pierwszego operandu, a tylko wtedy, gdy ta wartość okaże się prawdziwa, zostanie sprawdzony (wykonany) drugi operand oraz zwrócona zostanie z niego (niezależnie jaka) wartość.

"A" || alert("B") && alert("C") mimo, że według kolejności wykonywania operatorów, powinien sprawdzić najpierw co zwrócą operandy operatora &&, w rzeczywistości ignoruje je, ponieważ pierwszy operand operatora || jest prawdziwy.

Niezależnie więc od tego co zwróciłyby funkcje alert("B") i alert("C"), końcowy wynik operacji logicznej zawsze wyniesie A.

Efekt zwarcia występuje w operatorach &&, ||, ??, ?., ale nie występuje w pozostałych.

W przypadku wspomnianych działań matematycznych, nawet jeśli wynik jest przesądzony przez pierwszy operand (np. w mnożeniu 0 lub NaN z innymi liczbami), to pozostałe operandy i tak zostaną wykonane.

Taka tam lekka niekonsekwencja 🤷‍♂️.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html index 25206becb..f80d34198 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("A" || alert("B") && alert("C"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html index e325f45f9..455b7239a 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli?

Czy funkcje alert() zostaną wykonane?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html index 080bcc07e..0cb5fdeb3 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html index fe976693e..3c8cd0bd3 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("A" || alert("B") && alert("C")) // A
- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html index f16851679..dd860dbab 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Do konsoli zostanie zalogowany wyłącznie ciąg znaków A.

Bug polega na założeniu, że funkcja alert("B") powinna zostać wykonana, jako efekt pierwszeństwa działania operatora &&.

Tak się jednak nie stanie. Poniżej wyjaśnienie dlaczego.

Tablica pierwszeństwa wykonywania operatorów plasuje operator logiczny AND && ponad operatorem OR ||.

Analogicznie, w przypadku operatorów arytmetycznych, operator mnożenia * plasuje się ponad operatorem dodawania +.

Wykonując działanie 1 + 2 * 3 otrzymamy więc 7 a nie 9.

Najpierw zostanie wykonane mnożenie operandów 2 i 3. Dopiero później dodawanie 1 z otrzymaną wartością 6 z mnożenia.

Wykonane jest tutaj bardzo istotnym słowem.

Skoro operator && ma wyższy priorytet wykonywania od operatora ||, można oczekiwać od JavaScript, że wykona funkcje, które są operandami && aby poznać zwracane z nich wartości w celu ewaluacji operacji logicznej AND.

Tak się jednak nie dzieje. JavaScript nie wykonuje operacji logicznej AND ze względu na efekt zwarcia operatora OR.

Zwarcie (short circuiting) polega na tym, że jeśli pierwszy z operandów użytych z operatorami || lub && zwraca wartość, która przesądza o końcowej wartości, drugi operand nie jest już w ogóle sprawdzany (ani wykonywany).

W naszym przykładzie dla || drugim operandem byłby efekt działania operatora && czyli (alert("B") && alert("C")).

Nie ma on jednak żadnego znaczenia, ponieważ algorytm OR dąży w pierwszej kolejności do zwrócenia wartości pierwszego operandu, jeśli ta wartość jest prawdziwa.

W sytuacji gdy pierwsza wartość okaże się fałszywa, wtedy, i tylko wtedy, sprawdzany (wykonywany) jest drugi operand i zwracana jest jego (niezależnie jaka) wartość.

Odwrotnie jest w przypadku algorytmu operatora AND, który w pierwszej kolejności dąży do zwrócenia wartości fałszywej z pierwszego operandu, a tylko wtedy, gdy ta wartość okaże się prawdziwa, zostanie sprawdzony (wykonany) drugi operand oraz zwrócona zostanie z niego (niezależnie jaka) wartość.

"A" || alert("B") && alert("C") mimo, że według kolejności wykonywania operatorów, powinien sprawdzić najpierw co zwrócą operandy operatora &&, w rzeczywistości ignoruje je, ponieważ pierwszy operand operatora || jest prawdziwy.

Niezależnie więc od tego co zwróciłyby funkcje alert("B") i alert("C"), końcowy wynik operacji logicznej zawsze wyniesie A.

Efekt zwarcia występuje w operatorach &&, ||, ??, ?., ale nie występuje w pozostałych.

W przypadku wspomnianych działań matematycznych, nawet jeśli wynik jest przesądzony przez pierwszy operand (np. w mnożeniu 0 lub NaN z innymi liczbami), to pozostałe operandy i tak zostaną wykonane.

Taka tam lekka niekonsekwencja 🤷‍♂️.

- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html index 4bfc1a607..2af2f3298 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #046

🪲 Znajdź buga

const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj))
console.log("".concat(myObj))
console.log("" + myObj)
console.log(`${myObj}`)

Chcemy dokonać konwersji obiektu na ciąg znaków.

Co zalogują do konsoli zaproponowane sposoby?

🧪 Rozwiązanie

const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj)) // orange
console.log("".concat(myObj)) // orange
console.log("" + myObj) // apple
console.log(`${myObj}`) // orange

Wszystkie sposoby, oprócz "" + myObj, zwrócą wartość orange.

Operator +, jeśli zostanie użyty na typach danych, z których choć jeden jest różny niż number, działa jako operator łączenia ciągów znaków.

"" + myObj jest więc operacją łączenia ciągów znaków za pomocą operatora +, czyli de facto konwersją myObj na ciąg znaków.

Okazuje się jednak, że algorytm konwersji danych na ciąg znaków, który stosuje operator +, różni się od pozostałych sposobów.

Operator + dokonując konwersji danych na ciąg znaków, zamiast wywołać metodę toString() na obiekcie, który konwertuje, w pierwszej kolejności wywołuje na nim metodę valueOf().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html index 082a70f15..2df223ab8 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj))
console.log("".concat(myObj))
console.log("" + myObj)
console.log(`${myObj}`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html index 20af18566..1491a2f57 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy dokonać konwersji obiektu na ciąg znaków.

Co zalogują do konsoli zaproponowane sposoby?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html index f303dfa7f..31784404a 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html index 29ed69421..6c40b9ced 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj)) // orange
console.log("".concat(myObj)) // orange
console.log("" + myObj) // apple
console.log(`${myObj}`) // orange
- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html index 71af07e24..2aad33b1c 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wszystkie sposoby, oprócz "" + myObj, zwrócą wartość orange.

Operator +, jeśli zostanie użyty na typach danych, z których choć jeden jest różny niż number, działa jako operator łączenia ciągów znaków.

"" + myObj jest więc operacją łączenia ciągów znaków za pomocą operatora +, czyli de facto konwersją myObj na ciąg znaków.

Okazuje się jednak, że algorytm konwersji danych na ciąg znaków, który stosuje operator +, różni się od pozostałych sposobów.

Operator + dokonując konwersji danych na ciąg znaków, zamiast wywołać metodę toString() na obiekcie, który konwertuje, w pierwszej kolejności wywołuje na nim metodę valueOf().

- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html index 35ea022e7..3d79804ab 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #093

🪲 Znajdź buga

let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length)
console.log(arr2.length)
console.log(arr3.length)

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length) // 5
console.log(arr2.length) // 5
console.log(arr3.length) // 5

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i)) // 0 2 4

Rozsiane tablice (sparse arrays) to takie, które zawierają puste miejsca (slot'y).

Tablice rezerwują w pamięci miejsce na dane, ale żadnych danych w tych miejscach nie przechowują.

Nie są to wartości undefined czy null. To dosłownie puste miejsca.

Sprawdzenie własności length na takiej rozsianej tablicy zwróci całkowitą liczbę miejsc, które tablica rezerwuje w pamięci.

Wszystkie trzy tablice arr1, arr2, arr3, zwracają wartość length równą 5.

Wywołanie metody forEach() na tych tablicach nie iteruje jednak pustych miejsc.

Dla tablic arr1 i arr2 nie zostaną zwrócone żadne indeksy i z takich iteracji.

Tablica arr3 ma 3 elementy zajęte i 2 puste.

Zgłoszą się tylko zajęte elementy, logując do konsoli indeksy 0, 2, 4.

JavaScript zachowuje się tutaj niespójnie. Część metod pomija puste miejsca, np. forEach(), map(), sort(), ale część traktuje puste miejsca jako wartość undefined, np. entries(), fill(), find().

Przykładowo arr1.find((e, i) => console.log(i))\ zwróciłoby 0, 1, 2, 3, 4.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html index bbf1452eb..893e27449 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length)
console.log(arr2.length)
console.log(arr3.length)

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i))
- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html index e21860494..e1477059d 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html index 1efd2b050..4a37d54a5 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html index c4d467b71..68e7926cd 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length) // 5
console.log(arr2.length) // 5
console.log(arr3.length) // 5

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i)) // 0 2 4
- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html index 85c79b20f..c7d75aef3 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Rozsiane tablice (sparse arrays) to takie, które zawierają puste miejsca (slot'y).

Tablice rezerwują w pamięci miejsce na dane, ale żadnych danych w tych miejscach nie przechowują.

Nie są to wartości undefined czy null. To dosłownie puste miejsca.

Sprawdzenie własności length na takiej rozsianej tablicy zwróci całkowitą liczbę miejsc, które tablica rezerwuje w pamięci.

Wszystkie trzy tablice arr1, arr2, arr3, zwracają wartość length równą 5.

Wywołanie metody forEach() na tych tablicach nie iteruje jednak pustych miejsc.

Dla tablic arr1 i arr2 nie zostaną zwrócone żadne indeksy i z takich iteracji.

Tablica arr3 ma 3 elementy zajęte i 2 puste.

Zgłoszą się tylko zajęte elementy, logując do konsoli indeksy 0, 2, 4.

JavaScript zachowuje się tutaj niespójnie. Część metod pomija puste miejsca, np. forEach(), map(), sort(), ale część traktuje puste miejsca jako wartość undefined, np. entries(), fill(), find().

Przykładowo arr1.find((e, i) => console.log(i))\ zwróciłoby 0, 1, 2, 3, 4.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html index 71a4125eb..570027109 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #083

🪲 Znajdź buga

console.log(typeof NaN)

console.log(isNaN("foo"))
console.log(Number.isNaN("foo"))

console.log(isNaN(() => {}))
console.log(Number.isNaN(() => {}))

console.log(isNaN({}))
console.log(Number.isNaN({}))

console.log(isNaN([1, 2]))
console.log(Number.isNaN([1, 2]))

console.log(isNaN(undefined))
console.log(Number.isNaN(undefined))

console.log(isNaN(NaN))
console.log(isNaN("NaN"))

console.log(isNaN(123))
console.log(isNaN("123"))
console.log(isNaN([]))
console.log(isNaN(true))
console.log(isNaN(false))
console.log(isNaN(null))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(typeof NaN) // number

console.log(isNaN("foo")) // true
console.log(Number.isNaN("foo")) // false

console.log(isNaN(() => {})) // true
console.log(Number.isNaN(() => {})) // false

console.log(isNaN({})) // true
console.log(Number.isNaN({})) // false

console.log(isNaN([1, 2])) // true
console.log(Number.isNaN([1, 2])) // false

console.log(isNaN(undefined)) // true
console.log(Number.isNaN(undefined)) // false

console.log(isNaN(NaN)) // true
console.log(isNaN("NaN")) // true

console.log(isNaN(123)) // false
console.log(isNaN("123")) // false (?)
console.log(isNaN([])) // false (?!)
console.log(isNaN(true)) // false (?!)
console.log(isNaN(false)) // false (?!)
console.log(isNaN(null)) // false (?!)

Po pierwsze isNaN() i Number.isNaN() nie są ze sobą zgodne 🤯.

Teoretycznie założeniem isNaN() jest sprawdzenie czy wartość przekazana w argumencie nie jest wartością liczbową.

W praktyce isNaN() sprawdza jednak czy wartość z argumentu jest ekwiwalentna wartości NaN po konwersji do wartości liczbowej.

Co więcej, dokumentacja Mozilli zachęca do korzystania z Number.isNaN() jako bardziej niezawodnego odpowiednika.

Tak, isNan() i Number.isNaN() potrafią zwracać różną wartość dla tego samego argumentu wejściowego.

Mimo deklarowanej większej niezawodności, Number.isNaN() wciąż jest bardzo nieintuicyjną metodą w celu sprawdzania, czy wartość wejściowa nie jest wartością liczbową.

Dla uzyskania niezawodności i intuicyjności najlepiej skorzystać z porównania typeof x === "number".

Mamy wtedy pewność, że dostaniemy true tylko wtedy, gdy x będzie typu liczbowego.

Pułapką może okazać się wtedy typeof NaN === "number", który zwróci true, ponieważ typ wartości NaN to... number.

Największe (moim zdaniem) pułapki w kwesti isNaN() i Number.isNaN() (gdy są ze sobą zgodne), to:

  • Sprawdzanie ciągu znaków, który zawiera liczbę np. "123"
  • Pustej tablicy []
  • Wartości logicznych true/false
  • null

Wszystkie z powyższych wartości ulegają konwersji do wartości liczbowych.

Ciąg znaków "123" zostaje skonwertowany do wartości liczbowej 123 więc isNaN("123"), tak samo jak Number.isNaN("123"), zwraca false.

Pusta tablica również jest konwertowana do wartości liczbowej, 0.

Wartości logiczne true/false są konwertowane do 1/0.

null również ulega konwersji do wartości 0.

Z tego względu, powyższe wartości po konwersji do wartości liczbowej nie stają się wartością NaN, więc isNaN() dla nich zwraca false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html index ec77b8ef0..69fc8ae54 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(typeof NaN)

console.log(isNaN("foo"))
console.log(Number.isNaN("foo"))

console.log(isNaN(() => {}))
console.log(Number.isNaN(() => {}))

console.log(isNaN({}))
console.log(Number.isNaN({}))

console.log(isNaN([1, 2]))
console.log(Number.isNaN([1, 2]))

console.log(isNaN(undefined))
console.log(Number.isNaN(undefined))

console.log(isNaN(NaN))
console.log(isNaN("NaN"))

console.log(isNaN(123))
console.log(isNaN("123"))
console.log(isNaN([]))
console.log(isNaN(true))
console.log(isNaN(false))
console.log(isNaN(null))
- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html index 69d7aafc6..b2548fec9 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html index 2464ea978..a83de4cba 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html index be074d2c6..11fab6ffb 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(typeof NaN) // number

console.log(isNaN("foo")) // true
console.log(Number.isNaN("foo")) // false

console.log(isNaN(() => {})) // true
console.log(Number.isNaN(() => {})) // false

console.log(isNaN({})) // true
console.log(Number.isNaN({})) // false

console.log(isNaN([1, 2])) // true
console.log(Number.isNaN([1, 2])) // false

console.log(isNaN(undefined)) // true
console.log(Number.isNaN(undefined)) // false

console.log(isNaN(NaN)) // true
console.log(isNaN("NaN")) // true

console.log(isNaN(123)) // false
console.log(isNaN("123")) // false (?)
console.log(isNaN([])) // false (?!)
console.log(isNaN(true)) // false (?!)
console.log(isNaN(false)) // false (?!)
console.log(isNaN(null)) // false (?!)
- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html index 9525ab4ef..c1bb096b1 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Po pierwsze isNaN() i Number.isNaN() nie są ze sobą zgodne 🤯.

Teoretycznie założeniem isNaN() jest sprawdzenie czy wartość przekazana w argumencie nie jest wartością liczbową.

W praktyce isNaN() sprawdza jednak czy wartość z argumentu jest ekwiwalentna wartości NaN po konwersji do wartości liczbowej.

Co więcej, dokumentacja Mozilli zachęca do korzystania z Number.isNaN() jako bardziej niezawodnego odpowiednika.

Tak, isNan() i Number.isNaN() potrafią zwracać różną wartość dla tego samego argumentu wejściowego.

Mimo deklarowanej większej niezawodności, Number.isNaN() wciąż jest bardzo nieintuicyjną metodą w celu sprawdzania, czy wartość wejściowa nie jest wartością liczbową.

Dla uzyskania niezawodności i intuicyjności najlepiej skorzystać z porównania typeof x === "number".

Mamy wtedy pewność, że dostaniemy true tylko wtedy, gdy x będzie typu liczbowego.

Pułapką może okazać się wtedy typeof NaN === "number", który zwróci true, ponieważ typ wartości NaN to... number.

Największe (moim zdaniem) pułapki w kwesti isNaN() i Number.isNaN() (gdy są ze sobą zgodne), to:

  • Sprawdzanie ciągu znaków, który zawiera liczbę np. "123"
  • Pustej tablicy []
  • Wartości logicznych true/false
  • null

Wszystkie z powyższych wartości ulegają konwersji do wartości liczbowych.

Ciąg znaków "123" zostaje skonwertowany do wartości liczbowej 123 więc isNaN("123"), tak samo jak Number.isNaN("123"), zwraca false.

Pusta tablica również jest konwertowana do wartości liczbowej, 0.

Wartości logiczne true/false są konwertowane do 1/0.

null również ulega konwersji do wartości 0.

Z tego względu, powyższe wartości po konwersji do wartości liczbowej nie stają się wartością NaN, więc isNaN() dla nich zwraca false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html index e043e4cec..4d5d51792 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #068

🪲 Znajdź buga

const numbers = [11, 2, 27, 1]
const sorted = numbers.sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numbers = [11, 2, 27, 1]
const sorted = [...numbers].sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)

W przykładzie z błędem, stała numbers oraz sorted zwróci tą samą tablicę [100, 2, 11, 27].

Sortowanie działa poprawnie, problem leży jednak w mutowaniu oryginalnej tablicy poprzez metodę sort().

Metoda sort(), nie wykonuje kopii tablicy, na której zostanie wykonana. Modyfikuje oryginalną tablicę i zwraca efekt tej modyfikacji.

Po posortowaniu liczb, tablica sorted, na pozycji 0 posiada wartość 1.

Ta wartość jest jednak podmieniona na wartość 100 za pomocą sorted[0] = 100.

Z uwagi na wspomnianą wcześniej cechę działania sort(), kolejnym modyfikacjom tablicy sorted, ulega również tablica numbers.

Dobrze o tym pamiętać, szczególnie, że JavaScript jest tutaj niespójny.

Niektóre metody, takie jak np. slice(), map(), concat(), zwracają kopię oryginalnej tablicy, przez co późniejsze modyfikacje nie dotykają oryginału (nie mutują).

Inne, jak np. push(), reverse(), sort(), modyfikują oryginalną tablice (mutują).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html index bf06d3738..be637a9ca 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [11, 2, 27, 1]
const sorted = numbers.sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)
- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html index e4924a269..99e5a86cb 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html index 2267a186b..2761f0b8e 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html index 712c8fead..c4e4f2f34 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [11, 2, 27, 1]
const sorted = [...numbers].sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)
- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html index c4670b839..8ffb92eba 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, stała numbers oraz sorted zwróci tą samą tablicę [100, 2, 11, 27].

Sortowanie działa poprawnie, problem leży jednak w mutowaniu oryginalnej tablicy poprzez metodę sort().

Metoda sort(), nie wykonuje kopii tablicy, na której zostanie wykonana. Modyfikuje oryginalną tablicę i zwraca efekt tej modyfikacji.

Po posortowaniu liczb, tablica sorted, na pozycji 0 posiada wartość 1.

Ta wartość jest jednak podmieniona na wartość 100 za pomocą sorted[0] = 100.

Z uwagi na wspomnianą wcześniej cechę działania sort(), kolejnym modyfikacjom tablicy sorted, ulega również tablica numbers.

Dobrze o tym pamiętać, szczególnie, że JavaScript jest tutaj niespójny.

Niektóre metody, takie jak np. slice(), map(), concat(), zwracają kopię oryginalnej tablicy, przez co późniejsze modyfikacje nie dotykają oryginału (nie mutują).

Inne, jak np. push(), reverse(), sort(), modyfikują oryginalną tablice (mutują).

- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html index a1bd4d333..ea7196c21 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #050

🪲 Znajdź buga

console.log(123.toString())
console.log(123..toString())
console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())

Chcemy zamienić typ wartości liczbowej na ciąg znaków.

Który z powyższych sposobów wywołania toString() nie zadziała?

🧪 Rozwiązanie

// console.log(123.toString())
console.log(123..toString())
// console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())

Pierwszy i trzeci sposób nie zadziała.

Pojawienie się kropki bezpośrednio po wartości liczbowej w 123.toString() zostaje zinterpretowane jako liczba zmiennoprzecinkowa. Wystąpienie toString() po kropce, nie jest wartością liczbową, której JavaScript się spodziewa w liczbie zmiennoprzecinkowej np. 123.456.

Sytuację naprawia umieszczenie liczby w nawiasie (123).toString(), przez co nawias zamykający wyraźnie blokuje możliwość interpretacji kropki jako części liczby zmiennoprzecinkowej.

Innym wariantem może być wyraźne zadeklarowanie liczby zmiennoprzecinkowej z zerową wartością dziesiętną 123.0.toString() i taka konstrukcja również zadziała prawidłowo.

Zaskoczeniem może być poprawne działanie poniższych przykładów:

123..toString()
123 .toString()
123 . toString()

Warto zwrócić uwagę, że 123. toString() już poprawnie nie zadziała.

123. jest poprawną liczbą, tak samo jak 123.0.

123 . poprawną liczbą nie jest podobnie jak 123 .0.

Wywołując 123. toString() przekazujemy więc do metody log() dwa parametry: liczbę oraz samodzielne wywołanie funkcji toString().

JavaScript spodziewa się więc console.log(123., toString()).

123..toString() daje nam zapis poprawnej liczby 123. oraz wywołanie na niej metody toString().

123 .toString() dla JavaScript oznacza wystąpienie liczby całkowitej, bo liczby zmiennoprzecinkowe nie mogą mieć białych znaków pomiędzy separatorem dziesiętnym.

Skoro jest to liczba całkowita to wywołanie toString() zostaje już poprawnie zinterpretowane. Nieważna jest też ilość białych znaków, które występują po liczbie całkowitej oraz, uwaga, po akcesorze (kropce), dającym dostęp do metody.

123   .   toString() wszystko gra 🤯

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html index f1b033337..b7cfcc445 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(123.toString())
console.log(123..toString())
console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())
- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html index f86a3e012..f30b4dda9 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy zamienić typ wartości liczbowej na ciąg znaków.

Który z powyższych sposobów wywołania toString() nie zadziała?

- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html index a3e12391e..15378915e 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html index 3164d067a..cebfbbbef 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
// console.log(123.toString())
console.log(123..toString())
// console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())
- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html index 3722ddc61..402b50000 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Pierwszy i trzeci sposób nie zadziała.

Pojawienie się kropki bezpośrednio po wartości liczbowej w 123.toString() zostaje zinterpretowane jako liczba zmiennoprzecinkowa. Wystąpienie toString() po kropce, nie jest wartością liczbową, której JavaScript się spodziewa w liczbie zmiennoprzecinkowej np. 123.456.

Sytuację naprawia umieszczenie liczby w nawiasie (123).toString(), przez co nawias zamykający wyraźnie blokuje możliwość interpretacji kropki jako części liczby zmiennoprzecinkowej.

Innym wariantem może być wyraźne zadeklarowanie liczby zmiennoprzecinkowej z zerową wartością dziesiętną 123.0.toString() i taka konstrukcja również zadziała prawidłowo.

Zaskoczeniem może być poprawne działanie poniższych przykładów:

123..toString()
123 .toString()
123 . toString()

Warto zwrócić uwagę, że 123. toString() już poprawnie nie zadziała.

123. jest poprawną liczbą, tak samo jak 123.0.

123 . poprawną liczbą nie jest podobnie jak 123 .0.

Wywołując 123. toString() przekazujemy więc do metody log() dwa parametry: liczbę oraz samodzielne wywołanie funkcji toString().

JavaScript spodziewa się więc console.log(123., toString()).

123..toString() daje nam zapis poprawnej liczby 123. oraz wywołanie na niej metody toString().

123 .toString() dla JavaScript oznacza wystąpienie liczby całkowitej, bo liczby zmiennoprzecinkowe nie mogą mieć białych znaków pomiędzy separatorem dziesiętnym.

Skoro jest to liczba całkowita to wywołanie toString() zostaje już poprawnie zinterpretowane. Nieważna jest też ilość białych znaków, które występują po liczbie całkowitej oraz, uwaga, po akcesorze (kropce), dającym dostęp do metody.

123   .   toString() wszystko gra 🤯

- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html index 8806c9558..21965d8c6 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #024

🪲 Znajdź buga

const numbers = [1, 2, 3]

console.log(
numbers.map(n => { value: n })
)

Mamy tablicę z liczbami przypisanymi do stałej numbers. Chcemy zwrócić tablicę z obiektami, w których każdy z obiektów będzie miał przypisaną wartość do własności value.

Czy powyższy kod spełni to zadanie?

🧪 Rozwiązanie

const numbers = [1, 2, 3]

console.log(
numbers.map(n => ({ value: n }))
)

Błędny przykład zwróci nam tablicę [undefined, undefined, undefined].

Funkcje strzałkowe domyślnie zwracają zawartość funkcji (domniemany return) tylko jeśli nie jest ono w formie blokowej.

Użycie nawiasów klamrowych { i } tworzy ciało funkcji w formie blokowej i tym samym wymaga wyraźnego zwrócenia wartości z takiego ciała poprzez wyrażenie return.

W funkcji strzałkowej chcąc zwrócić obiekt musielibyśmy ciało funkcji zapisać jako { return { value: n } }.

Możemy jednak użyć formy zwięzłej i pominąć return, umieszczając obiekt wewnątrz nawiasów ( i ).

Tym samym funkcja strzałkowa potraktuje taką konstrukcję jako zwięzłe ciało funkcji i zwróci je bez konieczności użycia return.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html index 8a97605da..72def903d 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [1, 2, 3]

console.log(
numbers.map(n => { value: n })
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html index aa30e867b..50d4495dc 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Mamy tablicę z liczbami przypisanymi do stałej numbers. Chcemy zwrócić tablicę z obiektami, w których każdy z obiektów będzie miał przypisaną wartość do własności value.

Czy powyższy kod spełni to zadanie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html index 140861b51..5c8a44c75 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html index 9984cbefa..e8931371d 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [1, 2, 3]

console.log(
numbers.map(n => ({ value: n }))
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html index 7c5e0a3d0..b79d5995c 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Błędny przykład zwróci nam tablicę [undefined, undefined, undefined].

Funkcje strzałkowe domyślnie zwracają zawartość funkcji (domniemany return) tylko jeśli nie jest ono w formie blokowej.

Użycie nawiasów klamrowych { i } tworzy ciało funkcji w formie blokowej i tym samym wymaga wyraźnego zwrócenia wartości z takiego ciała poprzez wyrażenie return.

W funkcji strzałkowej chcąc zwrócić obiekt musielibyśmy ciało funkcji zapisać jako { return { value: n } }.

Możemy jednak użyć formy zwięzłej i pominąć return, umieszczając obiekt wewnątrz nawiasów ( i ).

Tym samym funkcja strzałkowa potraktuje taką konstrukcję jako zwięzłe ciało funkcji i zwróci je bez konieczności użycia return.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html index bd1f65928..d9765ae9a 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #092

🪲 Znajdź buga

const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])

Chcemy skopiować obiekt w sposób głęboki (deep clone).

W jaki sposób zadziałają różne metody kopiowania?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

// console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])

Wywołanie metody getTime() na copy1.birthdate zwróci błąd informujący, że getTime nie jest funkcją.

Mimo, że serializacja i parsowanie formatu JSON działa jako głęboka kopia obiektu, to przez konwersję do formatu JSON tracimy niektóre pierwotne własności obiektu jak funkcje.

Skopiowana data zostaje skonwertowana do ciągu znaków. Nie możemy więc wywoływać na niej metody getTime().

Głęboka kopia copy2 poprzez operator rozkładu { ...person } nie kopiuje zagnieżdżonych obiektów (w tym tablic), a jedynie przekazuje referencję do nich.

Modyfikując imię dziecka w oryginalnym obiekcie po wcześniejszym wykonaniu kopi poprzez rozkład, wpływamy na zmianę tego imienia również w skopiowanym obiekcie.

Ostatni, trzeci sposób jest najskuteczniejszy dla tworzenia głębokich kopi.

Dla copy3 globalna funkcja structuredClone() wykonuje głęboką kopię, zachowując funkcjonalności oraz kopiując zagnieżdżone obiekty.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html index cd2620313..f1e566883 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])
- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html index 2e470d664..3fb736567 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy skopiować obiekt w sposób głęboki (deep clone).

W jaki sposób zadziałają różne metody kopiowania?

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html index cdbc33734..8318fa23e 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html index ad15097ce..f58b4292a 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

// console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])
- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html index 4d76f23db..37cb28bed 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wywołanie metody getTime() na copy1.birthdate zwróci błąd informujący, że getTime nie jest funkcją.

Mimo, że serializacja i parsowanie formatu JSON działa jako głęboka kopia obiektu, to przez konwersję do formatu JSON tracimy niektóre pierwotne własności obiektu jak funkcje.

Skopiowana data zostaje skonwertowana do ciągu znaków. Nie możemy więc wywoływać na niej metody getTime().

Głęboka kopia copy2 poprzez operator rozkładu { ...person } nie kopiuje zagnieżdżonych obiektów (w tym tablic), a jedynie przekazuje referencję do nich.

Modyfikując imię dziecka w oryginalnym obiekcie po wcześniejszym wykonaniu kopi poprzez rozkład, wpływamy na zmianę tego imienia również w skopiowanym obiekcie.

Ostatni, trzeci sposób jest najskuteczniejszy dla tworzenia głębokich kopi.

Dla copy3 globalna funkcja structuredClone() wykonuje głęboką kopię, zachowując funkcjonalności oraz kopiując zagnieżdżone obiekty.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html index 04745a0b0..bfd6ed20a 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #084

🪲 Znajdź buga

console.log(4 < 5)

console.log("4" < "5")
console.log("34" < "5")
console.log("347" < "5")
console.log("347" < "50")

console.log("a" < "b")
console.log("b" < "bz")
console.log("bxz" < "bz")
console.log("bar" < "baz")

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(4 < 5) // true

console.log("4" < "5") // true
console.log("34" < "5") // true
console.log("347" < "5") // true
console.log("347" < "50") // true

console.log("a" < "b") // true
console.log("b" < "bz") // true
console.log("bxz" < "bz") // true
console.log("bar" < "baz") // true

Wszystkie porównania zwrócą wartość true.

Nie są to jednak wartości, których intuicyjnie moglibyśmy się spodziewać po użyciu operatora <.

Porównanie mniej niż oraz analogicznie przeciwstawne więcej niż działa intuicyjnie poprawnie dla wartości liczbowych.

Dla porównania ciągów znaków intuicja mija się jednak z algorytmem, który odpowiada za faktyczne porównania.

Jeśli operandami są ciągi znaków, porównywane są wartości liczbowe przypisane do znaków w kodowaniu Unicode.

Znak "a" w kodowaniu Unicode to liczba 97.

Znak "b", odpowiada liczbie 98.

97 < 98 jest więc twierdzeniem prawdziwym.

Gdy ciągi znaków składają się z większej ilości znaków są one porównywane ze sobą kolejno, znak po znaku.

"b" < "b" zwróciłoby fałsz, bo fałszywe jest stwierdzenie 98 < 98.

"b" < "bz" zwraca prawdę, bo kolejny znak, "z" jest większy niż brak znaku po lewej stronie porównania.

"bxz" < "bz" zwraca prawdę bo "x" w kodowaniu Unicode ma niższą wartość (kod 120) niż "z" (kod 122), innymi słowy występuje wcześniej w alfabecie. Trzecie z zostaje pominięte.

Gdy zamiast liter użyjemy liczb, ale będą one zapisane w postaci ciągu znaków, to sytuacja będzie wyglądała tak samo.

"34" < "5" jest prawdziwe, bo "3" (kod 51) jest mniejsze niż "5" (kod 53). "4" zostaje znakiem pominiętym w porównaniu.

Nie ma znaczenia ile kolejnych znaków dodamy oraz jakie to będą znaki, "3499999999" < "5".

Zwróci tak samo prawdę, ponieważ Unicode "3" (51) jest mniejszy niż Unicode "5" (53).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html index b8b7acba9..bfba3207c 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(4 < 5)

console.log("4" < "5")
console.log("34" < "5")
console.log("347" < "5")
console.log("347" < "50")

console.log("a" < "b")
console.log("b" < "bz")
console.log("bxz" < "bz")
console.log("bar" < "baz")
- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html index ec0f762f9..7665f3f3a 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html index 09937f09f..59f852a15 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html index f29004644..3fa4c035d 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(4 < 5) // true

console.log("4" < "5") // true
console.log("34" < "5") // true
console.log("347" < "5") // true
console.log("347" < "50") // true

console.log("a" < "b") // true
console.log("b" < "bz") // true
console.log("bxz" < "bz") // true
console.log("bar" < "baz") // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html index 0f5c0eabb..f723357e5 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wszystkie porównania zwrócą wartość true.

Nie są to jednak wartości, których intuicyjnie moglibyśmy się spodziewać po użyciu operatora <.

Porównanie mniej niż oraz analogicznie przeciwstawne więcej niż działa intuicyjnie poprawnie dla wartości liczbowych.

Dla porównania ciągów znaków intuicja mija się jednak z algorytmem, który odpowiada za faktyczne porównania.

Jeśli operandami są ciągi znaków, porównywane są wartości liczbowe przypisane do znaków w kodowaniu Unicode.

Znak "a" w kodowaniu Unicode to liczba 97.

Znak "b", odpowiada liczbie 98.

97 < 98 jest więc twierdzeniem prawdziwym.

Gdy ciągi znaków składają się z większej ilości znaków są one porównywane ze sobą kolejno, znak po znaku.

"b" < "b" zwróciłoby fałsz, bo fałszywe jest stwierdzenie 98 < 98.

"b" < "bz" zwraca prawdę, bo kolejny znak, "z" jest większy niż brak znaku po lewej stronie porównania.

"bxz" < "bz" zwraca prawdę bo "x" w kodowaniu Unicode ma niższą wartość (kod 120) niż "z" (kod 122), innymi słowy występuje wcześniej w alfabecie. Trzecie z zostaje pominięte.

Gdy zamiast liter użyjemy liczb, ale będą one zapisane w postaci ciągu znaków, to sytuacja będzie wyglądała tak samo.

"34" < "5" jest prawdziwe, bo "3" (kod 51) jest mniejsze niż "5" (kod 53). "4" zostaje znakiem pominiętym w porównaniu.

Nie ma znaczenia ile kolejnych znaków dodamy oraz jakie to będą znaki, "3499999999" < "5".

Zwróci tak samo prawdę, ponieważ Unicode "3" (51) jest mniejszy niż Unicode "5" (53).

- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html index 55bed11ab..843f4b9a3 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #026

🪲 Znajdź buga

let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)

Które z powyższych porównań zwrócą prawdę, a które fałsz?

Dla jakiej wartości działanie typeof zwróci błędną informację?\ (oficjalny bug JavaScript)

🧪 Rozwiązanie

let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)

Większość wyrażeń porównania z typem object zaloguje do konsoli wartości true. Wyjątkami będą lastName, nothing, i greet.

Zmienna firstName zawiera obiekt utworzony za pomocą wywołania konstruktora String z użyciem operatora new. Powoduje to zwrócenie obiektu String który jest typem obiektu.

Zmienna lastName zawiera ciąg znaków o podstawowym typie string, stworzonego poprzez wywołanie funkcji String bez użycia operatora new, czyli bez intencji tworzenia nowego obiektu.

Zmienna user otrzymuje wartość typowego JavaScriptowego obiektu definiowanego za pomocą nawiasów klamrowych. Nie jest zaskoczeniem, że typeof zwraca dla takiej wartości object.

Zmienna numbers zawiera tablicę, czyli Array, a w JavaScript Array jest obiektem.

Zmienna nothing jest zadeklarowana bez przypisania wartości. Wywołanie jej zwraca więc wartość undefined, która jest jednocześnie typem podstawowym. typeof undefined zwraca więc undefined.

Zmienna empty zawiera wartość null. Działanie typeof dla wartości null zwróci object i jest to powszechnie uznane za błąd języka JavaScript (patrz podlinkowany artykuł The history of “typeof null”).

Bug ten celowo nie jest jednak naprawiany w działaniu języka ze względu na zachowanie kompatybilności wstecznej z wieloma istniejącymi skryptami, które polegają na tym błędnym działaniu.

Zmienna greet jest funkcją i mimo, że funkcje są też pierwszorzędnymi obiektami w JavaScript, to jednak poprzez typeof zgłaszają swój typ danych jako function.

Zmienna greeting przechowuje obiekt, utworzony poprzez użycie operatora new wywołującego funkcję greet jako konstruktora obiektu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html index 7a8635855..cc490b987 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)
- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html index dea8b7b29..627b42146 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Które z powyższych porównań zwrócą prawdę, a które fałsz?

Dla jakiej wartości działanie typeof zwróci błędną informację?\ (oficjalny bug JavaScript)

- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html index cff774443..d6ba46f96 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html index 23e75ecf7..ef60f6176 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)
- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html index 2b3a65c09..ee94ba008 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Większość wyrażeń porównania z typem object zaloguje do konsoli wartości true. Wyjątkami będą lastName, nothing, i greet.

Zmienna firstName zawiera obiekt utworzony za pomocą wywołania konstruktora String z użyciem operatora new. Powoduje to zwrócenie obiektu String który jest typem obiektu.

Zmienna lastName zawiera ciąg znaków o podstawowym typie string, stworzonego poprzez wywołanie funkcji String bez użycia operatora new, czyli bez intencji tworzenia nowego obiektu.

Zmienna user otrzymuje wartość typowego JavaScriptowego obiektu definiowanego za pomocą nawiasów klamrowych. Nie jest zaskoczeniem, że typeof zwraca dla takiej wartości object.

Zmienna numbers zawiera tablicę, czyli Array, a w JavaScript Array jest obiektem.

Zmienna nothing jest zadeklarowana bez przypisania wartości. Wywołanie jej zwraca więc wartość undefined, która jest jednocześnie typem podstawowym. typeof undefined zwraca więc undefined.

Zmienna empty zawiera wartość null. Działanie typeof dla wartości null zwróci object i jest to powszechnie uznane za błąd języka JavaScript (patrz podlinkowany artykuł The history of “typeof null”).

Bug ten celowo nie jest jednak naprawiany w działaniu języka ze względu na zachowanie kompatybilności wstecznej z wieloma istniejącymi skryptami, które polegają na tym błędnym działaniu.

Zmienna greet jest funkcją i mimo, że funkcje są też pierwszorzędnymi obiektami w JavaScript, to jednak poprzez typeof zgłaszają swój typ danych jako function.

Zmienna greeting przechowuje obiekt, utworzony poprzez użycie operatora new wywołującego funkcję greet jako konstruktora obiektu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html index c2a8c2308..578723e0a 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #072

🪲 Znajdź buga

console.log(false ? true : false)
console.log(null ? true : false)
console.log(undefined ? true : false)
console.log(0 ? true : false)
console.log("" ? true : false)
console.log([] ? true : false)
console.log("0" ? true : false)
console.log(" \n " ? true : false)

console.log(null == undefined)
console.log(undefined == false)
console.log(null == false)

console.log("" == false)
console.log("" == 0)
console.log("" == [])
console.log([] == false)
console.log("0" == 0)
console.log(" \n " == 0)

Zagrajmy w prawda czy fałsz.

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(false ? true : false) // false
console.log(null ? true : false) // false
console.log(undefined ? true : false) // false
console.log(0 ? true : false) // false
console.log("" ? true : false) // false
console.log([] ? true : false) // true
console.log("0" ? true : false) // true
console.log(" \n " ? true : false) // true

console.log(null == undefined) // true
console.log(undefined == false) // false (!)
console.log(null == false) // false (!)

console.log("" == false) // true
console.log("" == 0) // true
console.log("" == []) // true (!)
console.log([] == false) // true (!)
console.log("0" == 0) // true (!)
console.log(" \n " == 0) // true (!)

W komentarzach obok zwracanych wartości dodałem wykrzykniki dla rozwiązań, które w mojej ocenie są najbardziej nielogiczne.

JavaScript nie jest spójny w kwesti działania operatora porównania == w porównaniu do ewaluacji wyrażeń warunkowych.

Porównując ze sobą dwa elementy, które mają różne typy i oczekując zwrócenia wartości logicznej true/false, intuicyjnie możemy zakładać (błędnie), że algorytm porównania będzie dążył do sprowadzenia odmiennych typów danych do wartości logicznych.

Tak robi instrukcja warunkowa, która przyjmując typ danych inny od wartości logicznej, konwertuje ją na taką.

Operator == przypadku porównywanie różniących się typów danych, najczęściej dąży jednak do sprowadzenia różnych typów danych do wartości liczbowych.

Stąd też powszechna opinia, aby unikać używania operatora ==, gdyż zwraca on wartość logiczną, ale sam nie dąży do konwersji odmiennych typów danych na wartości logiczne przed ich porównaniem.

Algorytm stojący za ==, jeśli porównuje różne typy danych, w pierwszej kolejności dąży on do sprowadzenia ich do wartości prymitywnych (konwertując obiekty do wartości liczbowych lub ciągi znaków).

Następnie, jeśli typy porównywanych danych dalej się różnicą, algorytm dąży on do sprowadzenia wartości prymitywnych do wartości liczbowych.

Algorytm konwersji do wartości liczbowych wprowadza dodatkowe zamieszanie, konwertując wartości, które z definicji w języku JavaScript są prawdziwe (jak np. ciąg białych znaków, puste tablice), do wartości liczbowych 0, które to z kolei, z definicji są fałszywe.

Gdy porównujemy różne typy danych za pomocą operatora porównania ==, bliskie prawdy jest zapisanie takiego porównania z użyciem konwersji porównywanych danych do wartości liczbowych oraz operatora ścisłego porównania Number(a) === Number(b).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html index 310385279..e10d6c216 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(false ? true : false)
console.log(null ? true : false)
console.log(undefined ? true : false)
console.log(0 ? true : false)
console.log("" ? true : false)
console.log([] ? true : false)
console.log("0" ? true : false)
console.log(" \n " ? true : false)

console.log(null == undefined)
console.log(undefined == false)
console.log(null == false)

console.log("" == false)
console.log("" == 0)
console.log("" == [])
console.log([] == false)
console.log("0" == 0)
console.log(" \n " == 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html index ad1fb54ea..f55d0ebde 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Zagrajmy w prawda czy fałsz.

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html index 75c1f1104..85d6dc0dc 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html index 457a16538..616efb956 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(false ? true : false) // false
console.log(null ? true : false) // false
console.log(undefined ? true : false) // false
console.log(0 ? true : false) // false
console.log("" ? true : false) // false
console.log([] ? true : false) // true
console.log("0" ? true : false) // true
console.log(" \n " ? true : false) // true

console.log(null == undefined) // true
console.log(undefined == false) // false (!)
console.log(null == false) // false (!)

console.log("" == false) // true
console.log("" == 0) // true
console.log("" == []) // true (!)
console.log([] == false) // true (!)
console.log("0" == 0) // true (!)
console.log(" \n " == 0) // true (!)
- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html index ed2ed25c0..8f94f6916 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W komentarzach obok zwracanych wartości dodałem wykrzykniki dla rozwiązań, które w mojej ocenie są najbardziej nielogiczne.

JavaScript nie jest spójny w kwesti działania operatora porównania == w porównaniu do ewaluacji wyrażeń warunkowych.

Porównując ze sobą dwa elementy, które mają różne typy i oczekując zwrócenia wartości logicznej true/false, intuicyjnie możemy zakładać (błędnie), że algorytm porównania będzie dążył do sprowadzenia odmiennych typów danych do wartości logicznych.

Tak robi instrukcja warunkowa, która przyjmując typ danych inny od wartości logicznej, konwertuje ją na taką.

Operator == przypadku porównywanie różniących się typów danych, najczęściej dąży jednak do sprowadzenia różnych typów danych do wartości liczbowych.

Stąd też powszechna opinia, aby unikać używania operatora ==, gdyż zwraca on wartość logiczną, ale sam nie dąży do konwersji odmiennych typów danych na wartości logiczne przed ich porównaniem.

Algorytm stojący za ==, jeśli porównuje różne typy danych, w pierwszej kolejności dąży on do sprowadzenia ich do wartości prymitywnych (konwertując obiekty do wartości liczbowych lub ciągi znaków).

Następnie, jeśli typy porównywanych danych dalej się różnicą, algorytm dąży on do sprowadzenia wartości prymitywnych do wartości liczbowych.

Algorytm konwersji do wartości liczbowych wprowadza dodatkowe zamieszanie, konwertując wartości, które z definicji w języku JavaScript są prawdziwe (jak np. ciąg białych znaków, puste tablice), do wartości liczbowych 0, które to z kolei, z definicji są fałszywe.

Gdy porównujemy różne typy danych za pomocą operatora porównania ==, bliskie prawdy jest zapisanie takiego porównania z użyciem konwersji porównywanych danych do wartości liczbowych oraz operatora ścisłego porównania Number(a) === Number(b).

- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html index 040c36166..8c3b6d09d 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #006

🪲 Znajdź buga

for (var i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

for (let i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}

W przykładzie z błędem do konsoli zostanie zalogowana 10 x wartość 10.

Dzieje się tak, ponieważ deklaracja zmiennej za pomocą var tworzy zmienną globalną (dostępną również poza pętlą).

setTimeout() bez podania wartości opóźnienia w drugim argumencie, domyślnie przyjmuje wartości delay jako 0.

Użycie setTimeout() nawet z zerowym opóźnieniem oddelegowuje kod do wykonania go asynchronicznie tj. na końcu kolejki w danej pętli zdarzeń (event loop).

Finalnie 10 wywołań console.log() nastąpi więc dopiero po wykonaniu wszystkich iteracji z pętli.

Ostatnia iteracja pętli ustawi wartość zmiennej i na 10, więc wszystkie 10 wywołań console.log() będzie logowało wartość 10 przypisaną do globalnej zmiennej i.

Aby naprawić ten problem, musimy użyć wyrażenia let zamiast var.

Spowoduje to utworzenie lokalnej zmiennej, dostępnej jedynie w obrębie bloku pętli, bez efektu nadpisywania jej, jak to ma miejsce w przypadku zmiennej globalnej.

for (let i = 0; i < 10; i++) utworzy więc pętlę ze zmienną lokalną i setTimeout() nawet przy wykonaniu logowań do konsoli już po wykonaniu wszystkich iteracji pętli, będzie cały czas miało dostęp do wartości lokalnych użytych w każdej z iteracji.

Zalogowane zostaną wtedy wartości 0, 1, 2, ... zamiast 10, 10, 10, ...

Użycie var wewnątrz pętli będzie miało więc taki sam efekt, jak użycie deklaracji let poza pętlą, tworzącą zmienną globalną.

Deklarując let i, a następie używając tej zmiennej w pętli for (i = 0; i < 10; i++) otrzymamy taki sam (problematyczny) efekt, jak w przypadku użycia for (var i = 0; i < 10; i++).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html index 43be84c21..46f7bcc59 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
for (var i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html index c1511e07b..a54ad8f78 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html index ff98f89ed..f4295cee7 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html index d739b4576..4d0f0d28e 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
for (let i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html index 99a9e1056..2e77901bf 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem do konsoli zostanie zalogowana 10 x wartość 10.

Dzieje się tak, ponieważ deklaracja zmiennej za pomocą var tworzy zmienną globalną (dostępną również poza pętlą).

setTimeout() bez podania wartości opóźnienia w drugim argumencie, domyślnie przyjmuje wartości delay jako 0.

Użycie setTimeout() nawet z zerowym opóźnieniem oddelegowuje kod do wykonania go asynchronicznie tj. na końcu kolejki w danej pętli zdarzeń (event loop).

Finalnie 10 wywołań console.log() nastąpi więc dopiero po wykonaniu wszystkich iteracji z pętli.

Ostatnia iteracja pętli ustawi wartość zmiennej i na 10, więc wszystkie 10 wywołań console.log() będzie logowało wartość 10 przypisaną do globalnej zmiennej i.

Aby naprawić ten problem, musimy użyć wyrażenia let zamiast var.

Spowoduje to utworzenie lokalnej zmiennej, dostępnej jedynie w obrębie bloku pętli, bez efektu nadpisywania jej, jak to ma miejsce w przypadku zmiennej globalnej.

for (let i = 0; i < 10; i++) utworzy więc pętlę ze zmienną lokalną i setTimeout() nawet przy wykonaniu logowań do konsoli już po wykonaniu wszystkich iteracji pętli, będzie cały czas miało dostęp do wartości lokalnych użytych w każdej z iteracji.

Zalogowane zostaną wtedy wartości 0, 1, 2, ... zamiast 10, 10, 10, ...

Użycie var wewnątrz pętli będzie miało więc taki sam efekt, jak użycie deklaracji let poza pętlą, tworzącą zmienną globalną.

Deklarując let i, a następie używając tej zmiennej w pętli for (i = 0; i < 10; i++) otrzymamy taki sam (problematyczny) efekt, jak w przypadku użycia for (var i = 0; i < 10; i++).

- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html index 6c8cfeb3a..87985b62c 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #038

🪲 Znajdź buga

const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
[7, "Sunday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth()))
console.log(weekdays.get(now.getDay()))

Czy powyższy kod zaloguje do konsoli poprawny dzień miesiąca, nazwę miesiąca i nazwę dnia tygodnia?

🧪 Rozwiązanie

const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[0, "Sunday"],
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth() + 1))
console.log(weekdays.get(now.getDay()))

W przykładzie z błędem, poprawność działania kodu częściowo zależy od dnia, w którym zostanie uruchomiony.

new Date() generuje aktualną datę w lokalnej strefie czasowej.

Polska leży w strefie czasowej +1h (czas zimowy) lub +2h (czas letni) w stosunku do strefy UTC.

Metoda toISOString() zwraca datę w formacie UTC. Jeśli więc kod zostanie uruchomiony np. o godz. 00:30 w polskiej stefie czasowej, to toISOString() zwróci w odpowiedzi datę z dnia poprzedniego polskiej strefy czasowej.

Pozostałe metody występują w dwóch wariantach.

Pierwsze, bez UTC w nazwie metody, zwracają datę czasu lokalnego (tego, w którym został uruchomiony kod). Drugie, z UTC w nazwie metody, zwracają datę ze strefy czasowej UTC.

Przykładowo, wariant getDate() zwróci dzień miesiąca czasu lokalnego, a wariant getUTCDate() dzień miesiąca czasu UTC.

Metoda getDate() nie sprawia niespodzianek, zwracając dzień miesiąca w formie liczbowej (w przedziale od 1 do 31).

Metoda getMonth() jest już nieco mniej intuicyjna. Zwraca bowiem numer miesiąca, ale numeracja miesięcy zaczyna się od 0.

Styczeń to 0, grudzień to 11.

Jeśli chcemy przypisać nazwy miesięcy do wartości z zakresu od 1 do 12, to wywołując getMonth() musimy pamiętać, aby zawsze dodawać do zwracanej wartości +1.

Metoda getDay() zwraca numer dnia tygodnia w zakresie liczbowym od 0 do 6. Dodatkowo musimy jednak pamiętać, że numerowanie dni tygodnia zaczyna się od niedzieli (0), a kończy na sobocie (6).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html index 8c76a1e39..c1f6560c3 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
[7, "Sunday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth()))
console.log(weekdays.get(now.getDay()))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html index 332e1a913..dd9830563 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy powyższy kod zaloguje do konsoli poprawny dzień miesiąca, nazwę miesiąca i nazwę dnia tygodnia?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html index 6021d0ce9..086e3358f 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html index a8c25add3..0dcfdd209 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[0, "Sunday"],
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth() + 1))
console.log(weekdays.get(now.getDay()))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html index 9cbc87648..31d2962eb 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, poprawność działania kodu częściowo zależy od dnia, w którym zostanie uruchomiony.

new Date() generuje aktualną datę w lokalnej strefie czasowej.

Polska leży w strefie czasowej +1h (czas zimowy) lub +2h (czas letni) w stosunku do strefy UTC.

Metoda toISOString() zwraca datę w formacie UTC. Jeśli więc kod zostanie uruchomiony np. o godz. 00:30 w polskiej stefie czasowej, to toISOString() zwróci w odpowiedzi datę z dnia poprzedniego polskiej strefy czasowej.

Pozostałe metody występują w dwóch wariantach.

Pierwsze, bez UTC w nazwie metody, zwracają datę czasu lokalnego (tego, w którym został uruchomiony kod). Drugie, z UTC w nazwie metody, zwracają datę ze strefy czasowej UTC.

Przykładowo, wariant getDate() zwróci dzień miesiąca czasu lokalnego, a wariant getUTCDate() dzień miesiąca czasu UTC.

Metoda getDate() nie sprawia niespodzianek, zwracając dzień miesiąca w formie liczbowej (w przedziale od 1 do 31).

Metoda getMonth() jest już nieco mniej intuicyjna. Zwraca bowiem numer miesiąca, ale numeracja miesięcy zaczyna się od 0.

Styczeń to 0, grudzień to 11.

Jeśli chcemy przypisać nazwy miesięcy do wartości z zakresu od 1 do 12, to wywołując getMonth() musimy pamiętać, aby zawsze dodawać do zwracanej wartości +1.

Metoda getDay() zwraca numer dnia tygodnia w zakresie liczbowym od 0 do 6. Dodatkowo musimy jednak pamiętać, że numerowanie dni tygodnia zaczyna się od niedzieli (0), a kończy na sobocie (6).

- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html index 682eb411a..3600ff2bf 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #064

🪲 Znajdź buga

console.log(Number(undefined))
console.log(Number(null))
console.log(Number(false))
console.log(Number(true))
console.log(Number({}))
console.log(Number([]))

console.log(Number("a"))
console.log(Number("\f"))
console.log(Number("\n"))
console.log(Number("\r"))
console.log(Number("\t"))
console.log(Number("\v"))
console.log(Number("\b"))

console.log(Number(["a"]))
console.log(Number([0]))
console.log(Number(["0"]))
console.log(Number([0, 0]))
console.log(Number([1]))
console.log(Number(["1"]))
console.log(Number([0, 1]))

console.log(Number(""))
console.log(Number(" "))
console.log(Number(" \n \t \f \v "))
console.log(Number(" \n \t \f \v 1 "))

console.log(Number("1e2"))
console.log(Number(1e2))
console.log(Number("0x64"))
console.log(Number(0x64))
console.log(Number("0b01100100"))
console.log(Number(0b01100100))
console.log(Number("\u0031\u0030\u0030"))
console.log(Number("\x31\x30\x30"))

Funkcja Number konwertuje przekazany argument do wartości liczbowej.

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

🧪 Rozwiązanie

console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number(false)) // 0
console.log(Number(true)) // 1
console.log(Number({})) // NaN
console.log(Number([])) // 0

console.log(Number("a")) // NaN
console.log(Number("\f")) // 0
console.log(Number("\n")) // 0
console.log(Number("\r")) // 0
console.log(Number("\t")) // 0
console.log(Number("\v")) // 0
console.log(Number("\b")) // NaN

console.log(Number(["a"])) // NaN
console.log(Number([0])) // 0
console.log(Number(["0"])) // 0
console.log(Number([0, 0])) // NaN
console.log(Number([1])) // 1
console.log(Number(["1"])) // 1
console.log(Number([0, 1])) // NaN

console.log(Number("")) // 0
console.log(Number(" ")) // 0
console.log(Number(" \n \t \f \v ")) // 0
console.log(Number(" \n \t \f \v 1 ")) // 1

console.log(Number("1e2")) // 100
console.log(Number(1e2)) // 100
console.log(Number("0x64")) // 100
console.log(Number(0x64)) // 100
console.log(Number("0b01100100")) // 100
console.log(Number(0b01100100)) // 100
console.log(Number("\u0031\u0030\u0030")) // 100
console.log(Number("\x31\x30\x30")) // 100

Próba konwersji undefined za pomocą funkcji Number zwróci NaN.

Dla wartości null zostanie jednak zwrócona już wartość liczbowa 0.

Jest to dość powszechnie niespójne zachowanie JavaScriptu, który w różnych sytuacjach różnie konwertuje wartości null i undefined.

Wartości logiczne false/true są konwertowane do liczbowych odpowiedników tj. 0/1.

Mimo, że tablice są również obiektami w języku JavaScript, pusty obiekt zostanie skonwertowany do wartości NaN, a pusta tablica do wartości liczbowej 0.

Ciągi znaków nie zawierających liczb, są konwertowane do wartości NaN.

Poprzedzenie litery znakiem wstecznego ukośnika powoduje tzw. ucieczkę (escape) danego znaku.

Znaki f, n, r, t, v, b poprzedzone \ generują białe znaki (podobnie jak np. spacja).

W zależności od znaku może to być np. wstawienie tabulatora, przejście do nowej linii, itp..

Funkcja Number konwertuje białe znaki (w tym standardowe spacje), do wartości liczbowej 0.

Wyjątkiem jest \b, który oznacza wstawienie wstecznej spacji (backspace) i jest konwertowane do wartości NaN.

W przypadku tablic, jeśli składają się tylko z jednego elementu, Number konwertuje je tak samo, jak gdyby wartości nie były elementem tablicy.

Gdy jednak tablica zawiera więcej niż jeden element, w efekcie konwersji zwracana jest wartość NaN.

Białe znaki łączone w ciąg białych znaków zachowują się tak samo jak pojedyncze, tj. są w całości konwertowane do wartości 0.

Jeśli jednak wśród białych znaków wystąpi wartość liczbowa, jest ona konwertowana do wartości liczbowej, ignorując wszystkie występujące sąsiadujące białe znaki.

Ostatnią grupą są wartości liczbowe zapisywane w innych notacjach lub systemach liczbowych.

1e2 to zapis liczby w notacji naukowej. Litera e jest skrótem od exponential czyli notacji wykładniczej, czyli potęgowania liczby 10. Wartość po literze e to wielkość wykładnika potęgi.

1e2 to więc to samo co 1 * 10 ** 2 (gdzie ** to w JavaScript operator potęgowania).

Upraszczając do zapisu tekstowego, 1 razy 10 do potęgi 2.

Liczba występująca po e oznacza więc ilość zer, które należałoby zapisać stosując standardowy zapis liczby dziesiętnej.

1e2 daje nam więc w standardowym zapisie liczbę dziesiętną 100.

W przypadku konwersji poprzez Number() nie ma znaczenia czy przekażemy taką notację jako ciąg znaków, czyli z użyciem cudzysłowu, czy bez, jako wartość liczbową.

Podobnie sytuacja wygląda w przypadku innych typów oraz systemów zapisu liczb.

0x64 to zapis w systemie szesnastkowym (heksadecymalny) oznaczający liczbę dziesiętną 100.

0x to prefix mówiący o typie notacji, a 64 to faktyczna liczba w systemie szesnastkowym.

0b01100100 to podobna sytuacja. 0b to prefix dla zapisu liczby w systemie binarnym (dwójkowym).

01100100 to faktyczna liczba w systemie dwójkowym, odpowiadająca liczbie 100 w systemie dziesiętnym.

\u0031\u0030\u0030 to ciąg znaków w standardzie kodowania unicode w zapisie szesnastkowym. Każda z liczb odpowiada znakowi z tablicy znaków.

0031 to liczba szesnastkowa, odpowiadająca liczbie dziesiętnej 49, która z kolei jest przypisana do znaku liczby 1 z tablicy znaków.

0030 w zapisie szesnastkowym to 48 w zapisie dziesiętnym i odpowiada mu z tablicy znaków liczba 0.

\u0031\u0030\u0030 to więc finalnie to samo co zapis liczby 100.

Analogicznie wygląda sytuacja z zapisem liczb z prefiksem \x.

Oznacza on również zapis szesnastkowy, jednak w skróconej dwu-znakowej wersji.

Zapis ten daje tym samym do dyspozycji mniejszy zakres z tablicy znaków (bazowe kodowanie, bez rozszerzonych znaków, jak chociażby polskie znaki alfabetu typu ą, ę, itp.).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html index f5973c791..45b834bbd 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(Number(undefined))
console.log(Number(null))
console.log(Number(false))
console.log(Number(true))
console.log(Number({}))
console.log(Number([]))

console.log(Number("a"))
console.log(Number("\f"))
console.log(Number("\n"))
console.log(Number("\r"))
console.log(Number("\t"))
console.log(Number("\v"))
console.log(Number("\b"))

console.log(Number(["a"]))
console.log(Number([0]))
console.log(Number(["0"]))
console.log(Number([0, 0]))
console.log(Number([1]))
console.log(Number(["1"]))
console.log(Number([0, 1]))

console.log(Number(""))
console.log(Number(" "))
console.log(Number(" \n \t \f \v "))
console.log(Number(" \n \t \f \v 1 "))

console.log(Number("1e2"))
console.log(Number(1e2))
console.log(Number("0x64"))
console.log(Number(0x64))
console.log(Number("0b01100100"))
console.log(Number(0b01100100))
console.log(Number("\u0031\u0030\u0030"))
console.log(Number("\x31\x30\x30"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html index 1bf7b4584..2e8492504 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Funkcja Number konwertuje przekazany argument do wartości liczbowej.

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html index fcf392753..92dc58179 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html index 4d82306e5..14a864b8c 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number(false)) // 0
console.log(Number(true)) // 1
console.log(Number({})) // NaN
console.log(Number([])) // 0

console.log(Number("a")) // NaN
console.log(Number("\f")) // 0
console.log(Number("\n")) // 0
console.log(Number("\r")) // 0
console.log(Number("\t")) // 0
console.log(Number("\v")) // 0
console.log(Number("\b")) // NaN

console.log(Number(["a"])) // NaN
console.log(Number([0])) // 0
console.log(Number(["0"])) // 0
console.log(Number([0, 0])) // NaN
console.log(Number([1])) // 1
console.log(Number(["1"])) // 1
console.log(Number([0, 1])) // NaN

console.log(Number("")) // 0
console.log(Number(" ")) // 0
console.log(Number(" \n \t \f \v ")) // 0
console.log(Number(" \n \t \f \v 1 ")) // 1

console.log(Number("1e2")) // 100
console.log(Number(1e2)) // 100
console.log(Number("0x64")) // 100
console.log(Number(0x64)) // 100
console.log(Number("0b01100100")) // 100
console.log(Number(0b01100100)) // 100
console.log(Number("\u0031\u0030\u0030")) // 100
console.log(Number("\x31\x30\x30")) // 100
- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html index 461f88d75..81941b309 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Próba konwersji undefined za pomocą funkcji Number zwróci NaN.

Dla wartości null zostanie jednak zwrócona już wartość liczbowa 0.

Jest to dość powszechnie niespójne zachowanie JavaScriptu, który w różnych sytuacjach różnie konwertuje wartości null i undefined.

Wartości logiczne false/true są konwertowane do liczbowych odpowiedników tj. 0/1.

Mimo, że tablice są również obiektami w języku JavaScript, pusty obiekt zostanie skonwertowany do wartości NaN, a pusta tablica do wartości liczbowej 0.

Ciągi znaków nie zawierających liczb, są konwertowane do wartości NaN.

Poprzedzenie litery znakiem wstecznego ukośnika powoduje tzw. ucieczkę (escape) danego znaku.

Znaki f, n, r, t, v, b poprzedzone \ generują białe znaki (podobnie jak np. spacja).

W zależności od znaku może to być np. wstawienie tabulatora, przejście do nowej linii, itp..

Funkcja Number konwertuje białe znaki (w tym standardowe spacje), do wartości liczbowej 0.

Wyjątkiem jest \b, który oznacza wstawienie wstecznej spacji (backspace) i jest konwertowane do wartości NaN.

W przypadku tablic, jeśli składają się tylko z jednego elementu, Number konwertuje je tak samo, jak gdyby wartości nie były elementem tablicy.

Gdy jednak tablica zawiera więcej niż jeden element, w efekcie konwersji zwracana jest wartość NaN.

Białe znaki łączone w ciąg białych znaków zachowują się tak samo jak pojedyncze, tj. są w całości konwertowane do wartości 0.

Jeśli jednak wśród białych znaków wystąpi wartość liczbowa, jest ona konwertowana do wartości liczbowej, ignorując wszystkie występujące sąsiadujące białe znaki.

Ostatnią grupą są wartości liczbowe zapisywane w innych notacjach lub systemach liczbowych.

1e2 to zapis liczby w notacji naukowej. Litera e jest skrótem od exponential czyli notacji wykładniczej, czyli potęgowania liczby 10. Wartość po literze e to wielkość wykładnika potęgi.

1e2 to więc to samo co 1 * 10 ** 2 (gdzie ** to w JavaScript operator potęgowania).

Upraszczając do zapisu tekstowego, 1 razy 10 do potęgi 2.

Liczba występująca po e oznacza więc ilość zer, które należałoby zapisać stosując standardowy zapis liczby dziesiętnej.

1e2 daje nam więc w standardowym zapisie liczbę dziesiętną 100.

W przypadku konwersji poprzez Number() nie ma znaczenia czy przekażemy taką notację jako ciąg znaków, czyli z użyciem cudzysłowu, czy bez, jako wartość liczbową.

Podobnie sytuacja wygląda w przypadku innych typów oraz systemów zapisu liczb.

0x64 to zapis w systemie szesnastkowym (heksadecymalny) oznaczający liczbę dziesiętną 100.

0x to prefix mówiący o typie notacji, a 64 to faktyczna liczba w systemie szesnastkowym.

0b01100100 to podobna sytuacja. 0b to prefix dla zapisu liczby w systemie binarnym (dwójkowym).

01100100 to faktyczna liczba w systemie dwójkowym, odpowiadająca liczbie 100 w systemie dziesiętnym.

\u0031\u0030\u0030 to ciąg znaków w standardzie kodowania unicode w zapisie szesnastkowym. Każda z liczb odpowiada znakowi z tablicy znaków.

0031 to liczba szesnastkowa, odpowiadająca liczbie dziesiętnej 49, która z kolei jest przypisana do znaku liczby 1 z tablicy znaków.

0030 w zapisie szesnastkowym to 48 w zapisie dziesiętnym i odpowiada mu z tablicy znaków liczba 0.

\u0031\u0030\u0030 to więc finalnie to samo co zapis liczby 100.

Analogicznie wygląda sytuacja z zapisem liczb z prefiksem \x.

Oznacza on również zapis szesnastkowy, jednak w skróconej dwu-znakowej wersji.

Zapis ten daje tym samym do dyspozycji mniejszy zakres z tablicy znaków (bazowe kodowanie, bez rozszerzonych znaków, jak chociażby polskie znaki alfabetu typu ą, ę, itp.).

- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html index 2d77f2050..956dd3999 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #077

🪲 Znajdź buga

const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters)
console.log(letters.length)
console.log(letters[letters.indexOf(9)])

Jaki efekt będzie miało przypisanie wartości do ujemnego indeksu tablicy? Czy wpłynie to na jej długość?

Co zostanie zalogowane do konsoli w poszczególnych wywołaniach?

🧪 Rozwiązanie

const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters) // ["a", "b", undefined, "d"]
console.log(letters.length) // 4
console.log(letters[letters.indexOf(9)]) // "z"

Przypisanie wartości do ujemnych indeksów w tablicy powoduje ukrycie tych elementów dla większości metod w prototypie Array.

Przypisując wartości do ujemnych indeksów tablicy, nie zobaczymy tych wartości logując do konsoli tablicę, czy sprawdzając jej długość.

Możemy jednak ręcznie wyciągać wartości odwołując się do tych indeksów np. letters[-2].

Indeks -1 jest zwracany przez niektóre metody (w tym indexOf()) jako informacja o braku szukanej wartości w tablicy.

Wywołując przykładowo letters.indexOf("x") szukalibyśmy ciągu znaków "x" w tablicy letters z zamiarem otrzymania indeksu szukanego elementu.

Jeśli nie zostaje on znaleziony, metoda indexOf() zwraca -1.

Możemy skorzystać z tej własności zacieniając jednocześnie faktyczne działanie kodu.

Wywołując letters.indexOf(9) szukamy indeksu elementu o wartości 9, czyli nie istniejącego w naszej tablicy.

Nie ma znaczenia co przekażemy jako argument do metody indexOf(), tak długo jak będzie to wartość, która w tablicy nie występuje, zwrócony zostanie indeks -1.

letters[letters.indexOf(9)] to tak naprawdę letters[-1], czyli pobranie elementu z tablicy o indeksie -1.

Domyślnie w tablicy nie powinno być elementu pod takim indeksem, ale my przypisaliśmy wcześniej wartość z to tego indeksu.

Być może lepiej byłoby gdyby metoda indexOf() zwracała np. undefined w momencie gdy szukana wartość nie zostaje odnaleziona.

Nie byłoby wtedy furtki dla nie do końca intuicyjne działającego kodu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html index 2cdb1ba35..db8d622be 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters)
console.log(letters.length)
console.log(letters[letters.indexOf(9)])
- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html index bf8c223b0..3226d6cd8 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaki efekt będzie miało przypisanie wartości do ujemnego indeksu tablicy? Czy wpłynie to na jej długość?

Co zostanie zalogowane do konsoli w poszczególnych wywołaniach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html index 5c554ee9c..3f4a91b3b 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html index 29c82a117..5fc1c9758 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters) // ["a", "b", undefined, "d"]
console.log(letters.length) // 4
console.log(letters[letters.indexOf(9)]) // "z"
- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html index 309d2fde4..bd6266ded 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Przypisanie wartości do ujemnych indeksów w tablicy powoduje ukrycie tych elementów dla większości metod w prototypie Array.

Przypisując wartości do ujemnych indeksów tablicy, nie zobaczymy tych wartości logując do konsoli tablicę, czy sprawdzając jej długość.

Możemy jednak ręcznie wyciągać wartości odwołując się do tych indeksów np. letters[-2].

Indeks -1 jest zwracany przez niektóre metody (w tym indexOf()) jako informacja o braku szukanej wartości w tablicy.

Wywołując przykładowo letters.indexOf("x") szukalibyśmy ciągu znaków "x" w tablicy letters z zamiarem otrzymania indeksu szukanego elementu.

Jeśli nie zostaje on znaleziony, metoda indexOf() zwraca -1.

Możemy skorzystać z tej własności zacieniając jednocześnie faktyczne działanie kodu.

Wywołując letters.indexOf(9) szukamy indeksu elementu o wartości 9, czyli nie istniejącego w naszej tablicy.

Nie ma znaczenia co przekażemy jako argument do metody indexOf(), tak długo jak będzie to wartość, która w tablicy nie występuje, zwrócony zostanie indeks -1.

letters[letters.indexOf(9)] to tak naprawdę letters[-1], czyli pobranie elementu z tablicy o indeksie -1.

Domyślnie w tablicy nie powinno być elementu pod takim indeksem, ale my przypisaliśmy wcześniej wartość z to tego indeksu.

Być może lepiej byłoby gdyby metoda indexOf() zwracała np. undefined w momencie gdy szukana wartość nie zostaje odnaleziona.

Nie byłoby wtedy furtki dla nie do końca intuicyjne działającego kodu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html index 3294dec6a..57f193863 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #018

🪲 Znajdź buga

function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))

Czy funkcja sum() zostanie wykonana? Jeśli tak, to jaki zwróci wynik?

🧪 Rozwiązanie

"use strict"

function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))

W przykładzie z błędem, do konsoli zostanie zalogowany wynik 35.

Zdublowanie nazwy parametru w deklaracji funkcji prowadzi do nadpisania wartości przez ostatni nadpisujący parametr.

W naszym przypadku a + a + c z przekazanymi argumentami 5, 10, 15 prowadzi do wykonania działania 10 + 10 + 15.

Wystąpienie takiej sytuacji powinno być jednak zgłoszone przez JavaScript jako błąd składniowy.

Nie otrzymujemy jednak takiego błędu, ponieważ kod z przykładu działa w trybie nieścisłym.

Aby aktywować tryb ścisły, musimy użyć deklaracji "use strict".

Stosuje się ją na początku pliku, jeśli chcemy aktywować tryb ścisły w całym pliku, lub na początku wnętrza definiowanej funkcji, jeśli tryb ścisły ma być aktywny tylko dla danej funkcji.

Tryb ścisły jest też domyślnie aktywowany w JavaScriptowych modułach. Używając więc eksportu lub importu np. export function sum(a, a, c) też aktywujemy tryb ścisły.

Ważne: brak zgłoszonego błędu w przypadku nadpisywania parametrów funkcji to nie jedyna sytuacja, w której wykonywany kod może zachować się inaczej w zależności od aktywnego, bądź nie, trybu ścisłego.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html index 5269dfa27..ee061cb2f 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html index 878ae788b..85a2a4387 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy funkcja sum() zostanie wykonana? Jeśli tak, to jaki zwróci wynik?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html index 95161ec44..da172027b 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html index 2969e8a4e..60a4834e2 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
"use strict"

function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html index 291d507fe..3cc8927a7 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie zalogowany wynik 35.

Zdublowanie nazwy parametru w deklaracji funkcji prowadzi do nadpisania wartości przez ostatni nadpisujący parametr.

W naszym przypadku a + a + c z przekazanymi argumentami 5, 10, 15 prowadzi do wykonania działania 10 + 10 + 15.

Wystąpienie takiej sytuacji powinno być jednak zgłoszone przez JavaScript jako błąd składniowy.

Nie otrzymujemy jednak takiego błędu, ponieważ kod z przykładu działa w trybie nieścisłym.

Aby aktywować tryb ścisły, musimy użyć deklaracji "use strict".

Stosuje się ją na początku pliku, jeśli chcemy aktywować tryb ścisły w całym pliku, lub na początku wnętrza definiowanej funkcji, jeśli tryb ścisły ma być aktywny tylko dla danej funkcji.

Tryb ścisły jest też domyślnie aktywowany w JavaScriptowych modułach. Używając więc eksportu lub importu np. export function sum(a, a, c) też aktywujemy tryb ścisły.

Ważne: brak zgłoszonego błędu w przypadku nadpisywania parametrów funkcji to nie jedyna sytuacja, w której wykonywany kod może zachować się inaczej w zależności od aktywnego, bądź nie, trybu ścisłego.

- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html index db2b8e777..89e7f1793 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #010

🪲 Znajdź buga

function returnDummyObject() {
return
{
foo: "bar"
}
}

console.log(returnDummyObject())

Chcemy stworzyć prostą funkcję, która zwraca obiekt. Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

function returnDummyObject() {
return {
foo: "bar"
}
}

console.log(returnDummyObject())

W przykładzie z błędem, w konsoli zobaczymy zalogowaną wartość undefined.

Winowajcom takiego efektu jest mechanizm ASI (skrót z ang. od Automatic Semicolon Insertion).

Język JavaScript nie wymaga wyraźnego stawiania średników na końcu wierszy. Dzieje się to automatycznie w momencie interpretowania kodu.

Są jednak pewne sytuacje, w których musimy wyraźnie postawić średnik (np. chcąc umieścić więcej niż 1 wyrażenie w jednym wierszu).

Są też takie, w których nie możemy rozdzielić kodu na wiele wierszy.

I w naszym przykładzie mamy tą drugą sytuację.

Automatyczne wstawianie średników przez JavaScript, w przykładzie z błędem, automatycznie wstawia średnik na końcu drugiego wiersza, przez co jest on interpretowany jako return;.

To z kolei wpływa na całkowite pominięcie obiektu { foo: "bar" }, gdyż jest on zdefiniowany już po deklaracji zakańczającej wykonywanie funkcji.

Przenosząc znak otwarcia klamrowego nawiasu do wiersza z return, otrzymamy pożądany efekt. Z funkcji zwrócony zostanie obiekt, a nie undefined.

Pewnym ułatwieniem w wychwyceniu tego błędu jest automatyczne kolorowanie składni w edytorze kodu. Kod, który nie zostanie wykonany w funkcji ze względu na wystąpienie wyrażenia return, zostaje wizualnie oznaczony przyciemnieniem kolorystyki kodu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html index d869d31cd..b69c0f5b6 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function returnDummyObject() {
return
{
foo: "bar"
}
}

console.log(returnDummyObject())
- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html index b3db2e39d..3c66b4449 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy stworzyć prostą funkcję, która zwraca obiekt. Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html index c4488be8f..f5ad53575 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html index 52f51c4d8..222c4fec4 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function returnDummyObject() {
return {
foo: "bar"
}
}

console.log(returnDummyObject())
- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html index 3f7421280..023dad94e 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli zobaczymy zalogowaną wartość undefined.

Winowajcom takiego efektu jest mechanizm ASI (skrót z ang. od Automatic Semicolon Insertion).

Język JavaScript nie wymaga wyraźnego stawiania średników na końcu wierszy. Dzieje się to automatycznie w momencie interpretowania kodu.

Są jednak pewne sytuacje, w których musimy wyraźnie postawić średnik (np. chcąc umieścić więcej niż 1 wyrażenie w jednym wierszu).

Są też takie, w których nie możemy rozdzielić kodu na wiele wierszy.

I w naszym przykładzie mamy tą drugą sytuację.

Automatyczne wstawianie średników przez JavaScript, w przykładzie z błędem, automatycznie wstawia średnik na końcu drugiego wiersza, przez co jest on interpretowany jako return;.

To z kolei wpływa na całkowite pominięcie obiektu { foo: "bar" }, gdyż jest on zdefiniowany już po deklaracji zakańczającej wykonywanie funkcji.

Przenosząc znak otwarcia klamrowego nawiasu do wiersza z return, otrzymamy pożądany efekt. Z funkcji zwrócony zostanie obiekt, a nie undefined.

Pewnym ułatwieniem w wychwyceniu tego błędu jest automatyczne kolorowanie składni w edytorze kodu. Kod, który nie zostanie wykonany w funkcji ze względu na wystąpienie wyrażenia return, zostaje wizualnie oznaczony przyciemnieniem kolorystyki kodu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html index 766996022..f58cae47e 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #021

🪲 Znajdź buga

fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.status === 404) {
return console.error("Page not found")
}

return console.error(error)
})

Chcemy odpytać API za pomocą fetch(), ale endpoint zwraca nam stronę błędu 404. Jaki będzie efekt działania powyższego kodu?

🧪 Rozwiązanie

fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
if (!response.ok) {
throw new Error("Response not ok", {
cause: response,
})
}

return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.cause.status === 404) {
return console.error("Page not found")
}

console.error(error)
})

Po uruchomieniu kodu z przykładu z błędem, w konsoli ujrzymy Error: Unexpected token 'N', "Not Found" is not valid JSON.

API, którego użyłem do tego przykładu zwraca strony z błędem (404) w formie czystego tekstu. Tekst Not Found nie jest więc prawidłowym formatem JSON, więc wywołanie response.json() wyrzuca błąd, który zostaje przechwycony w sekcji catch().

W sekcji catch() założyłem, że wyrzucony obiekt błędu, może w jakiś sposób znać status z obiektu response.

Moglibyśmy co prawda stworzyć stałą i przypisać do niej obiekt błędu const myError = Error, a następnie dodać własność status i przypisać do niej wartość z response, dodając kod myError.status = response.status.

Musielibyśmy jednak sami obsłużyć wyrzucanie takiego błędu przez throw myError.

Po pierwsze dodajemy więc sprawdzanie własność ok w obiekcie response. Jeśli jest to wartość fałszywa, to znaczy, że kod odpowiedzi z odpytywanej strony był inny niż z zakresu 200-299.

Dodajemy więc instrukcję warunkową, która sprawdza poprzez negację if (!response.ok). Jeśli warunek zostanie spełniony to samodzielnie wyrzucamy błąd, aby później obsłużyć go w sekcji catch().

Aby w łatwy sposób uzyskać dostęp do obiektu response w wychwyconym błędzie, przekazujemy go do obiektu Error jako drugi argument z obiektem opcji i własnością cause.

Finalnie wychwycony błąd w error.cause będzie zawierał cały obiekt response. Możemy więc już łatwo obsłużyć kody błędów w catch() poprzez error.cause.status.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html index 0ea1c8aed..4bab6c800 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.status === 404) {
return console.error("Page not found")
}

return console.error(error)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html index b9b5499d8..fef9de8e7 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy odpytać API za pomocą fetch(), ale endpoint zwraca nam stronę błędu 404. Jaki będzie efekt działania powyższego kodu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html index 948308a92..e7ecdf013 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html index 71e2f1de8..fe978e6ac 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
if (!response.ok) {
throw new Error("Response not ok", {
cause: response,
})
}

return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.cause.status === 404) {
return console.error("Page not found")
}

console.error(error)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html index 4b470d074..c0cf867d3 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Po uruchomieniu kodu z przykładu z błędem, w konsoli ujrzymy Error: Unexpected token 'N', "Not Found" is not valid JSON.

API, którego użyłem do tego przykładu zwraca strony z błędem (404) w formie czystego tekstu. Tekst Not Found nie jest więc prawidłowym formatem JSON, więc wywołanie response.json() wyrzuca błąd, który zostaje przechwycony w sekcji catch().

W sekcji catch() założyłem, że wyrzucony obiekt błędu, może w jakiś sposób znać status z obiektu response.

Moglibyśmy co prawda stworzyć stałą i przypisać do niej obiekt błędu const myError = Error, a następnie dodać własność status i przypisać do niej wartość z response, dodając kod myError.status = response.status.

Musielibyśmy jednak sami obsłużyć wyrzucanie takiego błędu przez throw myError.

Po pierwsze dodajemy więc sprawdzanie własność ok w obiekcie response. Jeśli jest to wartość fałszywa, to znaczy, że kod odpowiedzi z odpytywanej strony był inny niż z zakresu 200-299.

Dodajemy więc instrukcję warunkową, która sprawdza poprzez negację if (!response.ok). Jeśli warunek zostanie spełniony to samodzielnie wyrzucamy błąd, aby później obsłużyć go w sekcji catch().

Aby w łatwy sposób uzyskać dostęp do obiektu response w wychwyconym błędzie, przekazujemy go do obiektu Error jako drugi argument z obiektem opcji i własnością cause.

Finalnie wychwycony błąd w error.cause będzie zawierał cały obiekt response. Możemy więc już łatwo obsłużyć kody błędów w catch() poprzez error.cause.status.

- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html index 82071e3b1..ee9ee13ee 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #065

🪲 Znajdź buga

const c = "constructor"
c[c][c](`console.log("It's alive!")`)()

Czy powyższy kod zadziała poprawnie i do konsoli zostanie zalogowany tekst It's alive!?

🧪 Rozwiązanie

const c = "constructor"
c[c][c](`console.log("It's alive!")`)()

Tak! W kodzie nie ma buga, wszystko zadziała poprawnie.

Wyjaśnienia wymaga jednak kwestia, dlaczego ciąg znaków został wykonany.

W procesie tworzenia obiektów udział biorą funkcje nazywane konstruktorami.

W utworzonym obiekcie możemy dostać się do takiej funkcji uruchamiając na niej metodę o nazwie constructor.

"".constructor zwróci więc funkcję konstruktora obiektu ciągu znaków, czyli String.

Przypisując ciąg znaków "constructor" do stałej, a później używając jej w c[c][c], uzyskamy ten sam efekt co wywołując kod "constructor".constructor.constructor.

Wiemy już, że konstruktorem ciągu znaków jest funkcja String.

Idąc krok dalej, sprawdzamy jaki konstruktor bierze udział w procesie tworzenia obiektu ciągu znaków, czyli ekwiwalent wywołania String.constructor.

Okazuje się, że zwrócony zostaje konstruktor funkcji, czyli Function.

c[c][c]() to więc finalnie to samo co Function().

W JavaScript do tworzenia funkcji możemy użyć funkcji konstruktora obiektu funkcji, przekazując jako argument ciąg znaków, który zostanie wykonany jako ciało funkcji.

Function(`console.log("It's alive!")`) tworzy więc nową funkcję, której ciałem staje się przekazany ciąg znaków.

Działaniem przypomina to funkcję eval(), która również przetwarza przekazany w argumencie ciąg znaków do postaci wykonywanego kodu.

Finalnie wykonujemy nowo utworzoną funkcję poprzez dodanie nawiasów na końcu Function(`console.log("It's alive!")`)().

Otrzymujemy ten sam efekt, który dało nam wywołanie\ c[c][c](`console.log("It's alive!")`)().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html index 50508bf95..a2c6865dc 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const c = "constructor"
c[c][c](`console.log("It's alive!")`)()
- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html index 2750d1b0e..1817709ae 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy powyższy kod zadziała poprawnie i do konsoli zostanie zalogowany tekst It's alive!?

- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html index 7d016840e..233d682f9 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html index e627c538c..211cd719e 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const c = "constructor"
c[c][c](`console.log("It's alive!")`)()
- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html index f27d26956..e33cf20bd 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Tak! W kodzie nie ma buga, wszystko zadziała poprawnie.

Wyjaśnienia wymaga jednak kwestia, dlaczego ciąg znaków został wykonany.

W procesie tworzenia obiektów udział biorą funkcje nazywane konstruktorami.

W utworzonym obiekcie możemy dostać się do takiej funkcji uruchamiając na niej metodę o nazwie constructor.

"".constructor zwróci więc funkcję konstruktora obiektu ciągu znaków, czyli String.

Przypisując ciąg znaków "constructor" do stałej, a później używając jej w c[c][c], uzyskamy ten sam efekt co wywołując kod "constructor".constructor.constructor.

Wiemy już, że konstruktorem ciągu znaków jest funkcja String.

Idąc krok dalej, sprawdzamy jaki konstruktor bierze udział w procesie tworzenia obiektu ciągu znaków, czyli ekwiwalent wywołania String.constructor.

Okazuje się, że zwrócony zostaje konstruktor funkcji, czyli Function.

c[c][c]() to więc finalnie to samo co Function().

W JavaScript do tworzenia funkcji możemy użyć funkcji konstruktora obiektu funkcji, przekazując jako argument ciąg znaków, który zostanie wykonany jako ciało funkcji.

Function(`console.log("It's alive!")`) tworzy więc nową funkcję, której ciałem staje się przekazany ciąg znaków.

Działaniem przypomina to funkcję eval(), która również przetwarza przekazany w argumencie ciąg znaków do postaci wykonywanego kodu.

Finalnie wykonujemy nowo utworzoną funkcję poprzez dodanie nawiasów na końcu Function(`console.log("It's alive!")`)().

Otrzymujemy ten sam efekt, który dało nam wywołanie\ c[c][c](`console.log("It's alive!")`)().

- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html index d112c2743..3baafb19a 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #051

🪲 Znajdź buga

const string = "code"
const stringified = JSON.stringify("code")

console.log(string === stringified)

Czy porównanie zaloguje do konsoli prawdę, czy fałsz?

🧪 Rozwiązanie

const string = '"code"'
const stringified = JSON.stringify("code")

console.log(string === stringified)

W przykładzie z błędem zostanie zalogowana wartość false.

JSON.stringify() zwraca ciąg znaków w formacie JSON (skrót od JavaScript Object Notation).

Możliwość odwrócenia tego procesu zapewnia JSON.parse().

Format JSON jest ciągiem znaków, więc wszelkie wartości z JavaScript muszą być zaprezentowane jako ciąg znaków.

Jak więc w JSON odróżnić np. ciąg znaków od wartości liczbowej, albo logicznej?

Ciąg znaków prezentowany jest w podwójnym cudzysłowie, podczas gdy inne wartości prymitywne, bez.

Do stałej stringified przypisany zostaje więc ciąg znaków "code".

Chcą przypisać taką wartość ręcznie, musielibyśmy użyć \ dla uniknięcia wewnętrznych cudzysłowów, definiując to jako "\"code\"", lub nieco prościej, używając pojedynczego cudzysłowu '"code"'.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html index 364d4e03f..8e69c30f1 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const string = "code"
const stringified = JSON.stringify("code")

console.log(string === stringified)
- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html index f3b9b6107..c71ed8667 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy porównanie zaloguje do konsoli prawdę, czy fałsz?

- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html index fe71277e4..b868ad7f9 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html index b6d12ac82..c52e1cb5b 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const string = '"code"'
const stringified = JSON.stringify("code")

console.log(string === stringified)
- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html index d48a92f07..86f4251f6 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem zostanie zalogowana wartość false.

JSON.stringify() zwraca ciąg znaków w formacie JSON (skrót od JavaScript Object Notation).

Możliwość odwrócenia tego procesu zapewnia JSON.parse().

Format JSON jest ciągiem znaków, więc wszelkie wartości z JavaScript muszą być zaprezentowane jako ciąg znaków.

Jak więc w JSON odróżnić np. ciąg znaków od wartości liczbowej, albo logicznej?

Ciąg znaków prezentowany jest w podwójnym cudzysłowie, podczas gdy inne wartości prymitywne, bez.

Do stałej stringified przypisany zostaje więc ciąg znaków "code".

Chcą przypisać taką wartość ręcznie, musielibyśmy użyć \ dla uniknięcia wewnętrznych cudzysłowów, definiując to jako "\"code\"", lub nieco prościej, używając pojedynczego cudzysłowu '"code"'.

- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html index ae47741eb..ec23a3d27 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #023

🪲 Znajdź buga

function getNumber() {
try {
// Some code that can throw an error
return 1
} catch {
return 2
} finally {
return 3
}
}

console.log(getNumber())

Zakładając, że wewnątrz funkcji wywołujemy kod, który może wyrzucić nam wyjątek, umieszczamy go w wyrażeniu try...catch. Jaka wartość zostanie zwrócona po wywołaniu funkcji? Czy gdyby wyrzucony został wyjątek w bloku try { ... } kod zachowałby się inaczej?

🧪 Rozwiązanie

function getNumber() {
try {
// Some code that can throw an error
//
} catch {
//
} finally {
return 3
}
}

console.log(getNumber())

W przykładzie z błędem zostanie zwrócona wartość 3.

Niezależnie od tego czy wewnątrz bloku try zostanie wyrzucony wyjątek, blok finally wykona się zawsze, w dodatku bezpośrednio przed wyrażeniami przepływu sterowania (return, throw, break, continue) w innych blokach.

Używając return w bloku finally nie ma sensu abyśmy używali return w pozostałych blokach, bo po prostu nie zostanie on wykonany.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html index a37cdd52a..a16504628 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function getNumber() {
try {
// Some code that can throw an error
return 1
} catch {
return 2
} finally {
return 3
}
}

console.log(getNumber())
- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html index 670bfecc8..e8c707f79 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Zakładając, że wewnątrz funkcji wywołujemy kod, który może wyrzucić nam wyjątek, umieszczamy go w wyrażeniu try...catch. Jaka wartość zostanie zwrócona po wywołaniu funkcji? Czy gdyby wyrzucony został wyjątek w bloku try { ... } kod zachowałby się inaczej?

- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html index 514526c97..159ed8e51 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html index 11a662a5a..4ad535c87 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function getNumber() {
try {
// Some code that can throw an error
//
} catch {
//
} finally {
return 3
}
}

console.log(getNumber())
- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html index 0098331b0..77a96453f 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem zostanie zwrócona wartość 3.

Niezależnie od tego czy wewnątrz bloku try zostanie wyrzucony wyjątek, blok finally wykona się zawsze, w dodatku bezpośrednio przed wyrażeniami przepływu sterowania (return, throw, break, continue) w innych blokach.

Używając return w bloku finally nie ma sensu abyśmy używali return w pozostałych blokach, bo po prostu nie zostanie on wykonany.

- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html index 401375b00..7d1f48e17 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #035

🪲 Znajdź buga

let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/i, "Jan")

console.log(twister)

W ciągu znaków chcemy zamienić wystąpienia słowa karol (niezależnie od wielkości liter) na słowo Jan.

Czy Karol zostanie zamieniony na Jan, a Karolina na Janina?

🧪 Rozwiązanie

let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/gi, "Jan")

console.log(twister)

W przykładzie z błędem, zamienione zostanie tylko pierwsze wystąpienie

Król Jan
kupił królowej Karolinie
korale koloru koralowego

Jeśli w metodzie replace() jako pierwszego argumentu (szukanego fragmentu) użylibyśmy ciągu znaków, możliwa byłaby zamiana tylko i wyłącznie pierwszego wystąpienia.

Chcąc zamienić wszystkie wystąpienia należałoby wtedy użyć metody replaceAll().

Jednak przekazując w pierwszym argumencie replace() wyrażenie regularne (zdefiniowane wewnątrz dwóch ukośników /), możemy ustawić w nim również flagi, takiej jak niewrażliwości na wielkość liter (i), czy działanie globalne (g).

Z flagą globalną (g) w wyrażeniu regularnym, działanie replace() będzie miało efekt w całym ciągu znaków.

Król Jan
kupił królowej Janinie
korale koloru koralowego

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html index 9da6aaa3d..e5f681e0d 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/i, "Jan")

console.log(twister)
- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html index 8ba458333..499c2f53d 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W ciągu znaków chcemy zamienić wystąpienia słowa karol (niezależnie od wielkości liter) na słowo Jan.

Czy Karol zostanie zamieniony na Jan, a Karolina na Janina?

- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html index b54b363b8..ae479f3b3 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html index bc161703e..c84126b8d 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/gi, "Jan")

console.log(twister)
- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html index 941df6b9c..a6ba100af 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, zamienione zostanie tylko pierwsze wystąpienie

Król Jan
kupił królowej Karolinie
korale koloru koralowego

Jeśli w metodzie replace() jako pierwszego argumentu (szukanego fragmentu) użylibyśmy ciągu znaków, możliwa byłaby zamiana tylko i wyłącznie pierwszego wystąpienia.

Chcąc zamienić wszystkie wystąpienia należałoby wtedy użyć metody replaceAll().

Jednak przekazując w pierwszym argumencie replace() wyrażenie regularne (zdefiniowane wewnątrz dwóch ukośników /), możemy ustawić w nim również flagi, takiej jak niewrażliwości na wielkość liter (i), czy działanie globalne (g).

Z flagą globalną (g) w wyrażeniu regularnym, działanie replace() będzie miało efekt w całym ciągu znaków.

Król Jan
kupił królowej Janinie
korale koloru koralowego
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html index 2f15d289c..0729fea66 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #014

🪲 Znajdź buga

for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000)
}

Chcemy wykonać kod (console.log()) 10 razy z odstępami 1 sekundy pomiędzy wywołaniami kodu.

Czy przedstawiony kod zadziała zgodnie z tymi założeniami?

🧪 Rozwiązanie

for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000 * i)
}

Efektem działania błędnego kodu będzie zalogowanie tekstu do konsoli po upływie jednej sekundy, dziesięciokrotnie naraz.

Nasz błąd logiczny ukrył się w przekazanym argumencie opóźnienia w funkcji setTimeout().

Ustawione opóźnienie 1 sekundy (1000 milisekund) nie zmienia się w żadnej iteracji pętli.

Pętla for(), 10 razy wywołuje setTimeout(), który przy każdym wywołaniu ma ustawiane to samo opóźnienie.

Aby uzyskać pożądany efekt 1 sekundowych opóźnień pomiędzy wywołaniami kodu, musimy pomnożyć opóźnienie przez wartość indeksu (i) w każdej z iteracji pętli

Uzyskamy wtedy wywołania z rosnącą różnicą odstępu czasu:

  • setTimeout(() => {...}, 0)
  • setTimeout(() => {...}, 1000)
  • setTimeout(() => {...}, 2000)

I właśnie o taki efekt nam chodzi.

Pomiędzy każdym z wywołań kodu z anonimowej funkcji strzałkowej przekazanej jako callback do setTimeout(), różnica odstępu wykonania kodu w czasie będzie wynosiła 1000 milisekund.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html index da4b109fd..08903410f 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000)
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html index 02e396d2b..4af48e38c 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy wykonać kod (console.log()) 10 razy z odstępami 1 sekundy pomiędzy wywołaniami kodu.

Czy przedstawiony kod zadziała zgodnie z tymi założeniami?

- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html index a86aaba45..a0bb24907 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html index 8c66c66fa..71eb4363a 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000 * i)
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html index 535788de9..28477da13 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Efektem działania błędnego kodu będzie zalogowanie tekstu do konsoli po upływie jednej sekundy, dziesięciokrotnie naraz.

Nasz błąd logiczny ukrył się w przekazanym argumencie opóźnienia w funkcji setTimeout().

Ustawione opóźnienie 1 sekundy (1000 milisekund) nie zmienia się w żadnej iteracji pętli.

Pętla for(), 10 razy wywołuje setTimeout(), który przy każdym wywołaniu ma ustawiane to samo opóźnienie.

Aby uzyskać pożądany efekt 1 sekundowych opóźnień pomiędzy wywołaniami kodu, musimy pomnożyć opóźnienie przez wartość indeksu (i) w każdej z iteracji pętli

Uzyskamy wtedy wywołania z rosnącą różnicą odstępu czasu:

  • setTimeout(() => {...}, 0)
  • setTimeout(() => {...}, 1000)
  • setTimeout(() => {...}, 2000)

I właśnie o taki efekt nam chodzi.

Pomiędzy każdym z wywołań kodu z anonimowej funkcji strzałkowej przekazanej jako callback do setTimeout(), różnica odstępu wykonania kodu w czasie będzie wynosiła 1000 milisekund.

- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html index 0f131338a..6711469a8 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #053

🪲 Znajdź buga

const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
})
.then((data) => {
console.log(data)
})

Chcemy pobrać dane z API (np. listę filmów Star Wars), przetworzyć te dane, a następnie zalogować je do konsoli.

Czy ten plan zadziała w powyższym przykładzie?

🧪 Rozwiązanie

const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
return data
})
.then((data) => {
console.log(data)
})

W przykładzie z błędem, do konsoli zalogowane zostanie undefined.

Dzieje się tak, ponieważ w poprzednim wywołaniu metody then(), nie zwróciliśmy żadnej wartości.

Obietnica (promise) wypełniła się zwracając wartość undefined, tak samo, jak gdybyśmy wywołali standardową funkcję, która nic nie zwraca.

Podobna sytuacja miałaby miejsce z res.json(), gdybyśmy nie zwrócili danych z tego wywołania. W kolejnym wywołaniu, tam gdzie chcemy dane przetworzyć, zamiast danych dostalibyśmy undefined.

Brak nawiasów w naszym przykładzie powoduje, że wartość z anonimowej funkcji strzałkowej (res) => res.json() jest automatycznie zwracana w przeciwieństwie do sytuacji (res) => { res.json() }.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html index 5b68df345..b72db51a9 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
})
.then((data) => {
console.log(data)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html index 3afd720be..713b0e17d 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy pobrać dane z API (np. listę filmów Star Wars), przetworzyć te dane, a następnie zalogować je do konsoli.

Czy ten plan zadziała w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html index 56e879294..3d5b60d81 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html index 2dd24ad79..f9f209067 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
return data
})
.then((data) => {
console.log(data)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html index 36a0f977b..7f81c4c5e 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zalogowane zostanie undefined.

Dzieje się tak, ponieważ w poprzednim wywołaniu metody then(), nie zwróciliśmy żadnej wartości.

Obietnica (promise) wypełniła się zwracając wartość undefined, tak samo, jak gdybyśmy wywołali standardową funkcję, która nic nie zwraca.

Podobna sytuacja miałaby miejsce z res.json(), gdybyśmy nie zwrócili danych z tego wywołania. W kolejnym wywołaniu, tam gdzie chcemy dane przetworzyć, zamiast danych dostalibyśmy undefined.

Brak nawiasów w naszym przykładzie powoduje, że wartość z anonimowej funkcji strzałkowej (res) => res.json() jest automatycznie zwracana w przeciwieństwie do sytuacji (res) => { res.json() }.

- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html index 4c1e9bc24..6cd6624d9 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #045

🪲 Znajdź buga

const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers.indexOf(NaN))
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))

Chcemy sprawdzić czy w tablicy znajdują się różne wartości oraz chcemy poznać ich indeks (pozycję) w tablicy.

Co zostanie zalogowane do konsoli po wywołaniu powyższego kodu?

🧪 Rozwiązanie

const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers
.findIndex((number) => Number.isNaN(number))
)
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))

Wszystkie wywołania metody includes() zwrócą prawdę.

Wartości NaN oraz null zostaną poprawnie znalezione w tablicy.

Wywołując metodę indexOf() dostaniemy jednak wartość -1 dla próby odnalezienia indeksu dla wartości NaN.

Metoda indexOf() dla odnajdywania elementów używa tego samego algorytmu co operator porównania ścisłego ===.

Wartości NaN porównywane z jakąkolwiek wartością (nawet z wartością NaN) zawsze zwracają fałsz.

Wywołując indexOf() z argumentem NaN zwrócone zostanie zawsze -1 czyli informacja, że wartość nie została znaleziona w tablicy.

Aby rozwiązać ten problem musimy użyć innej metody np. findIndex() i samodzielnie skonstruować funkcję sprawdzającą pod kątem wystąpienia wartości NaN.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html index 61602c599..dfaa766ac 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers.indexOf(NaN))
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))
- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html index 52de276a4..3ba7efc11 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy sprawdzić czy w tablicy znajdują się różne wartości oraz chcemy poznać ich indeks (pozycję) w tablicy.

Co zostanie zalogowane do konsoli po wywołaniu powyższego kodu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html index 877b03e3a..2e81ab677 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html index 12cfe0c14..c84596ca6 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers
.findIndex((number) => Number.isNaN(number))
)
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))
- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html index 925e21dba..b92fe34bf 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wszystkie wywołania metody includes() zwrócą prawdę.

Wartości NaN oraz null zostaną poprawnie znalezione w tablicy.

Wywołując metodę indexOf() dostaniemy jednak wartość -1 dla próby odnalezienia indeksu dla wartości NaN.

Metoda indexOf() dla odnajdywania elementów używa tego samego algorytmu co operator porównania ścisłego ===.

Wartości NaN porównywane z jakąkolwiek wartością (nawet z wartością NaN) zawsze zwracają fałsz.

Wywołując indexOf() z argumentem NaN zwrócone zostanie zawsze -1 czyli informacja, że wartość nie została znaleziona w tablicy.

Aby rozwiązać ten problem musimy użyć innej metody np. findIndex() i samodzielnie skonstruować funkcję sprawdzającą pod kątem wystąpienia wartości NaN.

- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html index c1ec6624f..2331dc70d 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #055

🪲 Znajdź buga

{
foo: {
console.log("first")
break foo
console.log("second")
}

break foo
console.log("third")
}

Czy powyższy kod zadziała poprawnie?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

bar: {
foo: {
console.log("first")
break foo
console.log("second")
}

break bar
console.log("third")
}

W przykładzie z błędem, do konsoli zostanie wyrzucony błąd Undefined label 'foo' w 8 linii.

Musimy go naprawić, dodając nazwę etykiety dla bloku nadrzędnego, nazywając go np. bar. Następnie możemy zatrzymać wykonywanie kodu wywołując nazwę zdefiniowanej etykiety, czyli break bar.

Wywołując przerwanie działania kodu poprzez break, możemy odnieść się do etykiety bloku tylko w obrębie bloku, którą dana etykieta definiuje.

Po naprawie tego błędu, w konsoli ujrzymy zalogowane jedynie first.

Logowania do konsoli second i third nie zostaną wykonane, ponieważ działanie kodu w blokach zostaje wcześniej przerwane poprzez break.

Etykiety (label) używa się zazwyczaj do zagnieżdżonych pętli, aby wywołując break lub continue, odwołać się do konkretnej pętli.

Etykietowanie samych bloków {} jest jednak również jak najbardziej poprawne pod względem semantyki języka JavaScript.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html index 7dee8714e..8115593ad 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
{
foo: {
console.log("first")
break foo
console.log("second")
}

break foo
console.log("third")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html index 1d9455595..bfcb0c4e6 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy powyższy kod zadziała poprawnie?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html index f5ed2c420..4d0b56264 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html index fc62cc2a6..154860ee3 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
bar: {
foo: {
console.log("first")
break foo
console.log("second")
}

break bar
console.log("third")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html index a5316d02f..d0f3b1167 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie wyrzucony błąd Undefined label 'foo' w 8 linii.

Musimy go naprawić, dodając nazwę etykiety dla bloku nadrzędnego, nazywając go np. bar. Następnie możemy zatrzymać wykonywanie kodu wywołując nazwę zdefiniowanej etykiety, czyli break bar.

Wywołując przerwanie działania kodu poprzez break, możemy odnieść się do etykiety bloku tylko w obrębie bloku, którą dana etykieta definiuje.

Po naprawie tego błędu, w konsoli ujrzymy zalogowane jedynie first.

Logowania do konsoli second i third nie zostaną wykonane, ponieważ działanie kodu w blokach zostaje wcześniej przerwane poprzez break.

Etykiety (label) używa się zazwyczaj do zagnieżdżonych pętli, aby wywołując break lub continue, odwołać się do konkretnej pętli.

Etykietowanie samych bloków {} jest jednak również jak najbardziej poprawne pod względem semantyki języka JavaScript.

- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html index 8a049fa41..e92d33e56 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html @@ -7,8 +7,8 @@ - - + +
@@ -19,7 +19,7 @@ dostajemy\ 1.0000000000000004

1 + 5e-17 zwróci już tylko 1 i wraz ze zmniejszaniem liczby zmiennoprzecinkowej poprzez dopisywanie kolejnych miejsc po przecinku, będzie dalej otrzymywać zaokrąglony wynik dodawania, 1.

0 / 0 zwróci nam NaN, ale minVal / minVal zwróci 1, wyraźnie pokazując, że minVal zerem nie jest.

0 * 0 zwróci 0, niestety tak samo jak minVal * minVal, co może sugerować, że minVal zerem jednak jest.

W rzeczywistości jest to jednak pułapka i to ten sam problem, który dotyka operacji matematycznych wykonywanych na wszystkich zmiennoprzecinkowych liczbach, we wszystkich językach programowania.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html index 6d81122f6..99b64617c 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const minVal = Number.MIN_VALUE

console.log(0 / 0)
console.log(minVal / minVal)

console.log(0 * 0)
console.log(minVal * minVal)

console.log(minVal + 1)
console.log(minVal - 1)

console.log(minVal)
- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html index 8ac93de6b..395c575b3 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html index 0e39d76a5..f3aebd05e 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html index 425ac628c..58ce078ec 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const minVal = Number.MIN_VALUE

console.log(0 / 0) // NaN
console.log(minVal / minVal) // 1

console.log(0 * 0) // 0
console.log(minVal * minVal) // 0

console.log(minVal + 1) // 1
console.log(minVal - 1) // -1

console.log(minVal) // 5e-324
- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html index 894f1f52c..c1dbf8fa5 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html @@ -7,8 +7,8 @@ - - + +
@@ -18,7 +18,7 @@ 1.0000000000000005\ dostajemy\ 1.0000000000000004

1 + 5e-17 zwróci już tylko 1 i wraz ze zmniejszaniem liczby zmiennoprzecinkowej poprzez dopisywanie kolejnych miejsc po przecinku, będzie dalej otrzymywać zaokrąglony wynik dodawania, 1.

0 / 0 zwróci nam NaN, ale minVal / minVal zwróci 1, wyraźnie pokazując, że minVal zerem nie jest.

0 * 0 zwróci 0, niestety tak samo jak minVal * minVal, co może sugerować, że minVal zerem jednak jest.

W rzeczywistości jest to jednak pułapka i to ten sam problem, który dotyka operacji matematycznych wykonywanych na wszystkich zmiennoprzecinkowych liczbach, we wszystkich językach programowania.

- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html index 7f84a13de..3870f09a4 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #090

🪲 Znajdź buga

const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar())

Obiekty (i klasy) w JavaScript mogą używać tzw. getter'ów.

Czy powyższa konstrukcja składniowa zadziała prawidłowo?

🧪 Rozwiązanie

const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar)

Getter'y służą do pobierania informacji i powinny być wywoływane jak własności obiektu, a nie metody (czyli bez nawiasów).

Getter'y nie obsługują też parametrów. Nie moglibyśmy stworzyć getter'a get bar(param).

W związku z powyższym, w przykładzie z błędem, w 11 linii zostanie wyrzucony błąd obj.bar is not a function.

Aby go naprawić, wystarczy, że usuniemy nawiasy z wywołania bar.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html index 2135ac277..57f25c1f3 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar())
- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html index 9e92f75a3..1e972d829 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Obiekty (i klasy) w JavaScript mogą używać tzw. getter'ów.

Czy powyższa konstrukcja składniowa zadziała prawidłowo?

- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html index a662f60f6..f13c09cf2 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html index d92a38ef6..dee925115 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar)
- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html index d7e693eeb..21abd1787 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Getter'y służą do pobierania informacji i powinny być wywoływane jak własności obiektu, a nie metody (czyli bez nawiasów).

Getter'y nie obsługują też parametrów. Nie moglibyśmy stworzyć getter'a get bar(param).

W związku z powyższym, w przykładzie z błędem, w 11 linii zostanie wyrzucony błąd obj.bar is not a function.

Aby go naprawić, wystarczy, że usuniemy nawiasy z wywołania bar.

- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html index 8a4e059f1..03fe00907 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #071

🪲 Znajdź buga

const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.hasOwnProperty("push"))
console.log("push" in myArray)

Czy wszystkie console.log() zalogują do konsoli wartość true?

🧪 Rozwiązanie

const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.__proto__.hasOwnProperty("push"))
console.log("push" in myArray)

W przykładzie z błędem, w 7 lini zostanie zalogowana wartość false.

Pozostałe wywołania zalogują wartość true.

Metoda hasOwnProperty() sprawdza czy obiekt zawiera własną własność o podanej nazwie. Własną, czyli nie odziedziczoną.

Tablice (Array) są obiektami, ale ich własności to indeksy elementów tablicy. Inne własności/metody są dziedziczone.

myArray.hasOwnProperty(0) zwróci true, ponieważ 0 jest istniejącą własnością obiektu tablicy (indeksem), pod którą przechowywana jest wartość 1.

W przypadku tablicy, byłby to ekwiwalent wywołania\ myArray[0] !== undefined.

Mimo, że tablica jako obiekt ma dostęp do metody push() to jednak nie jest to jej własna własność.

Metoda push() jest własnością prototypu obiektu tablicy.

Jej faktyczna deklaracja znajduje się w obiekcie prototypu myArray.__proto__.push.

Wywołując myArray.push() korzystamy z własności języka JavaScript jakim jest łańcuch prototypów.

JavaScript w celu wykonania danej metody, sprawdza najpierw metody zdefiniowane bezpośrednio w obiekcie, następnie metody prototypów oraz metody prototypów ich prototypów (łańcuch dziedziczenia), aż do momentu gdy znajdzie szukaną metodę lub skończy się łańcuch dziedziczonych prototypów.

hasOwnProperty() przydaje się gdy chcemy sprawdzić, czy dany obiekt ma konkretną własność zdefiniowaną jako swoją.

Gdy zależy nam na sprawdzeniu czy własność jest dostępna dla danego obiektu, uwzględniając dziedziczenie, wtedy lepiej użyć operatora in.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html index d15a08cdb..a5db4ef9d 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.hasOwnProperty("push"))
console.log("push" in myArray)
- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html index a9c2b7687..9f50a2ad7 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy wszystkie console.log() zalogują do konsoli wartość true?

- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html index 18087980e..0fda2b007 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html index 8ec723084..baf536694 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.__proto__.hasOwnProperty("push"))
console.log("push" in myArray)
- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html index 2e52113d9..f23af9423 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, w 7 lini zostanie zalogowana wartość false.

Pozostałe wywołania zalogują wartość true.

Metoda hasOwnProperty() sprawdza czy obiekt zawiera własną własność o podanej nazwie. Własną, czyli nie odziedziczoną.

Tablice (Array) są obiektami, ale ich własności to indeksy elementów tablicy. Inne własności/metody są dziedziczone.

myArray.hasOwnProperty(0) zwróci true, ponieważ 0 jest istniejącą własnością obiektu tablicy (indeksem), pod którą przechowywana jest wartość 1.

W przypadku tablicy, byłby to ekwiwalent wywołania\ myArray[0] !== undefined.

Mimo, że tablica jako obiekt ma dostęp do metody push() to jednak nie jest to jej własna własność.

Metoda push() jest własnością prototypu obiektu tablicy.

Jej faktyczna deklaracja znajduje się w obiekcie prototypu myArray.__proto__.push.

Wywołując myArray.push() korzystamy z własności języka JavaScript jakim jest łańcuch prototypów.

JavaScript w celu wykonania danej metody, sprawdza najpierw metody zdefiniowane bezpośrednio w obiekcie, następnie metody prototypów oraz metody prototypów ich prototypów (łańcuch dziedziczenia), aż do momentu gdy znajdzie szukaną metodę lub skończy się łańcuch dziedziczonych prototypów.

hasOwnProperty() przydaje się gdy chcemy sprawdzić, czy dany obiekt ma konkretną własność zdefiniowaną jako swoją.

Gdy zależy nam na sprawdzeniu czy własność jest dostępna dla danego obiektu, uwzględniając dziedziczenie, wtedy lepiej użyć operatora in.

- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html index c03bf4275..bf531b110 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #030

🪲 Znajdź buga

console.log("b" + "a" + + "a" + "a")

Dziś bardziej na wesoło. Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log("b" + "a" + + "a" + "a")
// baNaNa

Konsola wyświetli baNaNa.

W JavaScript operator + ma kilka zastosowań.

Może działać jako operator matematycznego dodawania.

Może działać jako łącznik ciągów znaków.

Może przekształcać ciągi znaków na typ liczbowy, jeśli występuje z pojedynczym argumentem (wartością).

Przeanalizujmy krok po kroku, co dzieje się przy wywołaniu "b" + "a" + + "a" + "a".

Tak samo jak w matematyce, tak samo w JavaScript, operatory mają hierarchię pierwszeństwa wykonywania (precedence).

I tak jednoargumentowy (unary) operator + wykonywany jest przed operatorem dodawania +.

Jednoargumentowy operator działa wtedy, gdy po jego lewej stronie nie występuje żadna wartość.

Wystąpienie dwóch plusów + + oznacza, że drugi z nich zachowa się jako jednoargumentowy operator, ponieważ po jego lewej stronie nie ma wartości, jest tylko inny operator.

Sprawdzamy więc co znajduje się po prawej stronie jednoargumentowego operatora i jest to + + "a".

JavaScript poprzez + próbuje wykonać konwersji typu danych po prawej stronie tego operatora na typ liczbowy.

Wartość "a" nie jest jednak liczbą zapisaną jedynie jako ciąg znaków.

Operacja konwersji typu danych się nie udaje i zwrócona zostaje wartość NaN (Not a Number).

Tym samym otrzymujemy "b" + "a" + NaN + "a".

Znak dodawania pomiędzy "b" + "a" daje nam "ba" ponieważ + działa tu jako łącznik ciągów znaków.

Gdy operator + musi wybrać, czy wykonać działanie dodawania, czy łączenia ciągów znaków, wybiera to drugie jeśli którykolwiek z argumentów jest typem ciągu znaków (string).

Wartość NaN zostaje więc skonwertowana do ciągu znaków "NaN".

Finalnie daje nam to konstrukcję "ba" + "NaN" + "a", która złączona daje nam "baNaNa".

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html index 6a686d161..9ada76d37 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("b" + "a" + + "a" + "a")
- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html index 6c2cd97b3..b0c2f0514 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Dziś bardziej na wesoło. Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html index 2e17a457a..0b8252983 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html index 19ec21ae7..a76e88350 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("b" + "a" + + "a" + "a")
// baNaNa
- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html index 93b123f32..6451916a0 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Konsola wyświetli baNaNa.

W JavaScript operator + ma kilka zastosowań.

Może działać jako operator matematycznego dodawania.

Może działać jako łącznik ciągów znaków.

Może przekształcać ciągi znaków na typ liczbowy, jeśli występuje z pojedynczym argumentem (wartością).

Przeanalizujmy krok po kroku, co dzieje się przy wywołaniu "b" + "a" + + "a" + "a".

Tak samo jak w matematyce, tak samo w JavaScript, operatory mają hierarchię pierwszeństwa wykonywania (precedence).

I tak jednoargumentowy (unary) operator + wykonywany jest przed operatorem dodawania +.

Jednoargumentowy operator działa wtedy, gdy po jego lewej stronie nie występuje żadna wartość.

Wystąpienie dwóch plusów + + oznacza, że drugi z nich zachowa się jako jednoargumentowy operator, ponieważ po jego lewej stronie nie ma wartości, jest tylko inny operator.

Sprawdzamy więc co znajduje się po prawej stronie jednoargumentowego operatora i jest to + + "a".

JavaScript poprzez + próbuje wykonać konwersji typu danych po prawej stronie tego operatora na typ liczbowy.

Wartość "a" nie jest jednak liczbą zapisaną jedynie jako ciąg znaków.

Operacja konwersji typu danych się nie udaje i zwrócona zostaje wartość NaN (Not a Number).

Tym samym otrzymujemy "b" + "a" + NaN + "a".

Znak dodawania pomiędzy "b" + "a" daje nam "ba" ponieważ + działa tu jako łącznik ciągów znaków.

Gdy operator + musi wybrać, czy wykonać działanie dodawania, czy łączenia ciągów znaków, wybiera to drugie jeśli którykolwiek z argumentów jest typem ciągu znaków (string).

Wartość NaN zostaje więc skonwertowana do ciągu znaków "NaN".

Finalnie daje nam to konstrukcję "ba" + "NaN" + "a", która złączona daje nam "baNaNa".

- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html index 2e011d803..1e3c5dee7 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #070

🪲 Znajdź buga

console.log([, , ,].length)
console.log([, , ,].toString())

Jaka liczbowa długość tablicy i jaka ilość przecinków jako ciąg znaków zostanie zalogowana do konsoli?

🧪 Rozwiązanie

console.log([, , ,].length) // 3
console.log([, , ,].toString()) // ,,

Tablica [, , ,] to tablica z pustymi, niezdefiniowanymi slotami.

Tworząc tablicę np. [1, 2, , 4], definiujemy tablicę z 4 elementami, z czego trzecią wartością jest undefined.

Gdy dostawimy kolejny przecinek na końcu [1, 2, , 4,], nie spowoduje on utworzenie kolejnego, piątek elementu tablicy.

Zamiast tego zostanie zignorowany, ze względu na własność JavaScript zwaną końcowym przecinkiem (trailing comma).

Zapisując tą samą tablicę w inny sposób, umieszczając każdy element w nowej lini, końcowy przecinek nabiera więcej sensu.

[
1,
2,
,
4,
]

Dla wygody dopisywania kolejnych elementów w takim zapisie, końcowy przecinek nie wprowadza nowego elementu, a jest jedynie częścią spójnego zapisu każdego z elementów z tablicy.

JavaScript ignoruje więc końcowy przecinek i nie traktuje go jako rozdzielacz elementów.

Tablica [, , ,], ma więc długość (liczbę elementów) równą 3.

Taką samą długość będzie miała tablica bez pustych wartości, przykładowo [1, 2, 3,].

Dla uproszczenia można zadać sobie pytanie - ile przecinków jest potrzebnych do rozdzielenia N elementów.

Będzie to zawsze wartość o 1 mniejsza niż liczba elementów.

Konwersja tablicy [, , ,] do ciągu znaków wyraźnie to pokazuje, logując do konsoli ciąg znaków składający się z dwóch przecinków (w tablicy są 3 elementy, a 3 minus 1 daje nam 2 przecinki rozdzielające).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html index 20e49fe3a..a221b41af 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log([, , ,].length)
console.log([, , ,].toString())
- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html index 356ca508c..7d4fcaf8b 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaka liczbowa długość tablicy i jaka ilość przecinków jako ciąg znaków zostanie zalogowana do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html index 4696ac06d..03a8afe93 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html index 27da2025f..582f97b25 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log([, , ,].length) // 3
console.log([, , ,].toString()) // ,,
- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html index cb834eba5..a49200b69 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Tablica [, , ,] to tablica z pustymi, niezdefiniowanymi slotami.

Tworząc tablicę np. [1, 2, , 4], definiujemy tablicę z 4 elementami, z czego trzecią wartością jest undefined.

Gdy dostawimy kolejny przecinek na końcu [1, 2, , 4,], nie spowoduje on utworzenie kolejnego, piątek elementu tablicy.

Zamiast tego zostanie zignorowany, ze względu na własność JavaScript zwaną końcowym przecinkiem (trailing comma).

Zapisując tą samą tablicę w inny sposób, umieszczając każdy element w nowej lini, końcowy przecinek nabiera więcej sensu.

[
1,
2,
,
4,
]

Dla wygody dopisywania kolejnych elementów w takim zapisie, końcowy przecinek nie wprowadza nowego elementu, a jest jedynie częścią spójnego zapisu każdego z elementów z tablicy.

JavaScript ignoruje więc końcowy przecinek i nie traktuje go jako rozdzielacz elementów.

Tablica [, , ,], ma więc długość (liczbę elementów) równą 3.

Taką samą długość będzie miała tablica bez pustych wartości, przykładowo [1, 2, 3,].

Dla uproszczenia można zadać sobie pytanie - ile przecinków jest potrzebnych do rozdzielenia N elementów.

Będzie to zawsze wartość o 1 mniejsza niż liczba elementów.

Konwersja tablicy [, , ,] do ciągu znaków wyraźnie to pokazuje, logując do konsoli ciąg znaków składający się z dwóch przecinków (w tablicy są 3 elementy, a 3 minus 1 daje nam 2 przecinki rozdzielające).

- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html index 9ea895938..c9693b7dc 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #031

🪲 Znajdź buga

console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
console.log(0b_1_0 + 0b_0_1)

Który z powyższych zapisów liczbowych będzie niedozwolony?

🧪 Rozwiązanie

console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
// console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
// console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
// console.log(0b_1_0 + 0b_0_1)

Błędy zostaną wyrzucone w trzech liniach:

8: Numeric separators are not allowed here.

11: Numeric separator can not be used after leading 0.

17: Numeric separators are not allowed here.

Pozostałe zapisy liczb i działań są poprawne.

Pomiędzy cyframi w liczbach dziesiętnych można umieszczać wizualny separator _.

Przydaje się to przy trzycyfrowych grupach, czyli liczebnikach potęgi tysiąca (tysiąc, milion, miliard, itd.).

W niektórych sytuacjach, nie możemy jednak zastosować podkreślenia w zapisach liczbowych.

Podkreślenie nie może pojawić się jako pierwszy znak, bo taki zapis odnosiłby się do definiowania nazwy np. zmiennej (_myVar, _123).

Podkreślenie nie może pojawić się na końcu liczby (np. 100_).

Podkreślenie nie może wystąpić po początkowym zerze (np. 0_1).

Podkreślenia nie można użyć w zapisach wykładniczych (np. 1_e2).

Podkreślenia nie można też użyć po początkowej definicji zapisów liczb w postaci binarnej, ósemkowej, czy szesnastkowej (np. 0b_001).

Przy użyciu _ możemy więc wizualnie separować liczby dziesiętne jak np. 125_4912_6824, jak również zapisy liczby w innych systemach liczbowych np. separując co 4 bity liczb binarnych np. 0b1010_1101.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html index 60079c7db..1f02332cd 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
console.log(0b_1_0 + 0b_0_1)
- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html index 531bbc99e..59021e7e3 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Który z powyższych zapisów liczbowych będzie niedozwolony?

- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html index b9922f1b1..1aef784fe 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html index db18e7267..1b9d7ce0f 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
// console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
// console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
// console.log(0b_1_0 + 0b_0_1)
- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html index de0d0a986..c9fbb1852 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Błędy zostaną wyrzucone w trzech liniach:

8: Numeric separators are not allowed here.

11: Numeric separator can not be used after leading 0.

17: Numeric separators are not allowed here.

Pozostałe zapisy liczb i działań są poprawne.

Pomiędzy cyframi w liczbach dziesiętnych można umieszczać wizualny separator _.

Przydaje się to przy trzycyfrowych grupach, czyli liczebnikach potęgi tysiąca (tysiąc, milion, miliard, itd.).

W niektórych sytuacjach, nie możemy jednak zastosować podkreślenia w zapisach liczbowych.

Podkreślenie nie może pojawić się jako pierwszy znak, bo taki zapis odnosiłby się do definiowania nazwy np. zmiennej (_myVar, _123).

Podkreślenie nie może pojawić się na końcu liczby (np. 100_).

Podkreślenie nie może wystąpić po początkowym zerze (np. 0_1).

Podkreślenia nie można użyć w zapisach wykładniczych (np. 1_e2).

Podkreślenia nie można też użyć po początkowej definicji zapisów liczb w postaci binarnej, ósemkowej, czy szesnastkowej (np. 0b_001).

Przy użyciu _ możemy więc wizualnie separować liczby dziesiętne jak np. 125_4912_6824, jak również zapisy liczby w innych systemach liczbowych np. separując co 4 bity liczb binarnych np. 0b1010_1101.

- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html index 3173e2553..7d8538472 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #095

🪲 Znajdź buga

console.log(
8 << 3
)
console.log(
8 << 35
)
console.log(
0b00000000000000000000000000001000
)
console.log(
0b00000000000000000000000001000000
)

Jakie wartości zostaną zalogowane do konsoli i dlaczego?

🧪 Rozwiązanie

console.log(
8 << 3
) // 64
console.log(
8 << 35
) // 64
console.log(
0b00000000000000000000000000001000
) // 8
console.log(
0b00000000000000000000000001000000
) // 64

Operator przesunięcia w lewo << pozwala na modyfikację bitów poprzez ich przesunięcie w lewo o zadaną wartość.

Zwracana wartość jest w postaci dziesiętnej (decymalnej).

Dziesiętna liczba 8 to w 32 bitowym zapisie binarnym 00000000000000000000000000001000.

W JavaScript, zapis binarny poprzedzany jest prefiksem 0b.

Binarny (dwójkowy) zapis 1000 jest więc równy decymalnej (dziesiętnej) liczbie 8.

W systemie dwójkowym podstawą do potęgowania liczby jest 2.

Każdy ze znaków liczby liczony od prawej, to potęgowanie o rosnącym o 1 wykładniku, zaczynając od 0.

Binarny 1000 to 23 czyli 8.

W systemie dziesiętnym podstawą do potęgowania liczby jest 10.

Decymalny 1000 to 103 czyli 1000.

8 << 3 oznacza chęć przesunięcia binarnego zapisu decymalnej ósemki w lewo o trzy bity.

Z 1000 powstaje więc 1000000.

Binarne 1000000 to 26 czyli decymalne 64.

Co ciekawe, 8 << 35 również zwraca 64.

Ponieważ standardowy zapis liczbowy w JavaScript jest zawarty w 32 bitach, chcąc przesunąć zapis liczbowy o 35 miejsc, dochodzimy do końca 32 bitowego zapisu i wracamy na początek.

Przesunięcie o 35 miejsc to tak naprawdę przesunięcie o 35 - 32, czyli de facto 3 miejsca.

8 << 3 jest więc równe 8 << 35, 8 << 67, 8 << 99, itd. ponieważ zwiększamy przesunięcie o 32 bity czyli pełny ciąg.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html index e51ea677c..a943c3457 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(
8 << 3
)
console.log(
8 << 35
)
console.log(
0b00000000000000000000000000001000
)
console.log(
0b00000000000000000000000001000000
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html index fc74ee630..4ea73e99f 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli i dlaczego?

- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html index 3356d8c84..3641f7ee8 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html index 8a63e54e5..4eb436e4c 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(
8 << 3
) // 64
console.log(
8 << 35
) // 64
console.log(
0b00000000000000000000000000001000
) // 8
console.log(
0b00000000000000000000000001000000
) // 64
- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html index 3ce4f17a9..469394cc0 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Operator przesunięcia w lewo << pozwala na modyfikację bitów poprzez ich przesunięcie w lewo o zadaną wartość.

Zwracana wartość jest w postaci dziesiętnej (decymalnej).

Dziesiętna liczba 8 to w 32 bitowym zapisie binarnym 00000000000000000000000000001000.

W JavaScript, zapis binarny poprzedzany jest prefiksem 0b.

Binarny (dwójkowy) zapis 1000 jest więc równy decymalnej (dziesiętnej) liczbie 8.

W systemie dwójkowym podstawą do potęgowania liczby jest 2.

Każdy ze znaków liczby liczony od prawej, to potęgowanie o rosnącym o 1 wykładniku, zaczynając od 0.

Binarny 1000 to 23 czyli 8.

W systemie dziesiętnym podstawą do potęgowania liczby jest 10.

Decymalny 1000 to 103 czyli 1000.

8 << 3 oznacza chęć przesunięcia binarnego zapisu decymalnej ósemki w lewo o trzy bity.

Z 1000 powstaje więc 1000000.

Binarne 1000000 to 26 czyli decymalne 64.

Co ciekawe, 8 << 35 również zwraca 64.

Ponieważ standardowy zapis liczbowy w JavaScript jest zawarty w 32 bitach, chcąc przesunąć zapis liczbowy o 35 miejsc, dochodzimy do końca 32 bitowego zapisu i wracamy na początek.

Przesunięcie o 35 miejsc to tak naprawdę przesunięcie o 35 - 32, czyli de facto 3 miejsca.

8 << 3 jest więc równe 8 << 35, 8 << 67, 8 << 99, itd. ponieważ zwiększamy przesunięcie o 32 bity czyli pełny ciąg.

- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html index c7ab55998..82743e011 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html @@ -7,8 +7,8 @@ - - + +
@@ -16,7 +16,7 @@ !(sentence instanceof Number) zwróci false.

Innym sposobem mogłoby być użycie operatora porównania\ sentence instanceof Number === false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html index a96aca9e4..1e2e0f3da 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const sentence = new String("Lorem ipsum dolor")

console.log(sentence instanceof String)
console.log(!sentence instanceof Number)
- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html index 77d91aace..699ae67c8 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy sprawdzić czy obiekt jest lub nie jest instancją danej klasy.

Co zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html index 40328b33c..9f308ee12 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html index a83d8b85f..b19b508b5 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const sentence = new String("Lorem ipsum dolor")

console.log(sentence instanceof String)
console.log(!(sentence instanceof Number))
- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html index 268f35d56..0eee2aa7b 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

sentence instanceof String zwróci prawdę.

Ciąg znaków został stworzony za pomocą konstruktora klasy String.

Zwróć uwagę na użycie operatora new. Bez niego ciąg znaków zostałby utworzony za pomocą funkcji String nie będącej konstruktorem klasy, więc instanceof zwróciłby w takiej sytuacji fałsz (ciąg znaków byłby wtedy typem prymitywnym, a nie obiektem).

!sentence instanceof Number zwróci fałsz.

I tutaj mamy naszego buga.

W intencji mamy zanegowanie wyniku działania operatora instanceof.

W rzeczywistości negujemy jednak wartość ze stałej sentence.

Ponieważ typ danych w sentence jest obiektem, zostaje on skonwertowany poprzez działanie operatora negacji najpierw do wartości logicznej true, a następnie odwrócony do wartości false.

Wartość false z pewnością nie jest instancją klasy Number, więc finalnie do konsoli zostaje zalogowana wartość false.

Jeśli zależy nam na sprawdzeniu czy dany obiekt nie jest instancją danej klasy, musimy całą operację sprawdzania instancji umieścić wewnątrz nawiasów i zanegować dopiero efekt takiego sprawdzenia.

sentence instanceof Number zwróci true.\ !(sentence instanceof Number) zwróci false.

Innym sposobem mogłoby być użycie operatora porównania\ sentence instanceof Number === false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html index 9d999cd86..11161d86f 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #091

🪲 Znajdź buga

const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed)
console.log(objFreezed)

Czy w powyższym przykładzie istniejące własności obiektów mogą zostać usunięte, a nowe własności mogą zostać dodane?

Jakie wartości obiektów zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed) // { value: 22 }
console.log(objFreezed) // { value: 11 }

Obiekty można pieczętować (seal) oraz zamrażać (freeze).

Obie metody działają bardzo podobnie, blokując modyfikacje takie jak usuwanie czy dodawanie własności obiektu.

Obiekt zapieczętowany przez Object.seal() umożliwia jednak modyfikację istniejących własności w przeciwieństwie do obiektu zamrożonego przez Object.freeze().

objSealed zezwala na zaktualizowanie wartości do { value: 22 }.

objFreezed nie umożliwia takiej modyfikacji i zatrzymuje początkową wartość { value: 11 }.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html index 97c177020..e3fde0e7c 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed)
console.log(objFreezed)
- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html index 15bd3ecd7..2e9520527 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy w powyższym przykładzie istniejące własności obiektów mogą zostać usunięte, a nowe własności mogą zostać dodane?

Jakie wartości obiektów zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html index 649068834..5c6c44fd6 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html index 932cd70c1..87b710a6c 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed) // { value: 22 }
console.log(objFreezed) // { value: 11 }
- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html index ed3f822c3..0a928aa71 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Obiekty można pieczętować (seal) oraz zamrażać (freeze).

Obie metody działają bardzo podobnie, blokując modyfikacje takie jak usuwanie czy dodawanie własności obiektu.

Obiekt zapieczętowany przez Object.seal() umożliwia jednak modyfikację istniejących własności w przeciwieństwie do obiektu zamrożonego przez Object.freeze().

objSealed zezwala na zaktualizowanie wartości do { value: 22 }.

objFreezed nie umożliwia takiej modyfikacji i zatrzymuje początkową wartość { value: 11 }.

- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html index 0683f0c1b..b6f0e37cb 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #011

🪲 Znajdź buga

const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
case "writer":
permission = "can write"
case "admin":
permission = "can everything"
}

return permission
}

console.log(getUserPermission(loggedUser))

Co zostanie zalogowane do konsoli? Jakie pozwolenie będzie miał zalogowany użytkownik?

🧪 Rozwiązanie

const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
break
case "writer":
permission = "can write"
break
case "admin":
permission = "can everything"
break
}

return permission
}

console.log(getUserPermission(loggedUser))

W przykładzie z błędem, do konsoli zostanie zalogowane can everything. Mimo, że zalogowany użytkownik ma ustawioną rolę na reader, instrukcja switch nie zatrzyma swojego działania na tym przypadku i finalnie użytkownik uzyska prawa admina.

Dzieje się tak, ponieważ domyślnie switch zaczynając od przypadku w którym nastąpi dopasowanie, wykonuje kod aż do pojawienia się deklaracji break.

W naszym błędnym przykładzie nie dodaliśmy break w żadnym z przypadków (case), więc kod wykonywał się po kolei, kończąc na przypisaniu do zmiennej permission wartości z ostatniego przypadku w switch.

Innym rozwiązaniem, unikającym wystąpienia błędu, mogłoby być pominięcie zmiennej permission i bezpośrednie zwracanie pożądanych wartości w każdy z przypadków (return "can ...").

Nie musielibyśmy wtedy używać wyrażeń break, ponieważ po wywołaniu return, dalszy kod w funkcji nie byłby wykonywany.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html index 112e185e5..c643be2be 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
case "writer":
permission = "can write"
case "admin":
permission = "can everything"
}

return permission
}

console.log(getUserPermission(loggedUser))
- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html index 616f029c0..749a9bac6 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli? Jakie pozwolenie będzie miał zalogowany użytkownik?

- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html index 24bc591a6..01e6345de 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html index 467fe2557..ce192ce4b 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
break
case "writer":
permission = "can write"
break
case "admin":
permission = "can everything"
break
}

return permission
}

console.log(getUserPermission(loggedUser))
- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html index 486e9d175..673d0a3b7 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie zalogowane can everything. Mimo, że zalogowany użytkownik ma ustawioną rolę na reader, instrukcja switch nie zatrzyma swojego działania na tym przypadku i finalnie użytkownik uzyska prawa admina.

Dzieje się tak, ponieważ domyślnie switch zaczynając od przypadku w którym nastąpi dopasowanie, wykonuje kod aż do pojawienia się deklaracji break.

W naszym błędnym przykładzie nie dodaliśmy break w żadnym z przypadków (case), więc kod wykonywał się po kolei, kończąc na przypisaniu do zmiennej permission wartości z ostatniego przypadku w switch.

Innym rozwiązaniem, unikającym wystąpienia błędu, mogłoby być pominięcie zmiennej permission i bezpośrednie zwracanie pożądanych wartości w każdy z przypadków (return "can ...").

Nie musielibyśmy wtedy używać wyrażeń break, ponieważ po wywołaniu return, dalszy kod w funkcji nie byłby wykonywany.

- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html index cb9dccd95..f9b06cc36 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #080

🪲 Znajdź buga

const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log)
console.log(numbers.latest)

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log)
console.log(numbersCopy.latest)

Chcemy wykonać kopię obiektu, który ma getter'y i setter'y.

Czy kopia w powyższym przykładzie się powiedzie?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log) // [5, 23]
console.log(numbers.latest) // 23

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log) // [5, 23]
console.log(numbersCopy.latest) // 23

Obiekt numbers sam w sobie działa poprawnie.

Umożliwia ustawianie liczby poprzez dodanie jej do tablicy log, a następnie pobranie ostatnio ustawionej liczby poprzez getter latest().

numbers.log zwraca więc [5, 23] ponieważ te dwie liczby zostały wcześniej ustawione poprzez setter current(), tym samym lądując w tablicy log.

numbers.latest zwraca ostatnio ustawioną liczbę, pobierając ją jako ostatni element z tablicy, czyli 23.

Skopiowanie obiektu za pomocą Object.assign() (ale również innymi metodami jak np. rozkład obiektu - spread), nie daje możliwości kopiowania metod w tym getter'ów, czy setter'ów.

numbersCopy.current przestaje działać i staje się niezdefiniowany.

numbersCopy.current = 11 tworzy nową własność, do której na sztywno zostaje przypisana wartość 11.

Operacja ta w żaden sposób nie wpływa już na tablicę log w skopiowanym obiekcie.

numbersCopy.log zwraca tą samą tablicę co numbers.log, ponieważ została ona skopiowana z oryginalnego obiektu.

Niespodzianką może być numbersCopy.latest, ponieważ zwraca 23.

Mimo, że metody obiektu nie są kopiowane, to w przypadku getter'a jest on wykonany w momencie kopiowania i wartość, którą zwraca, zostaje przypisana na stałe do własności w skopiowanym obiekcie.

numbersCopy.latest nie jest już więc metodą zwracającą dynamicznie ostatni element z tablicy log, a jedynie sztywną wartością, do której na stałe przypisana została wartość 23.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html index 717130d28..784db4b9b 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log)
console.log(numbers.latest)

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log)
console.log(numbersCopy.latest)
- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html index 1a375824d..6ec43b1b6 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy wykonać kopię obiektu, który ma getter'y i setter'y.

Czy kopia w powyższym przykładzie się powiedzie?

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html index 6e6245a4d..a2d92960c 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html index 3fd1c5756..d0c67b317 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log) // [5, 23]
console.log(numbers.latest) // 23

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log) // [5, 23]
console.log(numbersCopy.latest) // 23
- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html index c97d0a4eb..b317ba99c 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Obiekt numbers sam w sobie działa poprawnie.

Umożliwia ustawianie liczby poprzez dodanie jej do tablicy log, a następnie pobranie ostatnio ustawionej liczby poprzez getter latest().

numbers.log zwraca więc [5, 23] ponieważ te dwie liczby zostały wcześniej ustawione poprzez setter current(), tym samym lądując w tablicy log.

numbers.latest zwraca ostatnio ustawioną liczbę, pobierając ją jako ostatni element z tablicy, czyli 23.

Skopiowanie obiektu za pomocą Object.assign() (ale również innymi metodami jak np. rozkład obiektu - spread), nie daje możliwości kopiowania metod w tym getter'ów, czy setter'ów.

numbersCopy.current przestaje działać i staje się niezdefiniowany.

numbersCopy.current = 11 tworzy nową własność, do której na sztywno zostaje przypisana wartość 11.

Operacja ta w żaden sposób nie wpływa już na tablicę log w skopiowanym obiekcie.

numbersCopy.log zwraca tą samą tablicę co numbers.log, ponieważ została ona skopiowana z oryginalnego obiektu.

Niespodzianką może być numbersCopy.latest, ponieważ zwraca 23.

Mimo, że metody obiektu nie są kopiowane, to w przypadku getter'a jest on wykonany w momencie kopiowania i wartość, którą zwraca, zostaje przypisana na stałe do własności w skopiowanym obiekcie.

numbersCopy.latest nie jest już więc metodą zwracającą dynamicznie ostatni element z tablicy log, a jedynie sztywną wartością, do której na stałe przypisana została wartość 23.

- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html index 29857f4e9..b415116d3 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #056

🪲 Znajdź buga

async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

numbers.forEach(async (num) => {
await sleep(1000)
store.push(num)
})

console.log(store)
}
main()

Chcemy zasymulować wykonanie asynchronicznych operacji na danych.

Funkcja sleep() zatrzymuje działanie kodu na określoną ilość milisekund symulując asynchroniczne operacje. Następnie przetworzone dane z pierwotnej tablicy numbers chcemy dodać do nowej store.

Czy powyższy kod zadziała prawidłowo?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

const promises = numbers.map(async (num) => {
await sleep(1000)
store.push(num)
})
await Promise.all(promises)

console.log(store)
}
main()

W przykładzie z błędem do konsoli zostanie zalogowana pusta tablica []. Nasz kod nie zadziała więc zgodnie z planem.

Metoda forEach(), wywołuje funkcję przekazaną w argumencie jako callback w sposób synchroniczny.

Działa to więc tak samo, jak gdybyśmy w zwykłej funkcji wywołali inną, zagnieżdżoną, asynchroniczną.

Kod wewnątrz takiej funkcji byłby oddelegowany do wykonania na później w pętli zdarzeń (jako microtask).

Nieco lepszy obraz sytuacji da nam zamiana forEach() na map() i zalogowanie do konsoli takiej mapy.

Okaże się wtedy, że nowa, zmapowana tablica będzie zawierać nierozwiązane obiekty Promise.

W celu rozwiązania tablicy z obietnicami, możemy użyć Promise.all().

Aby wykonać to synchronicznie i nie używać Promise.all().then(), dodajemy await przed wywołaniem Promise.all() i czekamy, aż wszystkie obietnice z tablicy zostaną rozwiązane.

Następnie logując do konsoli store, mamy już dostęp do wszystkich elementów. Wszystkie obietnice zostały rozwiązane i tym samym wykonane zostały wszystkie wywołania push() na tablicy store.

Alternatywnym rozwiązaniem może być wywołanie pętli for, która w przeciwieństwie do forEach() nie przyjmuje funkcji callback, a tym samym użycie await wewnątrz iteracji pętli zostaje wykonane zgodnie z oczekiwaniami.

for (const num of numbers) {
await sleep(1000)
store.push(num)
}

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html index 6735a545c..b0e25462c 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

numbers.forEach(async (num) => {
await sleep(1000)
store.push(num)
})

console.log(store)
}
main()
- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html index 05d07c6bc..67c8a302d 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy zasymulować wykonanie asynchronicznych operacji na danych.

Funkcja sleep() zatrzymuje działanie kodu na określoną ilość milisekund symulując asynchroniczne operacje. Następnie przetworzone dane z pierwotnej tablicy numbers chcemy dodać do nowej store.

Czy powyższy kod zadziała prawidłowo?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html index bbd1fb9a0..36c803837 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html index a747e2b6f..052f72fd5 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

const promises = numbers.map(async (num) => {
await sleep(1000)
store.push(num)
})
await Promise.all(promises)

console.log(store)
}
main()
- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html index 6726b10f6..389e505c0 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem do konsoli zostanie zalogowana pusta tablica []. Nasz kod nie zadziała więc zgodnie z planem.

Metoda forEach(), wywołuje funkcję przekazaną w argumencie jako callback w sposób synchroniczny.

Działa to więc tak samo, jak gdybyśmy w zwykłej funkcji wywołali inną, zagnieżdżoną, asynchroniczną.

Kod wewnątrz takiej funkcji byłby oddelegowany do wykonania na później w pętli zdarzeń (jako microtask).

Nieco lepszy obraz sytuacji da nam zamiana forEach() na map() i zalogowanie do konsoli takiej mapy.

Okaże się wtedy, że nowa, zmapowana tablica będzie zawierać nierozwiązane obiekty Promise.

W celu rozwiązania tablicy z obietnicami, możemy użyć Promise.all().

Aby wykonać to synchronicznie i nie używać Promise.all().then(), dodajemy await przed wywołaniem Promise.all() i czekamy, aż wszystkie obietnice z tablicy zostaną rozwiązane.

Następnie logując do konsoli store, mamy już dostęp do wszystkich elementów. Wszystkie obietnice zostały rozwiązane i tym samym wykonane zostały wszystkie wywołania push() na tablicy store.

Alternatywnym rozwiązaniem może być wywołanie pętli for, która w przeciwieństwie do forEach() nie przyjmuje funkcji callback, a tym samym użycie await wewnątrz iteracji pętli zostaje wykonane zgodnie z oczekiwaniami.

for (const num of numbers) {
await sleep(1000)
store.push(num)
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html index e1ff0de51..af41015ac 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #099

🪲 Znajdź buga

let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x)

Jaka wartość zostanie zalogowana do konsoli i dlaczego?

🧪 Rozwiązanie

let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x) // "foo"

Trójskładnikowy operator warunkowy jest jedynym operatorem w języku JavaScript, który przyjmuje trzy operandy.

  1. Warunek, po którym następuje znak zapytania ?
  2. Wyrażenie, które zostanie wykonane jeśli warunek jest prawdziwy, po którym następuje dwukropek :
  3. Wyrażenie, które zostanie wykonane jeśli warunek jest fałszywy

Jest to skrócona wersja deklaracji if...else, która umożliwia wykonanie tych samych operacji logicznych w skrócony sposób.

Co ciekawe, trójskładnikowy operatora warunkowy można zagnieżdżać jako wyrażenia, które zostają wykonane w innym trójskładnikowym operatorze warunkowym.

Przypomina to wtedy deklarację if...else if...else.

I właśnie taki zagnieżdżony ciąg znajduje się w naszym przykładzie.

Aby nieco ułatwić sobie jego zrozumienie, możemy pogrupować każde z wyrażeń używając nawiasów.

("" ? "ok" : (0 ? 1 : ([] ? "foo" : "bar")))

"" jest wartością fałszywą, więc pierwsze wyrażenie "ok" zostaje pominięte na rzecz drugiego wyrażenia, którym jest kolejna trójskładnikowa grupa.

0 również jest wartością fałszywą, więc wykonana jest kolejna, jeszcze głębiej zagnieżdżona trójskładnikowa grupa.

[] jest wartością prawdziwą, zwrócona zostaje więc wartość "foo", a "bar" zostaje pominięte.

W naszym przypadku kolejne grupy zostały zagnieżdżone jako wyrażenia wykonywane w przypadku fałszywego spełnienia warunku.

Nic nie stoi jednak na przeszkodzie aby używać ich jako wyrażeń dla ewaluacji warunku do prawdy, lub też w obu miejscach - prawdy i fałszu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html index 61b22999d..aca7c7e71 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x)
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html index 4c72fc1d5..354e7056f 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaka wartość zostanie zalogowana do konsoli i dlaczego?

- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html index dfe59765f..7def256cb 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html index b2d7cdaaf..4bb1f5ebf 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x) // "foo"
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html index 2cb2d5495..5c9a277a2 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Trójskładnikowy operator warunkowy jest jedynym operatorem w języku JavaScript, który przyjmuje trzy operandy.

  1. Warunek, po którym następuje znak zapytania ?
  2. Wyrażenie, które zostanie wykonane jeśli warunek jest prawdziwy, po którym następuje dwukropek :
  3. Wyrażenie, które zostanie wykonane jeśli warunek jest fałszywy

Jest to skrócona wersja deklaracji if...else, która umożliwia wykonanie tych samych operacji logicznych w skrócony sposób.

Co ciekawe, trójskładnikowy operatora warunkowy można zagnieżdżać jako wyrażenia, które zostają wykonane w innym trójskładnikowym operatorze warunkowym.

Przypomina to wtedy deklarację if...else if...else.

I właśnie taki zagnieżdżony ciąg znajduje się w naszym przykładzie.

Aby nieco ułatwić sobie jego zrozumienie, możemy pogrupować każde z wyrażeń używając nawiasów.

("" ? "ok" : (0 ? 1 : ([] ? "foo" : "bar")))

"" jest wartością fałszywą, więc pierwsze wyrażenie "ok" zostaje pominięte na rzecz drugiego wyrażenia, którym jest kolejna trójskładnikowa grupa.

0 również jest wartością fałszywą, więc wykonana jest kolejna, jeszcze głębiej zagnieżdżona trójskładnikowa grupa.

[] jest wartością prawdziwą, zwrócona zostaje więc wartość "foo", a "bar" zostaje pominięte.

W naszym przypadku kolejne grupy zostały zagnieżdżone jako wyrażenia wykonywane w przypadku fałszywego spełnienia warunku.

Nic nie stoi jednak na przeszkodzie aby używać ich jako wyrażeń dla ewaluacji warunku do prawdy, lub też w obu miejscach - prawdy i fałszu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html index 6e5488b1f..436983f65 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #028

🪲 Znajdź buga

const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title.subtitle)

Co zostanie zalogowane do konsoli po uruchomieniu powyższego kodu?

🧪 Rozwiązanie

const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title?.subtitle)

W przykładzie z błędem do konsoli zostanie zalogowana wartość null jako efekt wywołania ebook.title.

Zostanie jednak zwrócony też błąd Cannot read properties of null (reading 'subtitle'), który zatrzyma wykonywanie dalszego kodu.

null jest podstawowym typem danych (mimo, że typeof null błędnie zwraca wartość object).

Podstawowe typy danych nie są obiektami w JavaScript, nie zawierają więc żadnych własności czy metod.

Jakakolwiek próba zwrócenia własności domniemanego obiektu null wyrzuca więc błąd, który skutecznie zatrzymuje wykonywanie dalszego kodu aplikacji.

Opcjonalne łączenie łańcuchowe ?. pozwoli nam uniknąć wyrzucenia błędu, zamiast niego zwracając wartość undefined.

Operator ?. świetnie nadaje np. podczas pobierania danych z API, gdy nie jesteśmy do końca pewni struktury przychodzących danych i istnieje prawdopodobieństwo, że dane, które chcemy zwrócić z zagnieżdżonych własności obiektu, będą niezdefiniowane.

Opcjonalne łączenie łańcuchowe to też świetny skrót umożliwiający pominięcie wielokrotnego używania operatorów logicznych AND book && book.title && book.title.subtitle.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html index e72c369e5..6a42208ba 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title.subtitle)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html index 90c526c49..ee2f72134 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli po uruchomieniu powyższego kodu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html index 3e6937bca..ce51bbfc8 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html index d6220b4ac..54406c8f9 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title?.subtitle)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html index ae892d121..5643da4a4 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem do konsoli zostanie zalogowana wartość null jako efekt wywołania ebook.title.

Zostanie jednak zwrócony też błąd Cannot read properties of null (reading 'subtitle'), który zatrzyma wykonywanie dalszego kodu.

null jest podstawowym typem danych (mimo, że typeof null błędnie zwraca wartość object).

Podstawowe typy danych nie są obiektami w JavaScript, nie zawierają więc żadnych własności czy metod.

Jakakolwiek próba zwrócenia własności domniemanego obiektu null wyrzuca więc błąd, który skutecznie zatrzymuje wykonywanie dalszego kodu aplikacji.

Opcjonalne łączenie łańcuchowe ?. pozwoli nam uniknąć wyrzucenia błędu, zamiast niego zwracając wartość undefined.

Operator ?. świetnie nadaje np. podczas pobierania danych z API, gdy nie jesteśmy do końca pewni struktury przychodzących danych i istnieje prawdopodobieństwo, że dane, które chcemy zwrócić z zagnieżdżonych własności obiektu, będą niezdefiniowane.

Opcjonalne łączenie łańcuchowe to też świetny skrót umożliwiający pominięcie wielokrotnego używania operatorów logicznych AND book && book.title && book.title.subtitle.

- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html index 6f1df3dec..2d04fa79c 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #004

🪲 Znajdź buga

var n = 1

if (n === 1) {
var n = 2
console.log(n)
}

console.log(n)

Jaka wartość zostanie zalogowana do konsoli w lini 5, a jaka w 8?

🧪 Rozwiązanie

let n = 1

if (n === 1) {
let n = 2
console.log(n)
}

console.log(n)

W przykładzie z błędem, zadeklarowanie zmiennej z użyciem wyrażenia var, spowoduje zalogowanie konsoli w obu miejscach wartość 2.

Nie jest to błąd per se, o ile jesteśmy świadomi własności działania deklaracji var, która to deklaruje zmienną o zasięgu globalnym.

Znacznie lepszym pomysłem dla deklaracji zmiennych będzie używanie wyrażenia let. Wtedy zasięg działania jest ograniczony do bloku kodu ({}), wewnątrz którego let zostało zdefiniowane.

Używając let, do konsoli zostaną zalogowane kolejno, wartości 2 i 1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html index 789fa826e..a2861972e 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
var n = 1

if (n === 1) {
var n = 2
console.log(n)
}

console.log(n)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html index fb1b14c79..c12299bda 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaka wartość zostanie zalogowana do konsoli w lini 5, a jaka w 8?

- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html index f1b2728fe..e912ba1e2 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html index 0826945a8..876a3f9df 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let n = 1

if (n === 1) {
let n = 2
console.log(n)
}

console.log(n)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html index 98dba1493..a3f0050f8 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, zadeklarowanie zmiennej z użyciem wyrażenia var, spowoduje zalogowanie konsoli w obu miejscach wartość 2.

Nie jest to błąd per se, o ile jesteśmy świadomi własności działania deklaracji var, która to deklaruje zmienną o zasięgu globalnym.

Znacznie lepszym pomysłem dla deklaracji zmiennych będzie używanie wyrażenia let. Wtedy zasięg działania jest ograniczony do bloku kodu ({}), wewnątrz którego let zostało zdefiniowane.

Używając let, do konsoli zostaną zalogowane kolejno, wartości 2 i 1.

- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html index a0d0e44b9..815e15c00 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #076

🪲 Znajdź buga

console.log(Object.is([1], [1]))
console.log([1] === [1])

console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)

console.log(Object.is(NaN, 0 / 0))
console.log(NaN === 0 / 0)

console.log(Object.is(-0, +0))
console.log(-0 === +0)

Czy porównanie wartości poprzez Object.is() działa tak samo jak porównanie poprzez operator ===?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(Object.is([1], [1])) // false
console.log([1] === [1]) // false

console.log(Object.is(NaN, NaN)) // true
console.log(NaN === NaN) // false

console.log(Object.is(NaN, 0 / 0)) // true
console.log(NaN === 0 / 0) // false

console.log(Object.is(-0, +0)) // false
console.log(-0 === +0) // true

Object.is() mimo, że swoją nazwą sugeruje porównywanie obiektów, w rzeczywistości porównuje dwie wartości przekazane jako argumenty do metody is().

Metoda działa bardzo podobnie do porównania, które wykonuje operator ===, ale z małymi wyjątkami.

Porównanie dwóch wartości NaN za pomocą Object.is() da prawdę.

Tego samego nie możemy się jednak spodziewać po działaniu operatora ===, który jeśli napotka operand NaN, to zawsze zwraca fałsz.

Nie ma tutaj znaczenia czy NaN jest przekazany bezpośrednio jako wartość, czy jest wynikiem działania, np. dzielenia 0 / 0.

Drugim wyjątkiem i nieścisłością pomiędzy Object.is(), a operatorem === jest porównanie zera ujemnego z zerem dodatnim.

W informatyce zapis liczb w pamięci w postaci binarnej wiąże się z użyciem dodatkowego bita (sign), który określa czy liczba jest dodatnia czy ujemna.

Bit ten może być użyty również dla liczby 0, tym samym rozgraniczając ją na dwie wartości: -0 i +0.

Dla Object.is() zero ujemne będzie różniło się od zera dodatniego więc porównanie ich zwróci false.

Dla operatora === oba zera będą takie same, zwracając w efekcie ich porównania wartość true.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html index 64293fd23..aea2b68d8 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(Object.is([1], [1]))
console.log([1] === [1])

console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)

console.log(Object.is(NaN, 0 / 0))
console.log(NaN === 0 / 0)

console.log(Object.is(-0, +0))
console.log(-0 === +0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html index dc0529fe2..cea2739b9 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy porównanie wartości poprzez Object.is() działa tak samo jak porównanie poprzez operator ===?

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html index 677ee45ac..0f24f2007 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html index 726553e73..07a7a2bcf 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(Object.is([1], [1])) // false
console.log([1] === [1]) // false

console.log(Object.is(NaN, NaN)) // true
console.log(NaN === NaN) // false

console.log(Object.is(NaN, 0 / 0)) // true
console.log(NaN === 0 / 0) // false

console.log(Object.is(-0, +0)) // false
console.log(-0 === +0) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html index 9930663c9..07489a0cc 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Object.is() mimo, że swoją nazwą sugeruje porównywanie obiektów, w rzeczywistości porównuje dwie wartości przekazane jako argumenty do metody is().

Metoda działa bardzo podobnie do porównania, które wykonuje operator ===, ale z małymi wyjątkami.

Porównanie dwóch wartości NaN za pomocą Object.is() da prawdę.

Tego samego nie możemy się jednak spodziewać po działaniu operatora ===, który jeśli napotka operand NaN, to zawsze zwraca fałsz.

Nie ma tutaj znaczenia czy NaN jest przekazany bezpośrednio jako wartość, czy jest wynikiem działania, np. dzielenia 0 / 0.

Drugim wyjątkiem i nieścisłością pomiędzy Object.is(), a operatorem === jest porównanie zera ujemnego z zerem dodatnim.

W informatyce zapis liczb w pamięci w postaci binarnej wiąże się z użyciem dodatkowego bita (sign), który określa czy liczba jest dodatnia czy ujemna.

Bit ten może być użyty również dla liczby 0, tym samym rozgraniczając ją na dwie wartości: -0 i +0.

Dla Object.is() zero ujemne będzie różniło się od zera dodatniego więc porównanie ich zwróci false.

Dla operatora === oba zera będą takie same, zwracając w efekcie ich porównania wartość true.

- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html index bc01ebb85..d08b286cc 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #007

🪲 Znajdź buga

function addTax(price, tax) {
tax = tax || 0.23

return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)

Chcemy stworzyć funkcję, która będzie nam wyliczała cenę z podatkiem. Zależy nam też na ustawieniu domyślnej wartości podatku na 23%.

Jaka cena zostanie zalogowana do konsoli jako efekt wykonania funkcji addTax(100, 0)?

🧪 Rozwiązanie

function addTax(price, tax = 0.23) {
return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)

W przykładzie z błędem, do konsoli zostania zalogowana cena 123.

Mimo, że wywołując addTax() wyraźnie podajemy w drugim argumencie 0 jako wartość podatku, to używając wewnątrz funkcji logicznego operatora OR (||), wartość 0 traktowana jest jako wartość fałszywa (falsy). W procesie porównywania jest więc odrzucana na rzecz wartości prawdziwej (truthy) i finalnie do zmiennej tax przypisana zostaje wartość 0.23.

Aby naprawić ten błąd możemy np. bezpośrednio podać wartość domyślną dla parametru tax podczas deklarowania funkcji.

Unikniemy dzięki temu wykonywania operacji porównania i wewnątrz funkcji używana będzie dokładnie taka wartość, jaką przekażemy w argumencie wywołując funkcję. W przypadku braku przekazania argumentu tax, użyta zostanie wartość domyślna 0.23.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html index 4c655a743..560f50149 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function addTax(price, tax) {
tax = tax || 0.23

return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html index 4e14013b0..86156f86c 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy stworzyć funkcję, która będzie nam wyliczała cenę z podatkiem. Zależy nam też na ustawieniu domyślnej wartości podatku na 23%.

Jaka cena zostanie zalogowana do konsoli jako efekt wykonania funkcji addTax(100, 0)?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html index bade1341c..7dde0ffda 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html index 1d148193b..2edd3bcd9 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function addTax(price, tax = 0.23) {
return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html index d7b58d74c..78a4a6744 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostania zalogowana cena 123.

Mimo, że wywołując addTax() wyraźnie podajemy w drugim argumencie 0 jako wartość podatku, to używając wewnątrz funkcji logicznego operatora OR (||), wartość 0 traktowana jest jako wartość fałszywa (falsy). W procesie porównywania jest więc odrzucana na rzecz wartości prawdziwej (truthy) i finalnie do zmiennej tax przypisana zostaje wartość 0.23.

Aby naprawić ten błąd możemy np. bezpośrednio podać wartość domyślną dla parametru tax podczas deklarowania funkcji.

Unikniemy dzięki temu wykonywania operacji porównania i wewnątrz funkcji używana będzie dokładnie taka wartość, jaką przekażemy w argumencie wywołując funkcję. W przypadku braku przekazania argumentu tax, użyta zostanie wartość domyślna 0.23.

- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html index 14a8d9536..37b14a791 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #001

🪲 Znajdź buga

const dog = { paws: 4 }
const cat = dog

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}

Obiekt dog zawiera własność paws z wartością ustawioną na 4.

Przekładając na język ludzki, pies ma 4 łapy.

Chcemy utworzyć nowy obiekt cat, kopiując obiekt dog, bo oba zwierzęta mają 4 łapy.

Chcemy też dodać własność miauczenia do obiektu cat.

Czy w powyższym przykładzie instrukcja warunkowa zadziała i pies będzie mógł miauczeć?

🧪 Rozwiązanie

const dog = { paws: 4 }
const cat = { ...dog }

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}

Niestety tak. W przykładzie z błędem, obiekt dog i cat to ten sam obiekt, dog ma więc własność meow.

Dzieje się tak, ponieważ JavaScript wywołuje referencje obiektów (czyli ich adresy z tzw. sterty, przechowywanej w pamięci RAM, z ang. heap).

const cat = dog

Tworząc nową stałą cat wskazujemy nią na istniejący obiekt dog.

Finalnie tworzymy więc jedynie alias tego samego obiektu, który dostępny jest od teraz pod dwiema nazwami cat i dog.

Aby uniknąć sytuacji przypisania tego samego obiektu do stałej/zmiennej, musimy wyraźnie stworzyć kopię obiektu.

Możemy to zrobić np. przez destrukturyzację obiektu i przypisanie zdestrukturyzowanych elementów do nowego obiektu

const cat = { ...dog }

Lub przez przepisanie własności obiektu dog do nowego pustego obiektu {} używając Object.assign().

const cat = Object.assign({}, dog)

Uwaga! Powyższe metody tworzą jedynie "płytką" kopię. Kopiowany jest tylko pierwszy poziom własności. Zagnieżdżone obiekty (obiekt w obiekcie) są wciąż przekazywane w postaci referencji, a nie kopi.

const deepObject = { level: 1, nested: { level: 2 } }

Przy skopiowaniu powyższego obiektu za pomocą { ...deepObject } lub Object.assign({}, deepObject), obiekt nested wciąż będzie przekazany jako referencja.

Rozwiązaniem tego problemu jest użycie funkcji structuredClone() lub metody _.cloneDeep() z biblioteki Lodash.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html index e183dfca1..8af8d09a7 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const dog = { paws: 4 }
const cat = dog

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html index 868c0d6d5..8cb7a5064 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Obiekt dog zawiera własność paws z wartością ustawioną na 4.

Przekładając na język ludzki, pies ma 4 łapy.

Chcemy utworzyć nowy obiekt cat, kopiując obiekt dog, bo oba zwierzęta mają 4 łapy.

Chcemy też dodać własność miauczenia do obiektu cat.

Czy w powyższym przykładzie instrukcja warunkowa zadziała i pies będzie mógł miauczeć?

- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html index 3361c12e0..1582ffb26 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html index 8da15023a..b2212114f 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const dog = { paws: 4 }
const cat = { ...dog }

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html index a1ea3bfbb..7948a8166 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Niestety tak. W przykładzie z błędem, obiekt dog i cat to ten sam obiekt, dog ma więc własność meow.

Dzieje się tak, ponieważ JavaScript wywołuje referencje obiektów (czyli ich adresy z tzw. sterty, przechowywanej w pamięci RAM, z ang. heap).

const cat = dog

Tworząc nową stałą cat wskazujemy nią na istniejący obiekt dog.

Finalnie tworzymy więc jedynie alias tego samego obiektu, który dostępny jest od teraz pod dwiema nazwami cat i dog.

Aby uniknąć sytuacji przypisania tego samego obiektu do stałej/zmiennej, musimy wyraźnie stworzyć kopię obiektu.

Możemy to zrobić np. przez destrukturyzację obiektu i przypisanie zdestrukturyzowanych elementów do nowego obiektu

const cat = { ...dog }

Lub przez przepisanie własności obiektu dog do nowego pustego obiektu {} używając Object.assign().

const cat = Object.assign({}, dog)

Uwaga! Powyższe metody tworzą jedynie "płytką" kopię. Kopiowany jest tylko pierwszy poziom własności. Zagnieżdżone obiekty (obiekt w obiekcie) są wciąż przekazywane w postaci referencji, a nie kopi.

const deepObject = { level: 1, nested: { level: 2 } }

Przy skopiowaniu powyższego obiektu za pomocą { ...deepObject } lub Object.assign({}, deepObject), obiekt nested wciąż będzie przekazany jako referencja.

Rozwiązaniem tego problemu jest użycie funkcji structuredClone() lub metody _.cloneDeep() z biblioteki Lodash.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html index 7f7b35299..eecf8074c 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #073

🪲 Znajdź buga

console.log([] + [])
console.log([] + {})
console.log({} + [])
console.log({} + {})

console.log([] + + [])
console.log([] + + {})
console.log({} + + [])
console.log({} + + {})

W języku JavaScript operator + ma kilka zastosowań.

Jakie z nich wezmą udział w powyższych przykładach i co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log([] + []) // ""
console.log([] + {}) // "[object Object]"
console.log({} + []) // "[object Object]"
console.log({} + {}) // "[object Object][object Object]"

console.log([] + + []) // 0
console.log([] + + {}) // NaN
console.log({} + + []) // "[object Object]0"
console.log({} + + {}) // "[object Object]NaN"

Zacznijmy od tego, że dwa znaki + + oddzielone od siebie spacją są interpretowane jako dwa osobne znaki (operatory).

Nie ma tu więc mowy o zadziałaniu operatora inkrementacji ++.

Znak + może działać jako jednoargumentowy operator, gdy występuje w sąsiedztwie tylko jednego operandu.

Jego działanie skutkuje wtedy konwersją wartości na wartość liczbową.

Przykładowo + true lub +true (białe znaki są tutaj ignorowane) zwróci wartość 1.

Kluczowe jest wystąpienie wyłącznie jednego operandu z prawej strony operatora +.

Gdyby pojawiły się dwa operandy np. true + true to operator + zadziała już jako operator dodawania (choć wcześniej nastąpi też konwersja wartości logicznych na wartości liczbowe).

Wystąpienie dwóch operatorów + + oznacza, że drugi z nich na pewno po swojej lewej stronie nie ma operandu, więc zadziała jako jednoargumentowy operator.

Jednoargumentowy operator + ma też pierwszeństwo wykonywania przed operatorem dodawania +.

Wracając do przykładów, pierwsze cztery będą operacjami dodawania.

Dodawanie nie oznacza jednak zawsze dodawania wartości liczbowych.

Gdy jeden z operandów jest ciągiem znaków, operator ten zachowuje się jako operator konkatenacji czyli łączenia ze sobą ciągów znaków.

Gdy dodawane są wartości nie prymitywne (obiekty), w pierwszej kolejności następuje zamiana na wartości prymitywne.

Tablice konwertowane są na ciągi znaków.

Jeśli są puste, to konwertowane są do pustych ciągów znaków "".

Dodanie do siebie dwóch pustych tablic [] to więc to samo co dodanie do siebie dwóch pustych ciągów znaków, co finalnie daje nam pusty ciąg znaków.

Puste obiekty, które nie są tablicami, skonwertowane do ciągu znaków, zwracają "[object Object]".

Na pierwszy rzut oka może to wyglądać jak tablica z dwoma wartościami object, Object.

W rzeczywistości jest to jednak ciąg znaków, który zawiera nawias kwadratowy.

Jeśli dodamy więc pustą tablicę i pusty obiekt, to operator + połączy ze sobą dwa ciągi znaków: "" oraz "[object Object]", co finalnie da nam ciąg znaków "[object Object]".

Dodanie do siebie dwóch pustych obiektów, da nam zdublowane\ "[object Object][object Object]".

Gdy do gry wkracza dodatkowo jednoargumentowy operator +, jego prawy operand konwertowany jest do wartości liczbowej.

Pusta tablica zwraca wartość 0. Pusty obiekt zwraca wartość NaN.

Finalnie zachodzi dodawanie (konkatenacja) tych wartości z ciągami znaków (pustej tablicy, albo pustego obiektu) razem z ciągiem znaków "0" lub "NaN".

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html index 7ea2de234..5f314b9e8 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log([] + [])
console.log([] + {})
console.log({} + [])
console.log({} + {})

console.log([] + + [])
console.log([] + + {})
console.log({} + + [])
console.log({} + + {})
- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html index 02fa636d9..b4cded6ba 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W języku JavaScript operator + ma kilka zastosowań.

Jakie z nich wezmą udział w powyższych przykładach i co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html index 11172dfbc..dfce020ca 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html index 68642b55a..0387d84de 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log([] + []) // ""
console.log([] + {}) // "[object Object]"
console.log({} + []) // "[object Object]"
console.log({} + {}) // "[object Object][object Object]"

console.log([] + + []) // 0
console.log([] + + {}) // NaN
console.log({} + + []) // "[object Object]0"
console.log({} + + {}) // "[object Object]NaN"
- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html index 7ba2b162d..d2efcdc97 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Zacznijmy od tego, że dwa znaki + + oddzielone od siebie spacją są interpretowane jako dwa osobne znaki (operatory).

Nie ma tu więc mowy o zadziałaniu operatora inkrementacji ++.

Znak + może działać jako jednoargumentowy operator, gdy występuje w sąsiedztwie tylko jednego operandu.

Jego działanie skutkuje wtedy konwersją wartości na wartość liczbową.

Przykładowo + true lub +true (białe znaki są tutaj ignorowane) zwróci wartość 1.

Kluczowe jest wystąpienie wyłącznie jednego operandu z prawej strony operatora +.

Gdyby pojawiły się dwa operandy np. true + true to operator + zadziała już jako operator dodawania (choć wcześniej nastąpi też konwersja wartości logicznych na wartości liczbowe).

Wystąpienie dwóch operatorów + + oznacza, że drugi z nich na pewno po swojej lewej stronie nie ma operandu, więc zadziała jako jednoargumentowy operator.

Jednoargumentowy operator + ma też pierwszeństwo wykonywania przed operatorem dodawania +.

Wracając do przykładów, pierwsze cztery będą operacjami dodawania.

Dodawanie nie oznacza jednak zawsze dodawania wartości liczbowych.

Gdy jeden z operandów jest ciągiem znaków, operator ten zachowuje się jako operator konkatenacji czyli łączenia ze sobą ciągów znaków.

Gdy dodawane są wartości nie prymitywne (obiekty), w pierwszej kolejności następuje zamiana na wartości prymitywne.

Tablice konwertowane są na ciągi znaków.

Jeśli są puste, to konwertowane są do pustych ciągów znaków "".

Dodanie do siebie dwóch pustych tablic [] to więc to samo co dodanie do siebie dwóch pustych ciągów znaków, co finalnie daje nam pusty ciąg znaków.

Puste obiekty, które nie są tablicami, skonwertowane do ciągu znaków, zwracają "[object Object]".

Na pierwszy rzut oka może to wyglądać jak tablica z dwoma wartościami object, Object.

W rzeczywistości jest to jednak ciąg znaków, który zawiera nawias kwadratowy.

Jeśli dodamy więc pustą tablicę i pusty obiekt, to operator + połączy ze sobą dwa ciągi znaków: "" oraz "[object Object]", co finalnie da nam ciąg znaków "[object Object]".

Dodanie do siebie dwóch pustych obiektów, da nam zdublowane\ "[object Object][object Object]".

Gdy do gry wkracza dodatkowo jednoargumentowy operator +, jego prawy operand konwertowany jest do wartości liczbowej.

Pusta tablica zwraca wartość 0. Pusty obiekt zwraca wartość NaN.

Finalnie zachodzi dodawanie (konkatenacja) tych wartości z ciągami znaków (pustej tablicy, albo pustego obiektu) razem z ciągiem znaków "0" lub "NaN".

- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html index 3a75deb6b..ab69879c4 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #012

🪲 Znajdź buga

const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(user1 == user2)

Co zostanie zalogowane do konsoli z operacji porównania dwóch obiektów user1 i user2?

Czy będzie to wartość true czy false? A może jeszcze coś innego?

🧪 Rozwiązanie

const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(JSON.stringify(user1) === JSON.stringify(user2))

Zacznijmy od tego, że użycie operatora == lub === nie ma tutaj żadnego znaczenia. Typ porównywanych danych jest taki sam, więc ścisłe porównanie (===) zadziałałoby identycznie jak zwykłe (==).

Jednak mimo, że wartości obiektów user1 i user2 są takie same, ich porównanie zwraca fałsz, ponieważ są to dwa różne obiekty.

W poprzednich bugach (np. #001) dowiedziałeś się, że przypisywanie obiektów do stałych/zmiennych polega na przypisaniu jedynie ich referencji tj. adresu z pamięci RAM.

Oznacza to, że porównując wartości przypisane do stałych user1 i user2, porównujemy tak naprawdę jedynie adresy w pamięci RAM, w których zapisane są te obiekty. A te w naszym przypadku są różne.

Sytuacja ma się inaczej w przypadku porównywania typów pierwotnych jak ciągi znaków (string), liczby (number), wartości logiczne (boolean).

Możemy więc użyć obejścia i za pomocą JSON.stringify() przekonwertować obiekty na ciągi znaków. Następnie możemy porównać ciągi znaków i otrzymać true, już zgodnie z naszymi oczekiwaniami.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html index 77ad5dfcc..140906c22 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(user1 == user2)
- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html index 367c34e6b..b33683d75 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli z operacji porównania dwóch obiektów user1 i user2?

Czy będzie to wartość true czy false? A może jeszcze coś innego?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html index 122fd1bed..1433e5fbf 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html index 634b975c6..89c611206 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(JSON.stringify(user1) === JSON.stringify(user2))
- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html index 8f4ddbf39..5ed8f52b4 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Zacznijmy od tego, że użycie operatora == lub === nie ma tutaj żadnego znaczenia. Typ porównywanych danych jest taki sam, więc ścisłe porównanie (===) zadziałałoby identycznie jak zwykłe (==).

Jednak mimo, że wartości obiektów user1 i user2 są takie same, ich porównanie zwraca fałsz, ponieważ są to dwa różne obiekty.

W poprzednich bugach (np. #001) dowiedziałeś się, że przypisywanie obiektów do stałych/zmiennych polega na przypisaniu jedynie ich referencji tj. adresu z pamięci RAM.

Oznacza to, że porównując wartości przypisane do stałych user1 i user2, porównujemy tak naprawdę jedynie adresy w pamięci RAM, w których zapisane są te obiekty. A te w naszym przypadku są różne.

Sytuacja ma się inaczej w przypadku porównywania typów pierwotnych jak ciągi znaków (string), liczby (number), wartości logiczne (boolean).

Możemy więc użyć obejścia i za pomocą JSON.stringify() przekonwertować obiekty na ciągi znaków. Następnie możemy porównać ciągi znaków i otrzymać true, już zgodnie z naszymi oczekiwaniami.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html index 364f962df..be365ee69 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #100

🪲 Znajdź buga

const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)

Co zostanie zalogowane do konsoli?

Jak jest różnica między splice(), a slice()?

🧪 Rozwiązanie

const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)
// ["a", "b", "c", "d", "e", "f"]

W konsoli ujrzymy ["a", "b", "c", "d", "e", "f"].

letters.splice(1, 1) usuwa z tablicy jeden element pod indeksem 1 (czyli "z").

letters.splice(3, 0, "d") dodaje do tablicy element o wartości "d" w indeksie 3, bez jego usuwania (nadpisywania) oraz bez usuwania następnych elementów w zadanej ilości (0).

Następuje więc "wepchnięcie" nowego elementu, spychając istniejące elementy od indeksu 3 na dalsze pozycje.

Metoda Array.prototype.splice() modyfikuje oryginalną tablicę.

Tablica pod stałą letters jest więc mutowana, dlatego po zalogowaniu jej do konsoli widzimy zaktualizowany układ elementów.

Jeśli chcielibyśmy uniknąć mutacji sugerowaną alternatywą jest Array.prototype.toSpliced().

Jest to jednak nowa metoda, w chwili pisania tego tekstu, nie zaimplementowana jeszcze przez wszystkie silniki JavaScript.

Aktualnie obsługują ją przeglądarki Chrome, Edge, Opera, Safari, ale nie Firefox i środowiska uruchomieniowe Node.js, Deno.

Druga, użyta w przykładzie metoda to Array.prototype.slice().

Tworzy ona płytką kopię modyfikowanej tablicy i zwraca nowy zmodyfikowany jej kształt.

Płytka kopia oznacza, że w przypadku zagnieżdżonych tablic, również mogą wystąpić mutacje, tak jak w przypadku użycia splice().

Wywołanie letters.slice(0, 3) oraz letters.slice(3) nie wpływa w naszym przykładzie na oryginalną tablicę letters.

Żeby zobaczyć wynik działania tych metod, musielibyśmy zalogować ich wykonanie do konsoli.

letters.slice(0, 3) zwróciłoby wtedy tylko pierwsze trzy elementy tablicy.

Cięcie tablicy odbywa się tutaj od indeksu 0 do 3 (nie włączając 3).

letters.slice(3) to z kolei odcięcie fragmentu tablicy rozpoczynając od indeksu 3 aż do końca tablicy.

W naszym przypadku byłyby to trzy ostatnie elementy tablicy.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html index 0f3725d1a..ff306b0ee 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)
- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html index e766e5f7c..0a5e2f76b 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli?

Jak jest różnica między splice(), a slice()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html index 30da9fa70..8322351d9 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html index 76102b7bc..3cc9aba66 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)
// ["a", "b", "c", "d", "e", "f"]
- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html index f97ebac1f..ae5376f4b 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W konsoli ujrzymy ["a", "b", "c", "d", "e", "f"].

letters.splice(1, 1) usuwa z tablicy jeden element pod indeksem 1 (czyli "z").

letters.splice(3, 0, "d") dodaje do tablicy element o wartości "d" w indeksie 3, bez jego usuwania (nadpisywania) oraz bez usuwania następnych elementów w zadanej ilości (0).

Następuje więc "wepchnięcie" nowego elementu, spychając istniejące elementy od indeksu 3 na dalsze pozycje.

Metoda Array.prototype.splice() modyfikuje oryginalną tablicę.

Tablica pod stałą letters jest więc mutowana, dlatego po zalogowaniu jej do konsoli widzimy zaktualizowany układ elementów.

Jeśli chcielibyśmy uniknąć mutacji sugerowaną alternatywą jest Array.prototype.toSpliced().

Jest to jednak nowa metoda, w chwili pisania tego tekstu, nie zaimplementowana jeszcze przez wszystkie silniki JavaScript.

Aktualnie obsługują ją przeglądarki Chrome, Edge, Opera, Safari, ale nie Firefox i środowiska uruchomieniowe Node.js, Deno.

Druga, użyta w przykładzie metoda to Array.prototype.slice().

Tworzy ona płytką kopię modyfikowanej tablicy i zwraca nowy zmodyfikowany jej kształt.

Płytka kopia oznacza, że w przypadku zagnieżdżonych tablic, również mogą wystąpić mutacje, tak jak w przypadku użycia splice().

Wywołanie letters.slice(0, 3) oraz letters.slice(3) nie wpływa w naszym przykładzie na oryginalną tablicę letters.

Żeby zobaczyć wynik działania tych metod, musielibyśmy zalogować ich wykonanie do konsoli.

letters.slice(0, 3) zwróciłoby wtedy tylko pierwsze trzy elementy tablicy.

Cięcie tablicy odbywa się tutaj od indeksu 0 do 3 (nie włączając 3).

letters.slice(3) to z kolei odcięcie fragmentu tablicy rozpoczynając od indeksu 3 aż do końca tablicy.

W naszym przypadku byłyby to trzy ostatnie elementy tablicy.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html index 37d3e8192..574ed45c4 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #040

🪲 Znajdź buga

// 1
if ([]) {
console.log("[]")
}
if (["0"]) {
console.log('["0"]')
}

// 2
if ([] == false) {
console.log("[] == false")
}
if (["0"] == false) {
console.log('["0"] == false')
}

// 3
if ([] === false) {
console.log("[] === false")
}
if (["0"] === false) {
console.log('["0"] === false')
}

Chcemy wykonać jakiś kod, tylko w sytuacji gdy tablica będzie pusta. Którego z powyższych rozwiązań możemy do tego użyć?

🧪 Rozwiązanie

if ([].length === 0) {
console.log("Array is empty")
}

Żaden z trzech początkowych przykładów nie będzie się do nadawał do sprawdzenia, czy tablica jest pusta.

Po pierwsze, pusta tablica nie jest wartością fałszywą według listy wartości fałszywych w JavaScript, więc if ([]) odpada.

Po drugie, luźne porównanie == tablicy z wartością false jest najbliższe spełnieniu zadania, ale nie daje 100% pewności.

Po trzecie, ścisłe porównanie === odpada, bo porównywane typy danych [] i false się od siebie różnią.

W przypadku luźnego porównania tablicy z wartością logiczną, == sprowadzi najpierw wartości do jednego typu, którym będzie wartość liczbowa (tak działa algorytm tego operatora).

[] == false zamieni się na Number([]) === Number(false). Typy porównywanych danych się zgadzają, więc luźne porównanie zastosuje już algorytm porównania ścisłego.

Wartość liczbowa z pustej tablicy zostanie skonwertowana do wartości 0. Wartość liczbowa z wartości false da również 0.

Mamy zwycięzcę... prawie. Bo co jeśli zamiast pustej tablicy, pojawi się np. [0], albo ["0"]?

Funkcja Number() sprowadzi taką tablicę również do wartości 0. 🤯

Nie możemy więc polegać na porównaniu [] == false, jeśli zależy nam na wykonaniu instrukcji warunkowej tylko w przypadku gdy tablica jest pusta.

Rozsądną opcją może być użycie własności length na obiekcie tablicy. Zwrócona zostanie wtedy wartość liczbowa wskazująca na ilość elementów znajdujących się w tablicy.

Jeśli zwróconą wartością będzie wartość 0, to mamy wtedy pewność, że tablica nie zawiera żadnych elementów (jest pusta).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html index edfeaae58..fe2438525 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
// 1
if ([]) {
console.log("[]")
}
if (["0"]) {
console.log('["0"]')
}

// 2
if ([] == false) {
console.log("[] == false")
}
if (["0"] == false) {
console.log('["0"] == false')
}

// 3
if ([] === false) {
console.log("[] === false")
}
if (["0"] === false) {
console.log('["0"] === false')
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html index 33ac55f04..cffed691b 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy wykonać jakiś kod, tylko w sytuacji gdy tablica będzie pusta. Którego z powyższych rozwiązań możemy do tego użyć?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html index cba6e5521..fd733a708 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html index 6cd2949cb..3412427eb 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
if ([].length === 0) {
console.log("Array is empty")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html index d51834d69..3dd814de3 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Żaden z trzech początkowych przykładów nie będzie się do nadawał do sprawdzenia, czy tablica jest pusta.

Po pierwsze, pusta tablica nie jest wartością fałszywą według listy wartości fałszywych w JavaScript, więc if ([]) odpada.

Po drugie, luźne porównanie == tablicy z wartością false jest najbliższe spełnieniu zadania, ale nie daje 100% pewności.

Po trzecie, ścisłe porównanie === odpada, bo porównywane typy danych [] i false się od siebie różnią.

W przypadku luźnego porównania tablicy z wartością logiczną, == sprowadzi najpierw wartości do jednego typu, którym będzie wartość liczbowa (tak działa algorytm tego operatora).

[] == false zamieni się na Number([]) === Number(false). Typy porównywanych danych się zgadzają, więc luźne porównanie zastosuje już algorytm porównania ścisłego.

Wartość liczbowa z pustej tablicy zostanie skonwertowana do wartości 0. Wartość liczbowa z wartości false da również 0.

Mamy zwycięzcę... prawie. Bo co jeśli zamiast pustej tablicy, pojawi się np. [0], albo ["0"]?

Funkcja Number() sprowadzi taką tablicę również do wartości 0. 🤯

Nie możemy więc polegać na porównaniu [] == false, jeśli zależy nam na wykonaniu instrukcji warunkowej tylko w przypadku gdy tablica jest pusta.

Rozsądną opcją może być użycie własności length na obiekcie tablicy. Zwrócona zostanie wtedy wartość liczbowa wskazująca na ilość elementów znajdujących się w tablicy.

Jeśli zwróconą wartością będzie wartość 0, to mamy wtedy pewność, że tablica nie zawiera żadnych elementów (jest pusta).

- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html index 23c0f7acb..9dda5fda8 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #059

🪲 Znajdź buga

let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo)
console.log(bar)
console.log(foo.prop)

Co zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo) // { val: 2 }
console.log(bar) // { val: 1, prop: { val: 2 } }
console.log(foo.prop) // undefined

Logując zmienną foo, dostaniemy obiekt { val: 2 }, bo taki został do niej przypisany w 3 linii.

Zwróć uwagę, że ta operacja przypisania ma efekt nadpisania, tzn. przypisujemy nową wartość do zmiennej foo. Nie ma tu miejsca modyfikacja własności foo.val, więc nie wpływa to na początkowy obiekt przypisany (przez referencję) do zmiennej bar.

Zmienna bar zwiera więc obiekt z własnością val o wartości 1. Dodatkowo w obiekcie pojawia się też własność prop, bo zmienna bar to tak naprawdę jedynie alias początkowego obiektu ze zmiennej foo.

W 3 lini, przypisanie foo.prop działa też dla aliasu czyli, aktywuje przypisania też dla bar.prop.

Moglibyśmy więc to zapisać też jako bar.prop = foo = { val: 2 }.

W tym miejscu "ginie" też początkowa wartość zmiennej foo, którą nadpisujemy nowym obiektem, który nie jest już związany referencją z obiektem przypisanym do zmiennej bar.

Od tego momentu, obiekt w zmiennej foo jest już nowym obiektem, który nie ma pojęcia o własności prop, dlatego loguje undefined.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html index 4d4fcaff7..af26d8e7f 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo)
console.log(bar)
console.log(foo.prop)
- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html index 3748dffdb..07e0a66ff 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html index b832246fa..e4a7a2b6b 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html index e9123c7b2..7759fef42 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo) // { val: 2 }
console.log(bar) // { val: 1, prop: { val: 2 } }
console.log(foo.prop) // undefined
- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html index 9f6dc07a9..92c23942a 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Logując zmienną foo, dostaniemy obiekt { val: 2 }, bo taki został do niej przypisany w 3 linii.

Zwróć uwagę, że ta operacja przypisania ma efekt nadpisania, tzn. przypisujemy nową wartość do zmiennej foo. Nie ma tu miejsca modyfikacja własności foo.val, więc nie wpływa to na początkowy obiekt przypisany (przez referencję) do zmiennej bar.

Zmienna bar zwiera więc obiekt z własnością val o wartości 1. Dodatkowo w obiekcie pojawia się też własność prop, bo zmienna bar to tak naprawdę jedynie alias początkowego obiektu ze zmiennej foo.

W 3 lini, przypisanie foo.prop działa też dla aliasu czyli, aktywuje przypisania też dla bar.prop.

Moglibyśmy więc to zapisać też jako bar.prop = foo = { val: 2 }.

W tym miejscu "ginie" też początkowa wartość zmiennej foo, którą nadpisujemy nowym obiektem, który nie jest już związany referencją z obiektem przypisanym do zmiennej bar.

Od tego momentu, obiekt w zmiennej foo jest już nowym obiektem, który nie ma pojęcia o własności prop, dlatego loguje undefined.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html index e2bff2592..95fbd342f 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #032

🪲 Znajdź buga

setTimeout(() => {
console.log("setTimeout")
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response)
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response)
})

queueMicrotask(() => {
console.log("Microtask")
})

console.log("Global context")

W jakiej kolejności do konsoli zostaną zalogowane odpowiedzi?

🧪 Rozwiązanie

setTimeout(() => {
console.log("setTimeout") // 4
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response) // 5
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response) // 2
})

queueMicrotask(() => {
console.log("Microtask") // 3
})

console.log("Global context") // 1

Do konsoli zostaną zalogowane odpowiedzi w następującej kolejności:

  1. Global context
  2. Promise
  3. Microtask
  4. setTimeout
  5. Promise setTimeout

JavaScript jest jednowątkowym językiem programowania. Nie możemy wykonać równolegle wielu fragmentów kodu poprzez wiele wątków procesora (chyba, że z pomocą Worker'ów, ale to osobny temat).

Nieporozumienie, które może wynikać z uznawania JavaScriptu jako języka wielowątkowego jest możliwość asynchroniczność.

W JavaScript asynchroniczność oznacza, że możemy oddelegować na później wykonywanie kodu, który do wykonania potrzebuje więcej czasu.

Każda interakcja na stronie internetowej, obsługiwana przez JavaScript, zawiesza działanie strony (zamrażając możliwość wykonywania na niej jakichkolwiek akcji) do czasu ukończenia wykonywania kodu przez procesor. Zazwyczaj dzieje się to jednak tak szybko, że nawet nie dostrzegamy wynikających z tego opóźnień.

Są jednak operacje, które wymagają więcej czasu do zrealizowania, nie tylko z uwagi na złożoność obliczeniową, ale także na opóźnienia wynikające z dostępu do danych (np. odpytując zewnętrzne API).

Gdyby tego typu operacje były wykonywane synchronicznie, strona kompletnie zawieszałaby się (przewijanie, czy klikanie w przyciski byłoby zamrożone), aż do momentu pobrania danych.

Rozwiązaniem tego problemu w JavaScript jest pętla zdarzeń (event loop), która regularnie wykonuje zadania, jakimi jest wykonanie kodu. Jednocześnie zadania wywołane asynchronicznie są umieszczane w kolejce do wykonania podczas kolejnego cyklu pętli zdarzeń.

Asynchroniczna kolejka zadań jest jeszcze dodatkowo podzielona na zwykłe zadania i zadania mikro.

Zadaniem zwykłym, które wpadnie do kolejki asynchronicznej jest np. setTimeout(), a mikro zadaniem Promise.

Mikro zadania z kolejki wykonywane są na końcu aktualnej iteracji pętli zdarzeń, natomiast standardowe zadania z kolejki, na początku kolejnej iteracji.

Kod z przykładu wykonuje się więc w następującej kolejności:

  1. Global context jest wywołany synchronicznie, czyli w pierwszej kolejności, w aktualnej iteracji pętli zdarzeń
  2. Promise i queueMicrotask() to mikro zadania, oddelegowane do wykonania na koniec aktualnej iteracji pętli zdarzeń, wykonywane w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw Promise, potem Microtask)
  3. setTimeout() to zadania oddelegowane do wykonania na początek kolejnej iteracji pętli zdarzeń, wykonywane również w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw setTimeout() wywołany wewnątrz mikro zadania Promise, następnie setTimeout() wywołany w globalnym kontekście)

Zdefiniowanie zadania setTimeout() w mikro zadaniu Promise oznacza, że wykonywane mikro zadanie Promise na początku aktualnej iteracji pętli zdarzeń, oddeleguje zadanie setTimeout() na początek kolejnej iteracji pętli. Efekt działania jest więc taki sam, jak gdyby setTimeout() było wywołane w globalnym kontekście, bez zagnieżdżenia wewnątrz mikro zadania Promise.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html index 3e3007af6..6a503d2f2 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("setTimeout")
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response)
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response)
})

queueMicrotask(() => {
console.log("Microtask")
})

console.log("Global context")
- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html index 83bddbe4f..ed80b538c 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W jakiej kolejności do konsoli zostaną zalogowane odpowiedzi?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html index b9ead1650..69cf234bf 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html index 3e9d21694..c0ff1284b 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("setTimeout") // 4
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response) // 5
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response) // 2
})

queueMicrotask(() => {
console.log("Microtask") // 3
})

console.log("Global context") // 1
- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html index b8854a0fd..8d8000064 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Do konsoli zostaną zalogowane odpowiedzi w następującej kolejności:

  1. Global context
  2. Promise
  3. Microtask
  4. setTimeout
  5. Promise setTimeout

JavaScript jest jednowątkowym językiem programowania. Nie możemy wykonać równolegle wielu fragmentów kodu poprzez wiele wątków procesora (chyba, że z pomocą Worker'ów, ale to osobny temat).

Nieporozumienie, które może wynikać z uznawania JavaScriptu jako języka wielowątkowego jest możliwość asynchroniczność.

W JavaScript asynchroniczność oznacza, że możemy oddelegować na później wykonywanie kodu, który do wykonania potrzebuje więcej czasu.

Każda interakcja na stronie internetowej, obsługiwana przez JavaScript, zawiesza działanie strony (zamrażając możliwość wykonywania na niej jakichkolwiek akcji) do czasu ukończenia wykonywania kodu przez procesor. Zazwyczaj dzieje się to jednak tak szybko, że nawet nie dostrzegamy wynikających z tego opóźnień.

Są jednak operacje, które wymagają więcej czasu do zrealizowania, nie tylko z uwagi na złożoność obliczeniową, ale także na opóźnienia wynikające z dostępu do danych (np. odpytując zewnętrzne API).

Gdyby tego typu operacje były wykonywane synchronicznie, strona kompletnie zawieszałaby się (przewijanie, czy klikanie w przyciski byłoby zamrożone), aż do momentu pobrania danych.

Rozwiązaniem tego problemu w JavaScript jest pętla zdarzeń (event loop), która regularnie wykonuje zadania, jakimi jest wykonanie kodu. Jednocześnie zadania wywołane asynchronicznie są umieszczane w kolejce do wykonania podczas kolejnego cyklu pętli zdarzeń.

Asynchroniczna kolejka zadań jest jeszcze dodatkowo podzielona na zwykłe zadania i zadania mikro.

Zadaniem zwykłym, które wpadnie do kolejki asynchronicznej jest np. setTimeout(), a mikro zadaniem Promise.

Mikro zadania z kolejki wykonywane są na końcu aktualnej iteracji pętli zdarzeń, natomiast standardowe zadania z kolejki, na początku kolejnej iteracji.

Kod z przykładu wykonuje się więc w następującej kolejności:

  1. Global context jest wywołany synchronicznie, czyli w pierwszej kolejności, w aktualnej iteracji pętli zdarzeń
  2. Promise i queueMicrotask() to mikro zadania, oddelegowane do wykonania na koniec aktualnej iteracji pętli zdarzeń, wykonywane w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw Promise, potem Microtask)
  3. setTimeout() to zadania oddelegowane do wykonania na początek kolejnej iteracji pętli zdarzeń, wykonywane również w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw setTimeout() wywołany wewnątrz mikro zadania Promise, następnie setTimeout() wywołany w globalnym kontekście)

Zdefiniowanie zadania setTimeout() w mikro zadaniu Promise oznacza, że wykonywane mikro zadanie Promise na początku aktualnej iteracji pętli zdarzeń, oddeleguje zadanie setTimeout() na początek kolejnej iteracji pętli. Efekt działania jest więc taki sam, jak gdyby setTimeout() było wywołane w globalnym kontekście, bez zagnieżdżenia wewnątrz mikro zadania Promise.

- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html index 2af61fde8..85ac38316 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #057

🪲 Znajdź buga

console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log(null || undefined ?? "foo")

Jakie wartości zostaną zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log((null || undefined) ?? "foo")

W przykładzie z błędem, 7 linia wyrzuci do konsoli SyntaxError.

Treść błędu może się różnić w zależności od kontekstu, w którym kod zostanie wywołany.

W przypadku przekazania kodu jako argument do console.log(), dostaniemy informację o brakującym domknięciu nawiasu na liście argumentów.

SyntaxError sprowadza się jednak do niedozwolonej składni w języku JavaScript. Po prostu nie możemy użyć danej konstrukcji.

I taką niedozwoloną konstrukcją jest użycie operatora ?? na równi z operatorami || lub &&.

Po prostu nie możemy tego robić, musimy użyć nawiasów dla wyraźnego zgrupowania wyrażeń, które chcemy aby zostały wykonane w pierwszej kolejności.

Dokumentacja JavaScript od Mozilli (MDN), tłumaczy, że jednoczesne użycie ?? w połączeniu z || lub && mogłoby wprowadzać w kodzie błędy wynikające z wystąpienia zwarcia (short circuiting).

Warto zauważyć, że tabela priorytetów wykonywania operatorów plasuje && wyżej niż ||, ale ze względu na efekt zwarcia, który jeśli wystąpi, totalnie ignoruje drugi operand, co również może prowadzić do błędów w kodzie związanych z oczekiwaniem wywołania funkcji w takim wyrażeniu.

Przykładowo, przy wyrażeniu true || alert("bar") && false zadziała zwarcie na wartości true i cały dalszy kod nie zostanie wykonany, mimo że priorytet wykonywania operatorów mógłby sugerować, że funkcja alert("bar") powinna zostać wykonana w celu ewaluacji wartości operatora &&.

W tym kontekście, wyrzucanie błędu składniowego w momencie równoległego użycia ?? z && lub || wydaje się być naciągane.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html index 524a8d682..4618eedd6 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log(null || undefined ?? "foo")
- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html index c13faa3a5..6a8a4df21 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html index 4bf493270..d8a6798d2 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html index 0ea1f119f..55ec90c89 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log((null || undefined) ?? "foo")
- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html index c79d01cf4..40a31d4f3 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, 7 linia wyrzuci do konsoli SyntaxError.

Treść błędu może się różnić w zależności od kontekstu, w którym kod zostanie wywołany.

W przypadku przekazania kodu jako argument do console.log(), dostaniemy informację o brakującym domknięciu nawiasu na liście argumentów.

SyntaxError sprowadza się jednak do niedozwolonej składni w języku JavaScript. Po prostu nie możemy użyć danej konstrukcji.

I taką niedozwoloną konstrukcją jest użycie operatora ?? na równi z operatorami || lub &&.

Po prostu nie możemy tego robić, musimy użyć nawiasów dla wyraźnego zgrupowania wyrażeń, które chcemy aby zostały wykonane w pierwszej kolejności.

Dokumentacja JavaScript od Mozilli (MDN), tłumaczy, że jednoczesne użycie ?? w połączeniu z || lub && mogłoby wprowadzać w kodzie błędy wynikające z wystąpienia zwarcia (short circuiting).

Warto zauważyć, że tabela priorytetów wykonywania operatorów plasuje && wyżej niż ||, ale ze względu na efekt zwarcia, który jeśli wystąpi, totalnie ignoruje drugi operand, co również może prowadzić do błędów w kodzie związanych z oczekiwaniem wywołania funkcji w takim wyrażeniu.

Przykładowo, przy wyrażeniu true || alert("bar") && false zadziała zwarcie na wartości true i cały dalszy kod nie zostanie wykonany, mimo że priorytet wykonywania operatorów mógłby sugerować, że funkcja alert("bar") powinna zostać wykonana w celu ewaluacji wartości operatora &&.

W tym kontekście, wyrzucanie błędu składniowego w momencie równoległego użycia ?? z && lub || wydaje się być naciągane.

- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html index fa2f57df4..af8562833 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #079

🪲 Znajdź buga

const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}, 500)
},
}

myObject.showMessage()

Chcemy zalogować do konsoli, z lekkim opóźnieniem, wiadomość powitalną zdefiniowaną we własności obiektu.

Co dokładnie zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}.bind(myObject), 500)
},
}

myObject.showMessage()

W błędnym przykładzie do konsoli zostanie zalogowana wartość undefined.

Globalna funkcja setTimeout() to tak naprawdę metoda globalnego obiektu (window lub global).

Wywołanie this wewnątrz zwrotnej funkcji (callback) przekazanej do setTimeout() skutkuje więc wskazywaniem this na obiekt globalny, który nie ma zdefiniowanej własności message.

this jest zawsze zależne od kontekstu, w którym zostaje wywołane.

Aby przypisać interesujący nas kontekst obiektu myObject możemy użyć metody bind() na anonimowej funkcji przekazywanej jako callback do setTimeout().

Innym sposobem może być zamienienie deklaracji anonimowej funkcji callback na wyrażenie funkcji strzałkowej.

Dzięki temu this będzie odnosiło się do wyższego kontekstu, ponieważ funkcje strzałkowe nie mają własnego wiązania dla this.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html index 7f1c53b5c..a2308b1b3 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}, 500)
},
}

myObject.showMessage()
- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html index 8dcb61b5b..f4418c16f 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy zalogować do konsoli, z lekkim opóźnieniem, wiadomość powitalną zdefiniowaną we własności obiektu.

Co dokładnie zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html index ce04059ba..2f0015eb3 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html index 62598ed56..2ff6718cc 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}.bind(myObject), 500)
},
}

myObject.showMessage()
- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html index dc845df94..b41c3a88f 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W błędnym przykładzie do konsoli zostanie zalogowana wartość undefined.

Globalna funkcja setTimeout() to tak naprawdę metoda globalnego obiektu (window lub global).

Wywołanie this wewnątrz zwrotnej funkcji (callback) przekazanej do setTimeout() skutkuje więc wskazywaniem this na obiekt globalny, który nie ma zdefiniowanej własności message.

this jest zawsze zależne od kontekstu, w którym zostaje wywołane.

Aby przypisać interesujący nas kontekst obiektu myObject możemy użyć metody bind() na anonimowej funkcji przekazywanej jako callback do setTimeout().

Innym sposobem może być zamienienie deklaracji anonimowej funkcji callback na wyrażenie funkcji strzałkowej.

Dzięki temu this będzie odnosiło się do wyższego kontekstu, ponieważ funkcje strzałkowe nie mają własnego wiązania dla this.

- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html index 65eec0900..49021a123 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html @@ -7,8 +7,8 @@ - - + +
@@ -19,7 +19,7 @@ Zamiana true/false poprzez parseInt() zwraca NaN w obu przypadkach.

Konwersja liczb z innych systemów liczbowych np. binarnego (zapisywanego z prefiksem 0b), zwraca wartość liczbową w systemie dziesiętnym zarówno poprzez Number() jak i parseInt().

Różnica w wartości zwracanej pojawia się, gdy jako argument funkcji przekażemy liczbę wewnątrz ciągu znaków np. "0b0111".

Number() zwróci wartość w systemie dziesiętnym, jak poprzednio.\ parseInt() zachowa się już jednak inaczej i zwróci 0...

Tak jak we wcześniejszym przykładzie " 0 bar ", dla parseInt() liczy się tylko pierwsza liczba, którą rozpozna w ciągu znaków. Przykładowo parseInt("123abc") zwróci 123.

Warto zaznaczyć, że wartości można też konwertować na typ liczbowy za pomocą jednoargumentowego operatora +. Używa on tego samego algorytmu co Number() z jednym, małym wyjątkiem... 🙃

Dla dużych wartości liczbowych, konwersja wartości typu BigInt poprzez Number() zwróci przybliżoną wartość w postaci liczbowej.

Używając operatora + dla konwersji wartości BigInt otrzymamy błąd Cannot convert a BigInt value to a number.

Warto też wiedzieć, że parseInt() jest również dostępny jako metoda Number.parseInt(). Na szczęście nie ma między nimi różnic i obie działają tak samo.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html index f32aa8a34..69ece1c10 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(Number("123"))
console.log(parseInt("123"))

console.log(Number(""))
console.log(parseInt(""))

console.log(Number(" 0 "))
console.log(parseInt(" 0 "))

console.log(Number(" 0 bar "))
console.log(parseInt(" 0 bar "))

console.log(Number(" foo 0 bar "))
console.log(parseInt(" foo 0 bar "))

console.log(Number(null))
console.log(parseInt(null))

console.log(Number(undefined))
console.log(parseInt(undefined))

console.log(Number(true))
console.log(parseInt(true))

console.log(Number(0b0111))
console.log(parseInt(0b0111))

console.log(Number("0b0111"))
console.log(parseInt("0b0111"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html index 7f14051fb..e999432a7 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcąc zamienić jakąś nienumeryczną wartość na liczbę, możemy użyć kilku rozwiązań, m.in. funkcji Number() oraz parseInt().

Czy obie funkcje zwracają te same wartości dla tych samych argumentów?

- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html index 9718520cb..3a4a215eb 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html index df032a9de..0db2a10e1 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(Number("123")) // 123
console.log(parseInt("123")) // 123

console.log(Number("")) // 0
console.log(parseInt("")) // NaN

console.log(Number(" 0 ")) // 0
console.log(parseInt(" 0 ")) // 0

console.log(Number(" 0 bar ")) // NaN
console.log(parseInt(" 0 bar ")) // 0

console.log(Number(" foo 0 bar ")) // NaN
console.log(parseInt(" foo 0 bar ")) // NaN

console.log(Number(null)) // 0
console.log(parseInt(null)) // NaN

console.log(Number(undefined)) // NaN
console.log(parseInt(undefined)) // NaN

console.log(Number(true)) // 1
console.log(parseInt(true)) // NaN

console.log(Number(0b0111)) // 7
console.log(parseInt(0b0111)) // 7

console.log(Number("0b0111")) // 7
console.log(parseInt("0b0111")) // 0
- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html index 06c5f3538..61d2a26e7 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html @@ -7,8 +7,8 @@ - - + +
@@ -18,7 +18,7 @@ Zamiana null poprzez praseInt() zwraca NaN.

Może to być bardzo mylące z uwagi na to, że dla wartości undefined, obie funkcje zwracają NaN.

Zamiana true/false poprzez Number() zwraca 1/0.\ Zamiana true/false poprzez parseInt() zwraca NaN w obu przypadkach.

Konwersja liczb z innych systemów liczbowych np. binarnego (zapisywanego z prefiksem 0b), zwraca wartość liczbową w systemie dziesiętnym zarówno poprzez Number() jak i parseInt().

Różnica w wartości zwracanej pojawia się, gdy jako argument funkcji przekażemy liczbę wewnątrz ciągu znaków np. "0b0111".

Number() zwróci wartość w systemie dziesiętnym, jak poprzednio.\ parseInt() zachowa się już jednak inaczej i zwróci 0...

Tak jak we wcześniejszym przykładzie " 0 bar ", dla parseInt() liczy się tylko pierwsza liczba, którą rozpozna w ciągu znaków. Przykładowo parseInt("123abc") zwróci 123.

Warto zaznaczyć, że wartości można też konwertować na typ liczbowy za pomocą jednoargumentowego operatora +. Używa on tego samego algorytmu co Number() z jednym, małym wyjątkiem... 🙃

Dla dużych wartości liczbowych, konwersja wartości typu BigInt poprzez Number() zwróci przybliżoną wartość w postaci liczbowej.

Używając operatora + dla konwersji wartości BigInt otrzymamy błąd Cannot convert a BigInt value to a number.

Warto też wiedzieć, że parseInt() jest również dostępny jako metoda Number.parseInt(). Na szczęście nie ma między nimi różnic i obie działają tak samo.

- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html index 2160a3a34..c7a8d5324 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #033

🪲 Znajdź buga

console.log(!"")
console.log(!" ")
console.log(!!"")
console.log(!!" ")

console.log(Boolean(""))
console.log(Boolean(" "))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(!"") // true
console.log(!" ") // false
console.log(!!"") // false
console.log(!!" ") // true

console.log(Boolean("")) // false
console.log(Boolean(" ")) // true

Operator negacji (logiczne NIE !), odwraca prawdziwość/fałszywość i konwertuje ją do wartości logicznej.

Dl wartości !true zostanie zwrócona więc odwrotność, czyli false, a dla !false, true.

W przypadku gdy operator ! zostaje użyty z wartością inną niż logiczna (boolean), wtedy pod uwagę brana jest prawdziwość (truthy) lub fałszywość (falsy) operandu i zwracana jest jego odwrotność w postaci logicznej (false lub true).

Pusty ciąg znaków "" w JavaScript jest wartością fałszywą, więc jej zanegowanie da nam wartość logiczną true, a podwójne zanegowanie wartość false.

Użycie podwójnego operatora negacji (!!) jest równoznaczne z użyciem konstruktora (Boolean), czyli konwersją wartości prawdziwych/fałszywych na logiczne true/false.

Gdy jednak ciąg znaków nie jest pusty i zawiera choćby biały znak " " jest już wtedy interpretowany jako wartość prawdziwa, więc negacja takiej wartości da nam false.

Sytuacja z pustym ciągiem znaków i ciągiem znaków składającym się z białych znaków może być myląca, szczególnie gdy porównamy to z działaniem konstruktora Number, ale to już jest temat na innego buga...

Rozwiązaniem problematyczności tych zjawisk jest tylko i wyłącznie zapamiętanie w jaki sposób JavaScript interpretuje kod.

Mocno wskazane jest też testowanie kodu przed wdrożeniem go na produkcję.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html index 96022f052..398e280ef 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(!"")
console.log(!" ")
console.log(!!"")
console.log(!!" ")

console.log(Boolean(""))
console.log(Boolean(" "))
- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html index 9838a592f..d95962424 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html index faac290cc..b5ef922f9 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html index 79d1fbdaa..778559f27 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(!"") // true
console.log(!" ") // false
console.log(!!"") // false
console.log(!!" ") // true

console.log(Boolean("")) // false
console.log(Boolean(" ")) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html index 3de67a2ad..85bd820a7 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Operator negacji (logiczne NIE !), odwraca prawdziwość/fałszywość i konwertuje ją do wartości logicznej.

Dl wartości !true zostanie zwrócona więc odwrotność, czyli false, a dla !false, true.

W przypadku gdy operator ! zostaje użyty z wartością inną niż logiczna (boolean), wtedy pod uwagę brana jest prawdziwość (truthy) lub fałszywość (falsy) operandu i zwracana jest jego odwrotność w postaci logicznej (false lub true).

Pusty ciąg znaków "" w JavaScript jest wartością fałszywą, więc jej zanegowanie da nam wartość logiczną true, a podwójne zanegowanie wartość false.

Użycie podwójnego operatora negacji (!!) jest równoznaczne z użyciem konstruktora (Boolean), czyli konwersją wartości prawdziwych/fałszywych na logiczne true/false.

Gdy jednak ciąg znaków nie jest pusty i zawiera choćby biały znak " " jest już wtedy interpretowany jako wartość prawdziwa, więc negacja takiej wartości da nam false.

Sytuacja z pustym ciągiem znaków i ciągiem znaków składającym się z białych znaków może być myląca, szczególnie gdy porównamy to z działaniem konstruktora Number, ale to już jest temat na innego buga...

Rozwiązaniem problematyczności tych zjawisk jest tylko i wyłącznie zapamiętanie w jaki sposób JavaScript interpretuje kod.

Mocno wskazane jest też testowanie kodu przed wdrożeniem go na produkcję.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html index b7a1906bd..5c8f45c69 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #094

🪲 Znajdź buga

const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)

Wszystkie 6 wywołań zwróci te same wartości, tablicę ["a", "b", "c"].

Funkcja fn za pomocą operatora ... tworzy listę przekazanych do niej argumentów, a następnie zwraca utworzoną w ten sposób tablicę z wartościami przekazanymi w argumentach.

console.log(fn("a", "b", "c")) zaloguje do konsoli wartości zwrócone z wywołanej funkcji fn, co skutkuje stworzeniem z listy przekazanych argumentów, tablicy ["a", "b", "c"].

console.log.call(null, ["a", "b", "c"]) za pomocą metody call wywoływana jest funkcja console.log co stanowi ekwiwalent wywołania console.log(["a", "b", "c"]) z kontekstem null, czyli bez wskazywania na konkretny obiekt, który byłby dostępny pod this.

console.log(Function.call.call(fn, null, "a", "b", "c")) loguje do konsoli efekt wywołania metody call() na funkcji utworzonej przez wywołanie poprzedniej metody call(), która to tworzy anonimowy obiekt funkcji, tak samo jak gdybyśmy wywołali Function().

Początkowa funkcja w takim ciągu przestaje mieść znaczenie. Widać to na kolejnym przykładzie console.log(fn.call.call(fn, null, "a", "b", "c")), który zachowuje się tak samo.

Łańcuch .call.call mógłby zawierać znacznie więcej powtórzeń nie zmieniającą ostatecznego działania. Początkowa funkcja na której rozpoczyna się ciąg wielu wywołań .call traci wtedy na znaczeniu.

Finalnie liczą się tylko 2 ostatnie elementy. Wywołanie poprzez metodę call() funkcji, która również jest funkcją call i nie implementuje dodatkowego działania.

Następuje więc przesunięcie. Kontekst przekazany jako pierwszy argument do call() staje się implementacją wywoływanej funkcji.

Kolejny argument null staje się kontekstem dla ewentualnego wywołania this, a następne argumenty stają się argumentami przekazanymi już do docelowej funkcji (w naszym przypadku fn).

Ostatnim przykładem udowadniającym to działanie jest użycie setTimeout, który służy jedynie za "dawcę", na którym można rozpocząć wywoływanie ciągu .call.

Warto też wspomnieć o bliźniaczym odpowiedniku metody call(), apply().

Jedyna różnica pomiędzy tymi metodami jest taka, że call() przyjmuje listę argumentów (tak jak standardowa funkcja), a apply() przyjmuje tablicę zawierającą docelowe argumenty.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html index d9bd76563..6af69f35a 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html index dcd59248d..e231b8071 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html index 4abbbfd37..3c98c4dab 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html index 4eecfc248..beb59713a 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html index 945dbfed7..121d3eec9 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wszystkie 6 wywołań zwróci te same wartości, tablicę ["a", "b", "c"].

Funkcja fn za pomocą operatora ... tworzy listę przekazanych do niej argumentów, a następnie zwraca utworzoną w ten sposób tablicę z wartościami przekazanymi w argumentach.

console.log(fn("a", "b", "c")) zaloguje do konsoli wartości zwrócone z wywołanej funkcji fn, co skutkuje stworzeniem z listy przekazanych argumentów, tablicy ["a", "b", "c"].

console.log.call(null, ["a", "b", "c"]) za pomocą metody call wywoływana jest funkcja console.log co stanowi ekwiwalent wywołania console.log(["a", "b", "c"]) z kontekstem null, czyli bez wskazywania na konkretny obiekt, który byłby dostępny pod this.

console.log(Function.call.call(fn, null, "a", "b", "c")) loguje do konsoli efekt wywołania metody call() na funkcji utworzonej przez wywołanie poprzedniej metody call(), która to tworzy anonimowy obiekt funkcji, tak samo jak gdybyśmy wywołali Function().

Początkowa funkcja w takim ciągu przestaje mieść znaczenie. Widać to na kolejnym przykładzie console.log(fn.call.call(fn, null, "a", "b", "c")), który zachowuje się tak samo.

Łańcuch .call.call mógłby zawierać znacznie więcej powtórzeń nie zmieniającą ostatecznego działania. Początkowa funkcja na której rozpoczyna się ciąg wielu wywołań .call traci wtedy na znaczeniu.

Finalnie liczą się tylko 2 ostatnie elementy. Wywołanie poprzez metodę call() funkcji, która również jest funkcją call i nie implementuje dodatkowego działania.

Następuje więc przesunięcie. Kontekst przekazany jako pierwszy argument do call() staje się implementacją wywoływanej funkcji.

Kolejny argument null staje się kontekstem dla ewentualnego wywołania this, a następne argumenty stają się argumentami przekazanymi już do docelowej funkcji (w naszym przypadku fn).

Ostatnim przykładem udowadniającym to działanie jest użycie setTimeout, który służy jedynie za "dawcę", na którym można rozpocząć wywoływanie ciągu .call.

Warto też wspomnieć o bliźniaczym odpowiedniku metody call(), apply().

Jedyna różnica pomiędzy tymi metodami jest taka, że call() przyjmuje listę argumentów (tak jak standardowa funkcja), a apply() przyjmuje tablicę zawierającą docelowe argumenty.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html index 6d82968d1..8a7a4e3d0 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #087

🪲 Znajdź buga

console.log(037 - 027)

Jaki wynik działania zostanie zalogowany do konsoli?

🧪 Rozwiązanie

console.log(037 - 027) // 8
console.log(0o37 - 0o27) // 8

Działanie 037 - 027 w trybie nieścisłym zwróci wynik 8.

Tryb nieścisły pozwala na interpretację liczba zaczynających się zerem jako liczb oktalnych (ósemkowych).

037 w systemie ósemkowym to 31 w systemie dziesiętnym.

027 w systemie ósemkowym to 23 w systemie dziesiętnym.

31 - 23 daje wynik 8.

Aby zablokować interpretację liczb oktalnych poprzez sam prefiks 0, musimy uaktywnić tryb ścisły.

Można to zrobić np. poprzez deklarację "use strict".

Tryb ścisły automatycznie uaktywnia się też w modułach JavaScript w momencie gdy w kodzie pojawia się import lub export.

W trybie ścisłym zapis oktalny wymaga bardziej wyraźnego prefiksu 0o, a nie tylko samego 0.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html index e248d9de9..33160ca1d 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(037 - 027)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html index 4c4565898..6bddb1603 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaki wynik działania zostanie zalogowany do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html index 5d7a6e33c..cfeac719a 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html index 58dbfde9e..26f90261c 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(037 - 027) // 8
console.log(0o37 - 0o27) // 8
- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html index 191092e61..6512dc9a7 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Działanie 037 - 027 w trybie nieścisłym zwróci wynik 8.

Tryb nieścisły pozwala na interpretację liczba zaczynających się zerem jako liczb oktalnych (ósemkowych).

037 w systemie ósemkowym to 31 w systemie dziesiętnym.

027 w systemie ósemkowym to 23 w systemie dziesiętnym.

31 - 23 daje wynik 8.

Aby zablokować interpretację liczb oktalnych poprzez sam prefiks 0, musimy uaktywnić tryb ścisły.

Można to zrobić np. poprzez deklarację "use strict".

Tryb ścisły automatycznie uaktywnia się też w modułach JavaScript w momencie gdy w kodzie pojawia się import lub export.

W trybie ścisłym zapis oktalny wymaga bardziej wyraźnego prefiksu 0o, a nie tylko samego 0.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html index 1f81a26dd..a8fd5fac3 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #022

🪲 Znajdź buga

const html = "
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
"

document.body
.insertAdjacentHTML("afterbegin", html)

Chcemy dodać zaraz na początku strony kod HTML za pomocą JavaScript. Czy powyższy kod nam to umożliwi?

🧪 Rozwiązanie

const html = `
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
`

document.body
.insertAdjacentHTML("afterbegin", html)

Przykład z błędem nie wykona poprawnie postawionego zadania. Powodem jest nie domknięcie cudzysłowu (bez znaczenia czy użyjemy pojedynczego czy podwójnego).

W kodzie jednak może nam się wydawać, że cudzysłów domykamy. Robimy to jednak nie w tej samej linii, w której go otworzyliśmy, a na to JavaScript już nie pozwala.

Mamy 2 możliwości naprawienia tego błędu.

Pierwszą z nich jest uniknięcie (escape) przejścia do nowej linii poprzez wstawienie wstecznego ukośnika (backslash \).

Backslash spowoduje, że biały znak przejścia do nowej linii zostanie "wyeskejpowany", czyli nie zostanie potraktowany jako znak kończący kod w danej linii, więc i nie wywoła błędu o niedomkniętym cudzysłowu.

\ musimy jednak wstawić na końcu każdej linii, w której przechodzimy do nowej linii wewnątrz cudzysłowów (1, 2, 3 linia).

Znacznie wygodniejszym rozwiązaniem będzie użycie Template literals (Template strings).

Zamiast używać cudzysłowu (" lub ') używamy grawisu (backtick `).

Możemy wtedy kompletnie pominąć \ na końcach wierszy i swobodnie przenosić kod do nowych linii.

Template literals ma jednak pewną istotną implikację. Kod HTML będzie preformatowany. Jeśli sprawdzimy źródło kodu w przeglądarce, zobaczymy, że wszystkie białe znaki będą zachowane, podobnie jakbyśmy kod zawarli w znacznikach <pre>.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html index c2e98f1d9..52a591b11 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const html = "
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
"

document.body
.insertAdjacentHTML("afterbegin", html)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html index 8ab045cde..26e413439 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy dodać zaraz na początku strony kod HTML za pomocą JavaScript. Czy powyższy kod nam to umożliwi?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html index 2c1507f8c..a7967a949 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html index 06719941d..51e059249 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const html = `
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
`

document.body
.insertAdjacentHTML("afterbegin", html)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html index 9a8ab12eb..ae2308db3 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Przykład z błędem nie wykona poprawnie postawionego zadania. Powodem jest nie domknięcie cudzysłowu (bez znaczenia czy użyjemy pojedynczego czy podwójnego).

W kodzie jednak może nam się wydawać, że cudzysłów domykamy. Robimy to jednak nie w tej samej linii, w której go otworzyliśmy, a na to JavaScript już nie pozwala.

Mamy 2 możliwości naprawienia tego błędu.

Pierwszą z nich jest uniknięcie (escape) przejścia do nowej linii poprzez wstawienie wstecznego ukośnika (backslash \).

Backslash spowoduje, że biały znak przejścia do nowej linii zostanie "wyeskejpowany", czyli nie zostanie potraktowany jako znak kończący kod w danej linii, więc i nie wywoła błędu o niedomkniętym cudzysłowu.

\ musimy jednak wstawić na końcu każdej linii, w której przechodzimy do nowej linii wewnątrz cudzysłowów (1, 2, 3 linia).

Znacznie wygodniejszym rozwiązaniem będzie użycie Template literals (Template strings).

Zamiast używać cudzysłowu (" lub ') używamy grawisu (backtick `).

Możemy wtedy kompletnie pominąć \ na końcach wierszy i swobodnie przenosić kod do nowych linii.

Template literals ma jednak pewną istotną implikację. Kod HTML będzie preformatowany. Jeśli sprawdzimy źródło kodu w przeglądarce, zobaczymy, że wszystkie białe znaki będą zachowane, podobnie jakbyśmy kod zawarli w znacznikach <pre>.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html index 056543611..f097930ac 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #042

🪲 Znajdź buga

console.log(1 < 2 < 3)
console.log(0 < 1 < 2)

console.log(3 > 2 > 1)
console.log(2 > 1 > 0)

Co zalogują do konsoli poszczególne ciągi porównań?

🧪 Rozwiązanie

console.log(1 < 2 < 3) // true
console.log(0 < 1 < 2) // true

console.log(3 > 2 > 1) // false
console.log(2 > 1 > 0) // true

Wszystkie przykłady oprócz 3 > 2 > 1 zalogują wartość true.

Dlaczego 3 > 2 > 1 zaloguje false? Przeanalizujmy to krok po kroku.

Operatory > (więcej niż) oraz < (mniej niż) porównują ze sobą dwa operandy, zwracając wartość logiczną z takiego porównania.

Gdy używamy ciągu kilku porównań, sytuacja wygląda analogicznie, jak w przypadku używania ciągu innych operatorów np. dodawania, mnożenia, porównania, koniunkcji itp.

Kolejność oraz kierunek wykonywania operacji wykonywanych przez operatory definiuje tabela pierwszeństwa operatorów (operator precedence).

Operatory > i < wykonują porównania po kolei, od lewej do prawej.

Dla 3 > 2 > 1 w pierwszej kolejności wykonane zostanie porównanie 3 > 2 i zwróci ono wartość true.

Ciąg porównań zostanie zredukowany i będzie w kolejnym kroku porównywał true > 1.

W przypadku gdy porównywane wartości nie są wartościami liczbowymi, zostają one sprowadzone do wartości liczbowej za pomocą algorytmu funkcji Number().

Wartość Number(true) zwraca wartość 1.

W językach programowania, wartości logiczne true/false są z reguły reprezentowane przez wartości liczbowe 1/0.

Finalnie true > 1 zostanie więc skonwertowane do 1 > 1. Wynikiem takiego porównania będzie rzecz jasna wartość false.

W pozostałych przykładach porównań zachodzi analogiczny proces.

Z początkowych porównań zwracana jest wartość logiczna. Następnie kolejne porównania konwertują wartości logiczne na wartości liczbowe i dokonują kolejnych porównań.

true < 3 to prawda, true < 2 to prawda i true > 0 to też prawda.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html index d09105ec9..d86b11889 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(1 < 2 < 3)
console.log(0 < 1 < 2)

console.log(3 > 2 > 1)
console.log(2 > 1 > 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html index d50d7e2f3..5d5dd79ef 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zalogują do konsoli poszczególne ciągi porównań?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html index da604add0..950289e05 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html index 4b009db88..9fe59d56c 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(1 < 2 < 3) // true
console.log(0 < 1 < 2) // true

console.log(3 > 2 > 1) // false
console.log(2 > 1 > 0) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html index 60e4ab154..020c31a6d 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Wszystkie przykłady oprócz 3 > 2 > 1 zalogują wartość true.

Dlaczego 3 > 2 > 1 zaloguje false? Przeanalizujmy to krok po kroku.

Operatory > (więcej niż) oraz < (mniej niż) porównują ze sobą dwa operandy, zwracając wartość logiczną z takiego porównania.

Gdy używamy ciągu kilku porównań, sytuacja wygląda analogicznie, jak w przypadku używania ciągu innych operatorów np. dodawania, mnożenia, porównania, koniunkcji itp.

Kolejność oraz kierunek wykonywania operacji wykonywanych przez operatory definiuje tabela pierwszeństwa operatorów (operator precedence).

Operatory > i < wykonują porównania po kolei, od lewej do prawej.

Dla 3 > 2 > 1 w pierwszej kolejności wykonane zostanie porównanie 3 > 2 i zwróci ono wartość true.

Ciąg porównań zostanie zredukowany i będzie w kolejnym kroku porównywał true > 1.

W przypadku gdy porównywane wartości nie są wartościami liczbowymi, zostają one sprowadzone do wartości liczbowej za pomocą algorytmu funkcji Number().

Wartość Number(true) zwraca wartość 1.

W językach programowania, wartości logiczne true/false są z reguły reprezentowane przez wartości liczbowe 1/0.

Finalnie true > 1 zostanie więc skonwertowane do 1 > 1. Wynikiem takiego porównania będzie rzecz jasna wartość false.

W pozostałych przykładach porównań zachodzi analogiczny proces.

Z początkowych porównań zwracana jest wartość logiczna. Następnie kolejne porównania konwertują wartości logiczne na wartości liczbowe i dokonują kolejnych porównań.

true < 3 to prawda, true < 2 to prawda i true > 0 to też prawda.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html index c27134890..74a8401d8 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #017

🪲 Znajdź buga

setTimeout(() => {
console.log("Infinity")
}, Infinity)

setTimeout(() => {
console.log("24.8 days")
}, 2147483648)

setTimeout(() => {
console.log("Immediately")
}, 0)

Z jakim opóźnieniem wykonają się poszczególne logowania do konsoli?

🧪 Rozwiązanie

setTimeout(() => {
console.log("24.8 days")
}, 2147483647)

W "zarobaczonym" przykładzie, wszystkie 3 logowania do konsoli wykonają się z tym samym, zerowym opóźnieniem.

Dzieje się tak, ponieważ aktualnie wszystkie najpopularniejsze przeglądarki przechowują w pamięci wartość opóźnienia z setTimeout() jako 32 bitową, podpisaną liczbę całkowitą.

Oznacza to, że w pamięci możemy zapisać w systemie binarnym wyłącznie liczby z zakresu od -2147483647 do 2147483647.

32 bity to 32 jednostki pamięci mogące przechowywać wartość 0 lub 1.

Pierwszy bit odpowiada za podpisanie liczby tj. zakomunikowanie czy jest ona dodatnia czy ujemna. W pozostałych 31 bitach możemy więc zapisać maksymalnie 31 jedynek.

31 jedynek w systemie binarnym to 2 147 483 647 w systemie dziesiętnym.

Użycie każdej liczby, która jest większa, jak np. 2 147 483 648 lub nieskończoności, spowoduje "przelanie" się dostępnego miejsca w pamięci i poskutkuje wykonaniem setTimeout() z zerowym opóźnieniem.

Środowisko uruchomieniowe Node.js w przeciwieństwie do przeglądarek informuje nas o tym błędzie. Do konsoli logowane jest ostrzeżenie, informujące, że wartości Infinity oraz 2147483648 nie mieszczą się w pamięci jako 32 bitowej podpisanej liczby całkowitej i z tego względu czas opóźnienia zostaje ustawiony na 1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html index 220b7b206..9fa2bcd22 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("Infinity")
}, Infinity)

setTimeout(() => {
console.log("24.8 days")
}, 2147483648)

setTimeout(() => {
console.log("Immediately")
}, 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html index a3f65e2bb..9a228892c 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Z jakim opóźnieniem wykonają się poszczególne logowania do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html index e649183a3..ed0c74095 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html index 47f36c404..56fbccbc3 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("24.8 days")
}, 2147483647)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html index 6786eef19..16301ffe9 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W "zarobaczonym" przykładzie, wszystkie 3 logowania do konsoli wykonają się z tym samym, zerowym opóźnieniem.

Dzieje się tak, ponieważ aktualnie wszystkie najpopularniejsze przeglądarki przechowują w pamięci wartość opóźnienia z setTimeout() jako 32 bitową, podpisaną liczbę całkowitą.

Oznacza to, że w pamięci możemy zapisać w systemie binarnym wyłącznie liczby z zakresu od -2147483647 do 2147483647.

32 bity to 32 jednostki pamięci mogące przechowywać wartość 0 lub 1.

Pierwszy bit odpowiada za podpisanie liczby tj. zakomunikowanie czy jest ona dodatnia czy ujemna. W pozostałych 31 bitach możemy więc zapisać maksymalnie 31 jedynek.

31 jedynek w systemie binarnym to 2 147 483 647 w systemie dziesiętnym.

Użycie każdej liczby, która jest większa, jak np. 2 147 483 648 lub nieskończoności, spowoduje "przelanie" się dostępnego miejsca w pamięci i poskutkuje wykonaniem setTimeout() z zerowym opóźnieniem.

Środowisko uruchomieniowe Node.js w przeciwieństwie do przeglądarek informuje nas o tym błędzie. Do konsoli logowane jest ostrzeżenie, informujące, że wartości Infinity oraz 2147483648 nie mieszczą się w pamięci jako 32 bitowej podpisanej liczby całkowitej i z tego względu czas opóźnienia zostaje ustawiony na 1.

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html index c541ba838..610c422de 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #082

🪲 Znajdź buga

function capitalize(str) {
str[0].toUpperCase()

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))

Chcemy w ciągu znaków zamieniać pierwszą z liter na dużą.

Czy powyższy kod spełni to zadanie?

🧪 Rozwiązanie

function capitalize(str) {
str = str[0].toUpperCase() + str.slice(1)

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))

Błędny kod opiera swoje założenia na mutowalności tablic.

Mimo, że ciągi znaków są z natury przechowywane w pamięci w postaci tablic (każda litera to osobna komórka, którą możemy pobrać tak samo jak komórki tablicy), to fundamentalnie ciągi znaków są niemutowalne.

Metoda toUpperCase() nie może więc zmodyfikować oryginalnego ciągu znaków. Może jedynie zwrócić efekt swojego działania tj. zwrócić przekazany w argumencie ciąg znaków w postaci dużych liter.

str[0].toUpperCase() pobiera pierwszy znak z ciągu str i zwraca go w formie dużej litery.

Nie przypisujemy jednak nigdzie tej zmiany, więc kod ten jest po prostu bezużyteczny.

str = str[0].toUpperCase() to nadpisanie początkowego ciągu znaków str pierwszym znakiem (indeks 0 z tablicy) zwróconym w postaci dużej litery.

W takim przypadku brakuje jednak dalszego ciągu znaków, który możemy dołączyć używając str.slice(1).

Metoda slice() działa tak samo dla ciągu znaków jak i dla tablic, wycinając żądany fragment.

W naszym przypadku wycinamy cały ciąg znaków rozpoczynając od indeksu 1, pozbywając się tym samym z str indeksu 0.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html index 2a35c2c8a..856def5ba 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function capitalize(str) {
str[0].toUpperCase()

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html index 9cdc03da8..f45ee03a4 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy w ciągu znaków zamieniać pierwszą z liter na dużą.

Czy powyższy kod spełni to zadanie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html index 030bfc518..0655a3b19 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html index 3afddf4b8..ff5c7c004 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function capitalize(str) {
str = str[0].toUpperCase() + str.slice(1)

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html index 8f45b4a35..ea42ea2dd 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Błędny kod opiera swoje założenia na mutowalności tablic.

Mimo, że ciągi znaków są z natury przechowywane w pamięci w postaci tablic (każda litera to osobna komórka, którą możemy pobrać tak samo jak komórki tablicy), to fundamentalnie ciągi znaków są niemutowalne.

Metoda toUpperCase() nie może więc zmodyfikować oryginalnego ciągu znaków. Może jedynie zwrócić efekt swojego działania tj. zwrócić przekazany w argumencie ciąg znaków w postaci dużych liter.

str[0].toUpperCase() pobiera pierwszy znak z ciągu str i zwraca go w formie dużej litery.

Nie przypisujemy jednak nigdzie tej zmiany, więc kod ten jest po prostu bezużyteczny.

str = str[0].toUpperCase() to nadpisanie początkowego ciągu znaków str pierwszym znakiem (indeks 0 z tablicy) zwróconym w postaci dużej litery.

W takim przypadku brakuje jednak dalszego ciągu znaków, który możemy dołączyć używając str.slice(1).

Metoda slice() działa tak samo dla ciągu znaków jak i dla tablic, wycinając żądany fragment.

W naszym przypadku wycinamy cały ciąg znaków rozpoczynając od indeksu 1, pozbywając się tym samym z str indeksu 0.

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html index d23a814ee..cd9d320da 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #096

🪲 Znajdź buga

// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)

Jakie wartości zostaną zalogowane do konsoli?

Czy aktywowanie use strict coś by zmieniło?

🧪 Rozwiązanie

// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)
// 3x {
// message1: "welcome",
// message2: "everybody"
// }

Proxy umożliwia ustanowienie pełnomocnictwa dla danego obiektu.

Oznacza to, że poprzez new Proxy(greeting, {}), tworzymy nowy obiekt proxy {}, który będzie zachowywał się tak jak obiekt greeting.

Wszystkie operacje na takim obiekcie w tym np. modyfikacje własności message2, będą miały odzwierciedlenie w oryginalnym obiekcie, czyli zmiany zajdą zarówno w obiekcie proxy1 jak i greeting.

Na tym etapie proxy przypomina stworzenie aliasu obiektu np. poprzez proxy1 = greeting.

Mamy więc przypisanie przez referencję i modyfikowanie obiektu proxy1 jest tożsame z modyfikowaniem obiektu greeting.

Proxy umożliwia jednak dodanie dodatkowej logiki, która zostanie wykonana w imieniu oryginalnego obiektu.

Możemy w ten sposób dodać np. walidację setter'ów, przez co przed modyfikacją oryginalnego obiektu, obiekt proxy najpierw wykona własny kod i dopiero w nim zdecyduje czy dana modyfikacja może zostać wykonana.

Tworząc obiekt validator i ustawiając go jako proxy dla obiektu greeting poprzez new Proxy(greeting, validator), blokujemy możliwość ustawienia własności message2 na wartość no one.

proxy2.message2 = "no one" staje się więc niedozwolone i nie zmodyfikuje ani obiektu proxy ani obiektu oryginalnego.

Jeśli aktywujemy tryb ścisły, to ze względu na taką niedozwoloną akcję, wyrzucony zostanie błąd 'set' on proxy: trap returned falsish for property 'message2'.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html index d882a6baa..37514d60f 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html index c1f3ec422..82a297d36 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

Czy aktywowanie use strict coś by zmieniło?

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html index a696f9284..c76a2e6bc 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html index 4bc8b799e..b036119c1 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)
// 3x {
// message1: "welcome",
// message2: "everybody"
// }
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html index 73739ed55..136e15f24 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Proxy umożliwia ustanowienie pełnomocnictwa dla danego obiektu.

Oznacza to, że poprzez new Proxy(greeting, {}), tworzymy nowy obiekt proxy {}, który będzie zachowywał się tak jak obiekt greeting.

Wszystkie operacje na takim obiekcie w tym np. modyfikacje własności message2, będą miały odzwierciedlenie w oryginalnym obiekcie, czyli zmiany zajdą zarówno w obiekcie proxy1 jak i greeting.

Na tym etapie proxy przypomina stworzenie aliasu obiektu np. poprzez proxy1 = greeting.

Mamy więc przypisanie przez referencję i modyfikowanie obiektu proxy1 jest tożsame z modyfikowaniem obiektu greeting.

Proxy umożliwia jednak dodanie dodatkowej logiki, która zostanie wykonana w imieniu oryginalnego obiektu.

Możemy w ten sposób dodać np. walidację setter'ów, przez co przed modyfikacją oryginalnego obiektu, obiekt proxy najpierw wykona własny kod i dopiero w nim zdecyduje czy dana modyfikacja może zostać wykonana.

Tworząc obiekt validator i ustawiając go jako proxy dla obiektu greeting poprzez new Proxy(greeting, validator), blokujemy możliwość ustawienia własności message2 na wartość no one.

proxy2.message2 = "no one" staje się więc niedozwolone i nie zmodyfikuje ani obiektu proxy ani obiektu oryginalnego.

Jeśli aktywujemy tryb ścisły, to ze względu na taką niedozwoloną akcję, wyrzucony zostanie błąd 'set' on proxy: trap returned falsish for property 'message2'.

- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html index 6a8288454..e45ac206a 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #015

🪲 Znajdź buga

const price = 25.65
const shipping = 4.15
const total = price + shipping

console.log(total)

Załóżmy, że piszemy oprogramowanie dla sklepu internetowego. Obsługujemy ceny produktów oraz koszty wysyłki i chcemy je zaprezentować klientom w postaci zsumowanego kosztu zakupu.

Jaka cena zostanie zalogowana do konsoli jako total?

🧪 Rozwiązanie

const price = 2565
const shipping = 415
const total = (price + shipping) / 100

console.log(total)

Poprawny wynik dodawania z 25.65 i 4.15 wynosi 29.80. Jednak total zwraca liczbę 29.799999999999997.

Dzieje się tak, ponieważ komputerowe operacje matematyczne na liczbach zmiennoprzecinkowych mają ograniczoną precyzję ze względu na przetwarzanie ich w formie binarnej.

W JavaScript typem danych, który obsługuje zarówno liczby całkowite jak i zmiennoprzecinkowe jest typ Number.

Jest on zaimplementowany jako 64 bitowy format double-precision floating-point (znanego też jako float64).

Rozwiązaniem problemu może być użycie metody zaokrąglającej wynik Number.prototype.toFixed(). Nie jest to jednak rozwiązanie idealne i w przypadku wielu operacji matematycznych, końcowy wynik może być podany błędnie.

W przypadku operacji walutowych sugerowanym rozwiązaniem jest przetwarzanie wszystkich kwot w ujęciu najniższego nominału.

100 zł to 10 000 groszy
$100 to 10 000 centów

Operacje na liczbach całkowitych nie są obarczone problemami zmiennoprzecinkowych zaokrągleń, a chcąc zaprezentować ostateczną kwotę wystarczy podzielić ją przez 100.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html index 8ddecc320..40efd1e8e 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const price = 25.65
const shipping = 4.15
const total = price + shipping

console.log(total)
- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html index a356d73dd..e85adad0a 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Załóżmy, że piszemy oprogramowanie dla sklepu internetowego. Obsługujemy ceny produktów oraz koszty wysyłki i chcemy je zaprezentować klientom w postaci zsumowanego kosztu zakupu.

Jaka cena zostanie zalogowana do konsoli jako total?

- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html index 230059d64..9c1a6f624 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html index ce7286589..8f5b6f0b4 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const price = 2565
const shipping = 415
const total = (price + shipping) / 100

console.log(total)
- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html index e0fa25365..a50b21f6c 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Poprawny wynik dodawania z 25.65 i 4.15 wynosi 29.80. Jednak total zwraca liczbę 29.799999999999997.

Dzieje się tak, ponieważ komputerowe operacje matematyczne na liczbach zmiennoprzecinkowych mają ograniczoną precyzję ze względu na przetwarzanie ich w formie binarnej.

W JavaScript typem danych, który obsługuje zarówno liczby całkowite jak i zmiennoprzecinkowe jest typ Number.

Jest on zaimplementowany jako 64 bitowy format double-precision floating-point (znanego też jako float64).

Rozwiązaniem problemu może być użycie metody zaokrąglającej wynik Number.prototype.toFixed(). Nie jest to jednak rozwiązanie idealne i w przypadku wielu operacji matematycznych, końcowy wynik może być podany błędnie.

W przypadku operacji walutowych sugerowanym rozwiązaniem jest przetwarzanie wszystkich kwot w ujęciu najniższego nominału.

100 zł to 10 000 groszy
$100 to 10 000 centów

Operacje na liczbach całkowitych nie są obarczone problemami zmiennoprzecinkowych zaokrągleń, a chcąc zaprezentować ostateczną kwotę wystarczy podzielić ją przez 100.

- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html index 9241c63e1..7cda8ba16 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #044

🪲 Znajdź buga

const dictionary = new Map()
dictionary.car = "samochód"
dictionary.dog = "pies"

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))

Chcemy skorzystać z obiektu Map do stworzenia prostego słownika.

Jakie odpowiedzi z wywołania metod zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const dictionary = new Map()
dictionary.set("car", "samochód")
dictionary.set("dog", "pies")

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))

W przykładzie z błędem wywołanie metody get() zwróci undefined, a wywołanie metody has() zwróci false.

Obiekt mapy definiuje metody, które umożliwiają interakcje z elementami mapy, ale tylko wtedy gdy elementy zostaną uprzednio wprowadzone w poprawny sposób.

Dodając własności do obiektu w sposób tradycyjny, możemy je wyciągnąć również jedynie tradycyjną metodą tj. wywołując np. dictionary.car.

Aby korzystać z mapy w sposób zgodny z przeznaczeniem, musimy dodawać nowe elementy za pomocą metody set().

Możemy też zdefiniować początkowe elementy przekazując je do konstruktora tworzącego nową mapę:

new Map([
["item1", "value2"],
["item2", "value2"],
])

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html index b2d4eaa05..0f262d00a 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const dictionary = new Map()
dictionary.car = "samochód"
dictionary.dog = "pies"

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html index df24442bb..8741450c2 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy skorzystać z obiektu Map do stworzenia prostego słownika.

Jakie odpowiedzi z wywołania metod zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html index d23c0d852..78604c544 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html index 13eaca315..ec2f6377f 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const dictionary = new Map()
dictionary.set("car", "samochód")
dictionary.set("dog", "pies")

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html index 44b1187ff..c0daba03e 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem wywołanie metody get() zwróci undefined, a wywołanie metody has() zwróci false.

Obiekt mapy definiuje metody, które umożliwiają interakcje z elementami mapy, ale tylko wtedy gdy elementy zostaną uprzednio wprowadzone w poprawny sposób.

Dodając własności do obiektu w sposób tradycyjny, możemy je wyciągnąć również jedynie tradycyjną metodą tj. wywołując np. dictionary.car.

Aby korzystać z mapy w sposób zgodny z przeznaczeniem, musimy dodawać nowe elementy za pomocą metody set().

Możemy też zdefiniować początkowe elementy przekazując je do konstruktora tworzącego nową mapę:

new Map([
["item1", "value2"],
["item2", "value2"],
])
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html index 67a197d3f..354d1d39d 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #085

🪲 Znajdź buga

console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)

Pierwsze cztery przykłady zalogują ciągi znaków w ten sam sposób:

foo
bar
baz

Niespodzianką może być ostatni, piąty przykład, który zwróci:

foo \nbar \nbaz

String.raw() zwraca literał szablonu w oryginalnej formie, bez respektowania wstecznego ukośnika jako znaku ucieczki np. dla przejść do nowej linii poprzez \n.

String.raw() respektuje jednak zagnieżdżanie literałów szablonu za pomocą ${}, wykonując je już z uwzględnieniem znaków ucieczki, stąd też przykład z czwartej linii działa tak samo jak przykład z linii trzeciej.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html index 094b2c6b4..cba610768 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html index 02b575857..d5be2a2bd 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html index 53ef5833a..a40935267 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html index 24af5b5c2..0e22730f2 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html index 6d74aa822..37c94407e 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Pierwsze cztery przykłady zalogują ciągi znaków w ten sam sposób:

foo
bar
baz

Niespodzianką może być ostatni, piąty przykład, który zwróci:

foo \nbar \nbaz

String.raw() zwraca literał szablonu w oryginalnej formie, bez respektowania wstecznego ukośnika jako znaku ucieczki np. dla przejść do nowej linii poprzez \n.

String.raw() respektuje jednak zagnieżdżanie literałów szablonu za pomocą ${}, wykonując je już z uwzględnieniem znaków ucieczki, stąd też przykład z czwartej linii działa tak samo jak przykład z linii trzeciej.

- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html index d086a454b..6b1521d1b 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #058

🪲 Znajdź buga

console.log(null == 0)
console.log(null > 0)
console.log(null >= 0)

Co zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

console.log(null == 0) // false
console.log(null > 0) // false
console.log(null >= 0) // true

Polegając na dedukcji w języku JavaScript, można wpaść w pułapkę.

Logicznym wydaje się, że jeśli null nie jest równy 0 i nie jest też większy > od 0, to nie powinien być większy lub równy 0, a jednak jest.

Powodem jest niespójność działania algorytmów porównania.

Algorytm porównania ==, jeśli napotka na operand null lub undefined to aby zwrócić prawdę z takiego porównania, wymaga aby drugi operand również był null albo undefined.

null może być równy tylko wartości null. Ten sam algorytm porównania == wprowadza jednak konwersję innych typów danych np. wartości logicznych true i false, sprowadzając je do wartości liczbowych 1 i 0.

Algorytm stojący za porównaniem większy niż > działa inaczej.

Najpierw podmienia on miejscami operandy i stosuje algorytm porównanie mniejszy niż < (co nie ma tutaj żadnego znaczenia).

Później natomiast, UWAGA, konwertuje wartości logiczne true/false na 1/0, ale TAKŻE wartość null na 0.

Wartość undefined konwertuje natomiast na NaN.

Operator większy lub równy >= robi z null to samo, więc finalnie wyrażenie zostaje zamienione na 0 >= 0, co staje się prawdą.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html index 4d2aad9d1..944461fc7 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(null == 0)
console.log(null > 0)
console.log(null >= 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html index 8fc497229..55992c88b 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html index 822cdf71f..34ba73c06 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html index 7a00eccb3..cf9f8d38c 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(null == 0) // false
console.log(null > 0) // false
console.log(null >= 0) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html index f8c8bd42e..227d5454a 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Polegając na dedukcji w języku JavaScript, można wpaść w pułapkę.

Logicznym wydaje się, że jeśli null nie jest równy 0 i nie jest też większy > od 0, to nie powinien być większy lub równy 0, a jednak jest.

Powodem jest niespójność działania algorytmów porównania.

Algorytm porównania ==, jeśli napotka na operand null lub undefined to aby zwrócić prawdę z takiego porównania, wymaga aby drugi operand również był null albo undefined.

null może być równy tylko wartości null. Ten sam algorytm porównania == wprowadza jednak konwersję innych typów danych np. wartości logicznych true i false, sprowadzając je do wartości liczbowych 1 i 0.

Algorytm stojący za porównaniem większy niż > działa inaczej.

Najpierw podmienia on miejscami operandy i stosuje algorytm porównanie mniejszy niż < (co nie ma tutaj żadnego znaczenia).

Później natomiast, UWAGA, konwertuje wartości logiczne true/false na 1/0, ale TAKŻE wartość null na 0.

Wartość undefined konwertuje natomiast na NaN.

Operator większy lub równy >= robi z null to samo, więc finalnie wyrażenie zostaje zamienione na 0 >= 0, co staje się prawdą.

- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html index ef99bba15..bbe1196e2 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #052

🪲 Znajdź buga

let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a)
console.log(x)

console.log("foo", "bar")
console.log(("foo", "bar"))

Co zostanie zalogowane do konsoli w poszczególnych przykładach?

🧪 Rozwiązanie

let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a) // 1
console.log(x) // 2

console.log("foo", "bar") // foo bar
console.log(("foo", "bar")) // bar

Operator przecinka (,) wykonuje operandy w kolejności od lewej do prawej, a następnie zwraca wartość ostatniego z nich.

Operator , ma najniższe pierwszeństwo wykonywania z wszystkich operatorów, niższe niż operator przypisania =.

Mylące może być występowanie przecinka również w innych, bardziej popularnych rolach jak np. rozdzielanie elementów w tablicy, własności w obiektach, parametrów i argumentów w funkcjach, liście deklaracji zmiennych, importach czy eksportach.

Przykładowo, a = b = 1, c = 2, wykona operacje przypisania 1 do zmiennej b oraz wartości z b do zmiennej a. Wykonane zostanie też przypisanie 2 do zmiennej c, ale już jako osobna operacja. Zwrócona z niej wartość 2 nie bierze udziału w przypisywaniu wartości do a.

Konsola logując wartość zmiennej a zwróci więc 1.

W przykładzie x = (y = 1, z = 2), pierwsze w kolejności wykonane zostaną wyrażenia w nawiasie. Najpierw dwie operacje przypisania, 1 do zmiennej x oraz 2 do zmiennej z, następnie zadziała operator przecinka, który zwróci wartość ostatniej z tych operacji, czyli 2

Finalnie wartość zmiennej x zostanie zalogowana jako 2.

Inny przykład, log("foo", "bar"), to wywołanie metody z przekazaniem dwóch argumentów. Metoda loguje do konsoli oba argumenty.

Gdy jednak argumenty zgrupujemy umieszczając je w nawiasie log(("foo", "bar")), to operator , zwróci ostatnią z wartości czyli bar i tylko ta wartość będzie argumentem dla metody log.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html index 38e45db60..a87e30702 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a)
console.log(x)

console.log("foo", "bar")
console.log(("foo", "bar"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html index ffaea5660..b956d5278 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli w poszczególnych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html index 15526bda8..f94212697 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html index b2b3668e9..bca9ce9c7 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a) // 1
console.log(x) // 2

console.log("foo", "bar") // foo bar
console.log(("foo", "bar")) // bar
- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html index 5cf378017..81c94513a 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Operator przecinka (,) wykonuje operandy w kolejności od lewej do prawej, a następnie zwraca wartość ostatniego z nich.

Operator , ma najniższe pierwszeństwo wykonywania z wszystkich operatorów, niższe niż operator przypisania =.

Mylące może być występowanie przecinka również w innych, bardziej popularnych rolach jak np. rozdzielanie elementów w tablicy, własności w obiektach, parametrów i argumentów w funkcjach, liście deklaracji zmiennych, importach czy eksportach.

Przykładowo, a = b = 1, c = 2, wykona operacje przypisania 1 do zmiennej b oraz wartości z b do zmiennej a. Wykonane zostanie też przypisanie 2 do zmiennej c, ale już jako osobna operacja. Zwrócona z niej wartość 2 nie bierze udziału w przypisywaniu wartości do a.

Konsola logując wartość zmiennej a zwróci więc 1.

W przykładzie x = (y = 1, z = 2), pierwsze w kolejności wykonane zostaną wyrażenia w nawiasie. Najpierw dwie operacje przypisania, 1 do zmiennej x oraz 2 do zmiennej z, następnie zadziała operator przecinka, który zwróci wartość ostatniej z tych operacji, czyli 2

Finalnie wartość zmiennej x zostanie zalogowana jako 2.

Inny przykład, log("foo", "bar"), to wywołanie metody z przekazaniem dwóch argumentów. Metoda loguje do konsoli oba argumenty.

Gdy jednak argumenty zgrupujemy umieszczając je w nawiasie log(("foo", "bar")), to operator , zwróci ostatnią z wartości czyli bar i tylko ta wartość będzie argumentem dla metody log.

- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html index 0664018e4..4f49589f5 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #074

🪲 Znajdź buga

console.log([1, 2, 3] + [4, 5, 6])

Chcemy połączyć (dodać) ze sobą kilka tablic.

Czy powyższy kod spełni to zadanie?\ Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log([...[1, 2, 3], ...[4, 5, 6]])
// "1,2,34,5,6"

Przykład błędnego kodu nie jest wymyślony przeze mnie. Znalazłem go w kursie JavaScript, który mianował się tytułem "Prawdopodobnie najlepszy darmowy kurs JavaScript".

W sekcji dodawania elementów do tablicy, użycie operatora + było zaproponowane przez autora, jako metoda dodawania do tablicy nowych elementów, lub łączenia ze sobą tablic.

+ jest przeładowanym operatorem dodawania, tzn. ma więcej niż jedną funkcjonalność, która zależy od typów danych, które zostaną podstawione jako operandy.

+ może matematycznie dodawać wartości liczbowe, ale może też łączyć ze sobą ciągi znaków.

W przypadku próby dodania do siebie dwóch tablic, w pierwszej kolejności algorytm operatora + wymusi konwersję tablic do ciągów znaków poprzez wywołanie metody toString().

[1, 2, 3].toString() zwróci ciąg znaków "1,2,3".

Analogicznie dla drugiej tablicy będzie to "4,5,6".

Połączenie tych dwóch ciągów znaków da nam więc ciąg znaków "1,2,34,5,6".

Nie uda się nam odwrócić tej operacji np. poprzez "1,2,34,5,6".split(","), bo nowa tablica otrzyma wtedy zlepiony element "34". Tracimy też informację o oryginalnym typie danych.

Aby połączyć, lub w sposób nienaruszający oryginalną tablicę (push(), patrzę na Ciebie), dodać nowe elementy, najwygodniej będzie użyć operatora rozkładu (spread), rozkładając tablicę wewnątrz nowej tablicy [...[1, 2, 3]].

W ten sposób możemy łączyć dowolną ilość tablic i dodawać do nich dowolną ilość nowych elementów.

Innym sposobem może być użycie np. Array.prototype.concat().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html index 2a654a817..176f9935a 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log([1, 2, 3] + [4, 5, 6])
- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html index 0cdf6f872..a2ccb9008 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Chcemy połączyć (dodać) ze sobą kilka tablic.

Czy powyższy kod spełni to zadanie?\ Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html index d506027d9..e14a27b03 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html index a1b8b436d..7f1c1149e 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log([...[1, 2, 3], ...[4, 5, 6]])
// "1,2,34,5,6"
- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html index af3c12f9a..c6a87fc98 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Przykład błędnego kodu nie jest wymyślony przeze mnie. Znalazłem go w kursie JavaScript, który mianował się tytułem "Prawdopodobnie najlepszy darmowy kurs JavaScript".

W sekcji dodawania elementów do tablicy, użycie operatora + było zaproponowane przez autora, jako metoda dodawania do tablicy nowych elementów, lub łączenia ze sobą tablic.

+ jest przeładowanym operatorem dodawania, tzn. ma więcej niż jedną funkcjonalność, która zależy od typów danych, które zostaną podstawione jako operandy.

+ może matematycznie dodawać wartości liczbowe, ale może też łączyć ze sobą ciągi znaków.

W przypadku próby dodania do siebie dwóch tablic, w pierwszej kolejności algorytm operatora + wymusi konwersję tablic do ciągów znaków poprzez wywołanie metody toString().

[1, 2, 3].toString() zwróci ciąg znaków "1,2,3".

Analogicznie dla drugiej tablicy będzie to "4,5,6".

Połączenie tych dwóch ciągów znaków da nam więc ciąg znaków "1,2,34,5,6".

Nie uda się nam odwrócić tej operacji np. poprzez "1,2,34,5,6".split(","), bo nowa tablica otrzyma wtedy zlepiony element "34". Tracimy też informację o oryginalnym typie danych.

Aby połączyć, lub w sposób nienaruszający oryginalną tablicę (push(), patrzę na Ciebie), dodać nowe elementy, najwygodniej będzie użyć operatora rozkładu (spread), rozkładając tablicę wewnątrz nowej tablicy [...[1, 2, 3]].

W ten sposób możemy łączyć dowolną ilość tablic i dodawać do nich dowolną ilość nowych elementów.

Innym sposobem może być użycie np. Array.prototype.concat().

- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html index 4e08dbb93..75d9dc507 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #020

🪲 Znajdź buga

console.log(foo())
console.log(bar())

var foo = function () {
return "foo"
}

function bar() {
return "bar"
}

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log(bar())

var foo = function () {
return "foo"
}

console.log(foo())

function bar() {
return "bar"
}

W przykładzie z błędem, w konsoli ujrzymy Error: foo is not a function.

Podciągnięcie (hoisting) ma zastosowanie w obu przypadkach - deklaracji funkcji bar() oraz wyrażenia przypisania anonimowej funkcji do zmiennej foo zadeklarowanej z użyciem var.

Jeśli pozbędziemy się wywołania foo() generującego błąd, wywołanie bar() zadziała prawidłowo.

W przeciwieństwie do pociągania deklaracji funkcji bar(), w przypadku funkcji przypisanej do zmiennej foo podciągnięta zostaje tylko sama deklaracja zmiennej, bez przypisanej do niej wartości.

foo w momencie wywołania ma więc wartość undefined, a undefined funkcją nie jest, tak jak mówi nam treść błędu.

Patrząc na kod, możemy mieć jednak wrażenie, że foo funkcją jest i to treść błędu jest błędna.

Aby poprawić tą sytuację, możemy zamienić słowo kluczowe var na let lub const. Ujrzymy wtedy bardziej jasny komunikat błędu Error: Cannot access 'foo' before initialization.

Niemniej, żeby naprawić działanie kodu, musimy po prostu przenieść wywołanie funkcji za wyrażenie przypisywania funkcji do zmiennej.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html index c5e544d4f..03f0c5f74 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(foo())
console.log(bar())

var foo = function () {
return "foo"
}

function bar() {
return "bar"
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html index de1a5088f..fa124dd5d 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html index 97b113d08..960f5b9c2 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html index 75f4577d8..e4fce4334 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(bar())

var foo = function () {
return "foo"
}

console.log(foo())

function bar() {
return "bar"
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html index c34c6a67c..37cb5aacc 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli ujrzymy Error: foo is not a function.

Podciągnięcie (hoisting) ma zastosowanie w obu przypadkach - deklaracji funkcji bar() oraz wyrażenia przypisania anonimowej funkcji do zmiennej foo zadeklarowanej z użyciem var.

Jeśli pozbędziemy się wywołania foo() generującego błąd, wywołanie bar() zadziała prawidłowo.

W przeciwieństwie do pociągania deklaracji funkcji bar(), w przypadku funkcji przypisanej do zmiennej foo podciągnięta zostaje tylko sama deklaracja zmiennej, bez przypisanej do niej wartości.

foo w momencie wywołania ma więc wartość undefined, a undefined funkcją nie jest, tak jak mówi nam treść błędu.

Patrząc na kod, możemy mieć jednak wrażenie, że foo funkcją jest i to treść błędu jest błędna.

Aby poprawić tą sytuację, możemy zamienić słowo kluczowe var na let lub const. Ujrzymy wtedy bardziej jasny komunikat błędu Error: Cannot access 'foo' before initialization.

Niemniej, żeby naprawić działanie kodu, musimy po prostu przenieść wywołanie funkcji za wyrażenie przypisywania funkcji do zmiennej.

- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html index 9b227a9d2..bf7448fcb 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html @@ -7,8 +7,8 @@ - - + +
@@ -18,7 +18,7 @@ 0 + 1 daje 1.

undefined jest już jednak konwertowany do wartości NaN.\ NaN + 1 daje NaN.

Jeśli typy danych nie są prymitywne, to algorytm sprowadza je do takich.

Obiekty (w tym tablice) nie są danymi typu prymitywnego. Dziedziczą z prototypu Object metodę valueOf(), która w pierwszej kolejności jest sprawdzana pod kątem konwersji do typu prymitywnego przez operację dodawania.

valueOf zwraca jednak obiekt, więc wartość jest ignorowana (nie jest prymitywna) i algorytm przechodzi do sprawdzenia drugiej metody toString(), która zwraca ciąg znaków.

Pusta tablica [] nie zostaje więc zamieniona na wartość liczbową 0, a na pusty ciąg znaków, który następnie jest łączony z wartością 1, również skonwertowaną na ciąg znaków.

Podobnie jest z obiektem {}. Jest on konwertowany do ciągu znaków [object Object], a następnie łączony z wartością 1, również skonwertowaną do ciągu znaków.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html index 21c87581e..a9fec1532 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(true + 1)
console.log(false + 1)
console.log(null + 1)
console.log(undefined + 1)
console.log([] + 1)
console.log({} + 1)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html index c8516079e..e5718e49a 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html index 8defdc19a..75b7de6f3 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html index 0f9c051f3..1932ce566 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(true + 1) // 2
console.log(false + 1) // 1
console.log(null + 1) // 1
console.log(undefined + 1) // NaN
console.log([] + 1) // "1"
console.log({} + 1) // [object Object]1
- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html index e8355c97f..eb35f392f 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html @@ -7,8 +7,8 @@ - - + +
@@ -17,7 +17,7 @@ 0 + 1 daje 1.

null jest konwertowany do wartości liczbowej 0.\ 0 + 1 daje 1.

undefined jest już jednak konwertowany do wartości NaN.\ NaN + 1 daje NaN.

Jeśli typy danych nie są prymitywne, to algorytm sprowadza je do takich.

Obiekty (w tym tablice) nie są danymi typu prymitywnego. Dziedziczą z prototypu Object metodę valueOf(), która w pierwszej kolejności jest sprawdzana pod kątem konwersji do typu prymitywnego przez operację dodawania.

valueOf zwraca jednak obiekt, więc wartość jest ignorowana (nie jest prymitywna) i algorytm przechodzi do sprawdzenia drugiej metody toString(), która zwraca ciąg znaków.

Pusta tablica [] nie zostaje więc zamieniona na wartość liczbową 0, a na pusty ciąg znaków, który następnie jest łączony z wartością 1, również skonwertowaną na ciąg znaków.

Podobnie jest z obiektem {}. Jest on konwertowany do ciągu znaków [object Object], a następnie łączony z wartością 1, również skonwertowaną do ciągu znaków.

- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html index c94f67b77..90c716c42 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Bug #063

🪲 Znajdź buga

const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size)
console.log(set2.size)
console.log(set3.size)

Jakie wartości zostaną zalogowane dla poszczególnych zbiorów Set?

🧪 Rozwiązanie

const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size) // 3
console.log(set2.size) // 1
console.log(set3.size) // 4

Set w przeciwieństwie do Array to zbiór unikalnych wartości.

Wielkość zbioru set1 będzie wynosiła 3 elementy, mimo że na pierwszy rzut oka elementy wydają się nie być unikalne i zbiór powinien zawierać tylko 1 element.

W przypadku obiektów (w tym tablic) każdy traktowany jest jako unikalny element, bo o unikalności świadczą adresy referencyjne z pamięci RAM.

Gdybyśmy na początku przypisali tablicę do zmiennej np. poprzez \ const table = ["a", "b", "c"], to kilkukrotnie dodając ją poprzez referencję tj. set1.add(table), tablice nie duplikowałyby się w zbiorze i finalnie set1.size zwróciłoby wartość 1.

W set2 metoda join(), łączy elementy z tablic (domyślnie za pomocą przecinka), tym samym tworząc wartości prymitywne typu ciąg znaków.

Wartości prymitywne są porównywane poprzez wartość, a nie referencję, więc finalnie set2.size zwraca 1 jako łączą ilość elementów zbioru.

Aby nieco ułatwić sobie zrozumienie działania unikalności elementów w Set, można posłużyć się operatorem unikalnego porównania.

Jeśli któryś z elementów porównywany z innym elementem za pomocą operatora === zwróci prawdę, to znaczy, że taki element już jest w zbiorze i kolejny nie zostanie dodany.

["a","b","c"] === ["a","b","c"] zwróci false, więc elementy zostają dodawane do zbioru jako unikalne.

Wyjątkiem jest NaN, który jako jedyny w porównaniu z samym sobą zwraca fałsz, ale mimo to Set nie pozwala na umieszczenie więcej niż jednej wartości NaN w zbiorze.

Ostatni przykład set3.size zwraca wielkość zbioru jako 4 elementy, ponieważ bezpośrednie przekazanie ciągu znaków do funkcji konstruktora Set rozbija ciąg znaków na zbiór pojedynczych znaków.

Ciąg znaków można więc zapisać również jako ["t","r","a","l","a","l","a","l","a"].

Widać wtedy wyraźnie, że niektóre znaki się powtarzają, przez co zostają zignorowane i finalnie zbiór składa się jedynie z 4 unikalnych elementów ["t","r","a","l"].

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html index f308d4c62..e37525de9 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size)
console.log(set2.size)
console.log(set3.size)
- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html index b3cd35905..d77383adc 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane dla poszczególnych zbiorów Set?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html index 7becf1c4d..acf452a99 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html index 7346b9558..6713c72ae 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size) // 3
console.log(set2.size) // 1
console.log(set3.size) // 4
- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html index cd448fb19..377eef9b6 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Set w przeciwieństwie do Array to zbiór unikalnych wartości.

Wielkość zbioru set1 będzie wynosiła 3 elementy, mimo że na pierwszy rzut oka elementy wydają się nie być unikalne i zbiór powinien zawierać tylko 1 element.

W przypadku obiektów (w tym tablic) każdy traktowany jest jako unikalny element, bo o unikalności świadczą adresy referencyjne z pamięci RAM.

Gdybyśmy na początku przypisali tablicę do zmiennej np. poprzez \ const table = ["a", "b", "c"], to kilkukrotnie dodając ją poprzez referencję tj. set1.add(table), tablice nie duplikowałyby się w zbiorze i finalnie set1.size zwróciłoby wartość 1.

W set2 metoda join(), łączy elementy z tablic (domyślnie za pomocą przecinka), tym samym tworząc wartości prymitywne typu ciąg znaków.

Wartości prymitywne są porównywane poprzez wartość, a nie referencję, więc finalnie set2.size zwraca 1 jako łączą ilość elementów zbioru.

Aby nieco ułatwić sobie zrozumienie działania unikalności elementów w Set, można posłużyć się operatorem unikalnego porównania.

Jeśli któryś z elementów porównywany z innym elementem za pomocą operatora === zwróci prawdę, to znaczy, że taki element już jest w zbiorze i kolejny nie zostanie dodany.

["a","b","c"] === ["a","b","c"] zwróci false, więc elementy zostają dodawane do zbioru jako unikalne.

Wyjątkiem jest NaN, który jako jedyny w porównaniu z samym sobą zwraca fałsz, ale mimo to Set nie pozwala na umieszczenie więcej niż jednej wartości NaN w zbiorze.

Ostatni przykład set3.size zwraca wielkość zbioru jako 4 elementy, ponieważ bezpośrednie przekazanie ciągu znaków do funkcji konstruktora Set rozbija ciąg znaków na zbiór pojedynczych znaków.

Ciąg znaków można więc zapisać również jako ["t","r","a","l","a","l","a","l","a"].

Widać wtedy wyraźnie, że niektóre znaki się powtarzają, przez co zostają zignorowane i finalnie zbiór składa się jedynie z 4 unikalnych elementów ["t","r","a","l"].

- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html index 22d445465..aad31bd2e 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #034

🪲 Znajdź buga

console.log(NaN == NaN)
console.log(NaN === NaN)

console.log(Number.NaN == Number.NaN)
console.log(Number.NaN === Number.NaN)

console.log(isNaN(NaN))
console.log(Number.isNaN(NaN))

console.log(isNaN("123"))
console.log(Number.isNaN("123"))

console.log(isNaN("abc"))
console.log(Number.isNaN("abc"))

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123"))
console.log(valueIsNaN("abc"))

console.log(valueIsNaN(NaN))
console.log(valueIsNaN(Number.NaN))

Jakie wartości logiczne zostaną zalogowane do konsoli?

Czy metoda isNaN() działa tak samo jak metoda Number.isNaN()?

Czy funkcja valueIsNaN() spełni zadanie sprawdzania wartości NaN?

🧪 Rozwiązanie

console.log(NaN == NaN) // false
console.log(NaN === NaN) // false

console.log(Number.NaN == Number.NaN) // false
console.log(Number.NaN === Number.NaN) // false

console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true

console.log(isNaN("123")) // false
console.log(Number.isNaN("123")) // false

console.log(isNaN("abc")) // true (!)
console.log(Number.isNaN("abc")) // false

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123")) // false
console.log(valueIsNaN("abc")) // false

console.log(valueIsNaN(NaN)) // true
console.log(valueIsNaN(Number.NaN)) // true

NaN jest wyjątkową wartością w JavaScript. Jako jedyna porównana sama ze sobą zwraca fałsz. Nie ma znaczenia, czy użyjemy ścisłego (===) czy luźnego (==) porównania.

Jedyną opcją na sprawdzenie, czy wartością jest NaN jest użycie dostępnej w globalnym kontekście metody isNaN() lub Number.isNaN.

Alternatywnie, możemy stworzyć własną funkcję, która porówna ścisłą nierówność (!==) przekazanej wartości. Prawda zwrócona zostanie tylko wtedy, gdy jako argument funkcji przekażemy NaN.

Na bardzo mocną uwagę zasługuje isNaN("abc").

"abc" === NaN w żaden sposób nie jest prawdziwe.

"abc" nie jest wartością NaN, dlaczego więc dostajemy z tej metody odpowiedź true?

Bo w JavaScript, metoda isNaN() działa inaczej niż Number.isNaN().

isNaN() zwraca true jeśli argument jest wartością NaN, lub jeśli będzie wartością NaN po jego konwersji na wartość liczbową 🤯.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html index 3efd84f30..059d22d0c 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(NaN == NaN)
console.log(NaN === NaN)

console.log(Number.NaN == Number.NaN)
console.log(Number.NaN === Number.NaN)

console.log(isNaN(NaN))
console.log(Number.isNaN(NaN))

console.log(isNaN("123"))
console.log(Number.isNaN("123"))

console.log(isNaN("abc"))
console.log(Number.isNaN("abc"))

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123"))
console.log(valueIsNaN("abc"))

console.log(valueIsNaN(NaN))
console.log(valueIsNaN(Number.NaN))
- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html index 1e454715f..5b39e05f7 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości logiczne zostaną zalogowane do konsoli?

Czy metoda isNaN() działa tak samo jak metoda Number.isNaN()?

Czy funkcja valueIsNaN() spełni zadanie sprawdzania wartości NaN?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html index 7dff8ff58..d9caf4150 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html index ae1118cab..1c0ddce4f 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(NaN == NaN) // false
console.log(NaN === NaN) // false

console.log(Number.NaN == Number.NaN) // false
console.log(Number.NaN === Number.NaN) // false

console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true

console.log(isNaN("123")) // false
console.log(Number.isNaN("123")) // false

console.log(isNaN("abc")) // true (!)
console.log(Number.isNaN("abc")) // false

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123")) // false
console.log(valueIsNaN("abc")) // false

console.log(valueIsNaN(NaN)) // true
console.log(valueIsNaN(Number.NaN)) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html index 24bf5985c..665b599af 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

NaN jest wyjątkową wartością w JavaScript. Jako jedyna porównana sama ze sobą zwraca fałsz. Nie ma znaczenia, czy użyjemy ścisłego (===) czy luźnego (==) porównania.

Jedyną opcją na sprawdzenie, czy wartością jest NaN jest użycie dostępnej w globalnym kontekście metody isNaN() lub Number.isNaN.

Alternatywnie, możemy stworzyć własną funkcję, która porówna ścisłą nierówność (!==) przekazanej wartości. Prawda zwrócona zostanie tylko wtedy, gdy jako argument funkcji przekażemy NaN.

Na bardzo mocną uwagę zasługuje isNaN("abc").

"abc" === NaN w żaden sposób nie jest prawdziwe.

"abc" nie jest wartością NaN, dlaczego więc dostajemy z tej metody odpowiedź true?

Bo w JavaScript, metoda isNaN() działa inaczej niż Number.isNaN().

isNaN() zwraca true jeśli argument jest wartością NaN, lub jeśli będzie wartością NaN po jego konwersji na wartość liczbową 🤯.

- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html index 076d81fac..9ef8eefe7 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #005

🪲 Znajdź buga

function addToArray(item, array) {
const newArray = array
newArray.push(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })

Chcemy stworzyć funkcję, która doda nowy element do tablicy, a następnie zwróci tą tablicę.

Array.prototype.push() domyślnie zwraca długość tablicy tj. łączną liczbę elementów.

W addToArray() wyraźnie zwracamy więc zaktualizowaną tablicę.

Jakie elementy zostaną zalogowane do konsoli jako fruits i favFruits po użyciu funkcji addToArray()?

🧪 Rozwiązanie

function addToArray(item, array) {
const newArray = array.concat(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })

W przykładzie z błędem okazuje się, że fruits i favFruits zwrócą ten sam zbiór 3 elementów ["apple", "orange", "banana"].

Powodem takiego efektu jest charakter działania metody push(). Mutuje ona tablicę, tj. zmienia jej oryginalną zawartość.

O funkcjach/metodach, które mają tego typu działanie, mówi się, że generują efekty uboczne. Jest to z reguły sytuacja niepożądana.

Dodatkową pułapką w błędnym kodzie, może być też fakt, że deklarujemy nową stałą newArray, komunikując chęć stworzenia kopi tablicy array.

W JavaScript odwoływanie do tablic odbywa się przez referencję, czyli przez adres, pod którym tablica została zapisana w pamięci RAM.

const newArray = array nie tworzy więc kopi tablicy, a jedynie alias (nową nazwę), wskazując na tą samą tablicę z pamięci.

Aby naprawić przykładowy kod, możemy użyć np. metody concat(), która nie generuje efektów ubocznych i zwraca nową tablicę.

Po takiej zamianie, fruits i favFruits zalogują do konsoli właściwe elementy z dwóch różnych tablic.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html index fc82404e0..9be53157f 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function addToArray(item, array) {
const newArray = array
newArray.push(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html index ac8a5920e..3c9881ddd 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Chcemy stworzyć funkcję, która doda nowy element do tablicy, a następnie zwróci tą tablicę.

Array.prototype.push() domyślnie zwraca długość tablicy tj. łączną liczbę elementów.

W addToArray() wyraźnie zwracamy więc zaktualizowaną tablicę.

Jakie elementy zostaną zalogowane do konsoli jako fruits i favFruits po użyciu funkcji addToArray()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html index 4dd783ae4..c062c466d 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html index 78dad1736..e1eee16a6 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
function addToArray(item, array) {
const newArray = array.concat(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html index e4e0b9751..295b03b9c 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem okazuje się, że fruits i favFruits zwrócą ten sam zbiór 3 elementów ["apple", "orange", "banana"].

Powodem takiego efektu jest charakter działania metody push(). Mutuje ona tablicę, tj. zmienia jej oryginalną zawartość.

O funkcjach/metodach, które mają tego typu działanie, mówi się, że generują efekty uboczne. Jest to z reguły sytuacja niepożądana.

Dodatkową pułapką w błędnym kodzie, może być też fakt, że deklarujemy nową stałą newArray, komunikując chęć stworzenia kopi tablicy array.

W JavaScript odwoływanie do tablic odbywa się przez referencję, czyli przez adres, pod którym tablica została zapisana w pamięci RAM.

const newArray = array nie tworzy więc kopi tablicy, a jedynie alias (nową nazwę), wskazując na tą samą tablicę z pamięci.

Aby naprawić przykładowy kod, możemy użyć np. metody concat(), która nie generuje efektów ubocznych i zwraca nową tablicę.

Po takiej zamianie, fruits i favFruits zalogują do konsoli właściwe elementy z dwóch różnych tablic.

- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html index d22f61610..2dcaabca3 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #002

🪲 Znajdź buga

const now = new Date()
const future = new Date(
now.setHours(now.getHours() + 6)
)

console.log({ now, future })

Jaka data zostanie zalogowana do konsoli dla now, a jaka dla future?

🧪 Rozwiązanie

const now = new Date()
const future = new Date()

future.setHours(now.getHours() + 6)

console.log({ now, future })

W błędnym przykładzie zarówno now jak i future zalogują do konsoli tą samą datę, odległą o 6 godzin w przyszłość.

Metoda setHours() mutuje obiekt daty, na którym zostaje wykonana.

Aby rozwiązać ten problem, dla stałej future musimy utworzyć nowy obiekt daty, który następnie modyfikujemy metodą setHours().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html index 3db8adf41..00578b393 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const now = new Date()
const future = new Date(
now.setHours(now.getHours() + 6)
)

console.log({ now, future })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html index e9cedc9ae..e9de1fff4 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jaka data zostanie zalogowana do konsoli dla now, a jaka dla future?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html index cd24c5ba7..2aabb437f 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html index 76a9409e2..445eb4859 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const now = new Date()
const future = new Date()

future.setHours(now.getHours() + 6)

console.log({ now, future })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html index b3f4729f0..2c1b92ffe 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W błędnym przykładzie zarówno now jak i future zalogują do konsoli tą samą datę, odległą o 6 godzin w przyszłość.

Metoda setHours() mutuje obiekt daty, na którym zostaje wykonana.

Aby rozwiązać ten problem, dla stałej future musimy utworzyć nowy obiekt daty, który następnie modyfikujemy metodą setHours().

- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html index b86520061..004acf86a 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #019

🪲 Znajdź buga

const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive

driveMyCar()

Co zostanie zalogowane do konsoli jako efekt wywołania Car.drive() oraz driveMyCar()?

🧪 Rozwiązanie

const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive.bind(Car)

driveMyCar()

W przykładzie z błędem, Car.drive() zaloguje do konsoli obiekt Car, natomiast driveMyCar() zaloguje globalny obiekt lub undefined w zależności od tego, czy aktywny będzie tryb ścisły (strict mode).

Przypisując do stałej driveMyCar metodę Car.drive, przypisujemy ją w globalnym kontekście.

Wywołanie this będzie więc odnosiło się do globalnego obiektu (Window w przeglądarkach, global w Node.js), lub zwróci undefined jeśli będziemy w trybie ścisłym.

Jeśli chcemy to naprawić, musimy wyraźnie powiązać przypisywaną metodę drive z innym kontekstem, w którym chcemy aby została wykonana. Takie powiązanie uzyskamy korzystając z metody bind().

W naszym przypadku chcemy powiązać tą metodę z obiektem Car.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html index c98d0f978..8c53ce683 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive

driveMyCar()
- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html index 46644bd62..56c76b8ad 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli jako efekt wywołania Car.drive() oraz driveMyCar()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html index 892c96586..c85cf718f 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html index 2ab16a0cb..2ad95c265 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive.bind(Car)

driveMyCar()
- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html index 204cb1b84..96aa69ffd 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

W przykładzie z błędem, Car.drive() zaloguje do konsoli obiekt Car, natomiast driveMyCar() zaloguje globalny obiekt lub undefined w zależności od tego, czy aktywny będzie tryb ścisły (strict mode).

Przypisując do stałej driveMyCar metodę Car.drive, przypisujemy ją w globalnym kontekście.

Wywołanie this będzie więc odnosiło się do globalnego obiektu (Window w przeglądarkach, global w Node.js), lub zwróci undefined jeśli będziemy w trybie ścisłym.

Jeśli chcemy to naprawić, musimy wyraźnie powiązać przypisywaną metodę drive z innym kontekstem, w którym chcemy aby została wykonana. Takie powiązanie uzyskamy korzystając z metody bind().

W naszym przypadku chcemy powiązać tą metodę z obiektem Car.

- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html index 7c8d47917..be11165c8 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #039

🪲 Znajdź buga

console.log(false || true)
console.log(true || false)
console.log("false" || "true")

console.log(undefined || null)
console.log(null || undefined)

console.log(NaN || undefined)
console.log(undefined || NaN)

console.log("" || "not empty")
console.log(" " || "not empty")

console.log(0 || "not zero")
console.log("0" || "not zero")

console.log([] || "not empty array")

console.log(false || " " || alert("!"))

Jakie wartości zostaną zalogowane do konsoli?

Czy funkcja alert() zostanie wywołana?

🧪 Rozwiązanie

console.log(false || true) // true
console.log(true || false) // true
console.log("false" || "true") // "false"

console.log(undefined || null) // null
console.log(null || undefined) // undefined

console.log(NaN || undefined) // undefined
console.log(undefined || NaN) // NaN

console.log("" || "not empty") // "not empty"
console.log(" " || "not empty") // " "

console.log(0 || "not zero") // "not zero"
console.log("0" || "not zero") // "0"

console.log([] || "not empty array") // "[]"

console.log(false || " " || alert("!")) // " "

Operator logiczny LUB || porównuje wartości logiczne. Gdy operandy nie są wartościami logicznymi (true/false), sprowadza je do wartości logicznej. Następnie zwraca pierwszy z nich, jeśli jest on prawdziwy, lub drugi, w każdym innym przypadku.

Konwersja do wartości logicznej odbywa się za pomocą działania algorytmu, który odpowiada za konwersję w funkcji Boolean() lub podczas użycia podwójnego wykrzyknika !!.

Jeśli pierwszy operand po konwersji do wartości logicznej, jest wartością prawdziwą (true), to jest on zwracany w pierwotnej postaci.

Przykładowo, "to nie fałsz" || true zwróci "to nie fałsz"

Warto pamiętać, że występuje tutaj efekt zwarcia tzn. gdy pierwszy operand jest prawdziwy, drugi operand jest już całkowicie pomijany. Gdyby zamiast true pojawiło się np. wywołanie funkcji, to funkcja nie zostałaby w żaden sposób wywołana.

Jeśli natomiast pierwszy operand || jest wartością fałszywą, to automatycznie zwracany zostaje operand drugi. Nie ma znaczenia, czy jest on prawdziwy czy fałszywy.

Można w ten sposób stworzyć np. łańcuch wielu operatorów ||, który zwróci operand w momencie gdy napotka na taki, który jest prawdziwy, jednocześnie zatrzymując wykonywanie dalszej części kodu z łańcucha.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html index f8ac7914c..2232609ce 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(false || true)
console.log(true || false)
console.log("false" || "true")

console.log(undefined || null)
console.log(null || undefined)

console.log(NaN || undefined)
console.log(undefined || NaN)

console.log("" || "not empty")
console.log(" " || "not empty")

console.log(0 || "not zero")
console.log("0" || "not zero")

console.log([] || "not empty array")

console.log(false || " " || alert("!"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html index ba6bd176e..0b64c5cf8 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

Czy funkcja alert() zostanie wywołana?

- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html index 8c26e1a0c..cf6d4b4e1 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html index 31433b9df..3f47cfe2f 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
console.log(false || true) // true
console.log(true || false) // true
console.log("false" || "true") // "false"

console.log(undefined || null) // null
console.log(null || undefined) // undefined

console.log(NaN || undefined) // undefined
console.log(undefined || NaN) // NaN

console.log("" || "not empty") // "not empty"
console.log(" " || "not empty") // " "

console.log(0 || "not zero") // "not zero"
console.log("0" || "not zero") // "0"

console.log([] || "not empty array") // "[]"

console.log(false || " " || alert("!")) // " "
- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html index de21a32c5..890ed5b92 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Operator logiczny LUB || porównuje wartości logiczne. Gdy operandy nie są wartościami logicznymi (true/false), sprowadza je do wartości logicznej. Następnie zwraca pierwszy z nich, jeśli jest on prawdziwy, lub drugi, w każdym innym przypadku.

Konwersja do wartości logicznej odbywa się za pomocą działania algorytmu, który odpowiada za konwersję w funkcji Boolean() lub podczas użycia podwójnego wykrzyknika !!.

Jeśli pierwszy operand po konwersji do wartości logicznej, jest wartością prawdziwą (true), to jest on zwracany w pierwotnej postaci.

Przykładowo, "to nie fałsz" || true zwróci "to nie fałsz"

Warto pamiętać, że występuje tutaj efekt zwarcia tzn. gdy pierwszy operand jest prawdziwy, drugi operand jest już całkowicie pomijany. Gdyby zamiast true pojawiło się np. wywołanie funkcji, to funkcja nie zostałaby w żaden sposób wywołana.

Jeśli natomiast pierwszy operand || jest wartością fałszywą, to automatycznie zwracany zostaje operand drugi. Nie ma znaczenia, czy jest on prawdziwy czy fałszywy.

Można w ten sposób stworzyć np. łańcuch wielu operatorów ||, który zwróci operand w momencie gdy napotka na taki, który jest prawdziwy, jednocześnie zatrzymując wykonywanie dalszej części kodu z łańcucha.

- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html index 396729130..e8a94179a 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html @@ -7,14 +7,14 @@ - - + +
Przejdź do głównej zawartości

Bug #047

🪲 Znajdź buga

const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1:
func1`first ${"val"}, second ${["a", "b"]}`

// 2:
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3:
func2`first ${"val"}, second ${["a", "b"]}`

// 4:
func2(`first ${"val"}, second ${["a", "b"]}`)

Czy potrafisz wskazać, w którym przykładzie (1, 2, 3, 4) zostanie zwrócona wartość first val, second a,b ?

🧪 Rozwiązanie

const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1: ["first ", ", second ", ""]
func1`first ${"val"}, second ${["a", "b"]}`

// 2: first val, second a,b
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3: [Array[3], "val", Array[2]]
func2`first ${"val"}, second ${["a", "b"]}`

// 4: ["first val, second a,b"]
func2(`first ${"val"}, second ${["a", "b"]}`)

first val, second a,b zostanie zwrócone w wywołaniu nr 2.

Przykłady 1 i 3 to wywołania tzw. etykietowanego szablonu (tagged template). Używając grawisów (backtick `) możemy wywoływać funkcje przekazując literał szablonu (template literal) jako argument.

Funkcja ma wtedy do dyspozycji goły tekst jako pierwszy parametr, a pod kolejnymi, dynamicznie generowanymi parametrami, dostępne są ewaluacje notacji ${} przekazane wewnątrz literału szablonu.

W przykładzie 1, w funkcji pod parametrem args mamy dostępną tylko tablicę z gołymi fragmentami tekstu z literału szablonu. Brakuje w niej elementów wywoływanych za pomocą notacji ${}, które dostępne są pod kolejnymi, dynamicznie tworzonymi parametrami funkcji.

Przykład 3 różni się od 1 tylko użyciem parametru reszty dla argumentów funkcji. Tym samym, wszystkie dynamicznie wygenerowane parametry dostępne są w tablicy args.

Pierwszy element tablicy zawiera 3 wartości gołego tekstu, te same, które zostały zalogowane w przykładzie 1.

Kolejne elementy tablicy to wartości wywołane wewnątrz notacji ${}, czyli val oraz tablica z 2 elementami ["a", "b"].

Przykład 2 zwraca nam ciąg znaków przekazany jako argument, już po ewaluacji kodu umieszczonego w notacjach ${}.

Przykład 4 robi to samo co 2, jednak z uwagi na użycie parametru reszty ...args, zwrócona zostaje tablica przekazanych argumentów. Przekazany został tylko 1 argument w postaci literału szablonu, więc tablica zawiera tylko 1 element, ciąg znaków, taki jak ten z przykładu nr 2.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html index c8ef4c566..9da06688f 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1:
func1`first ${"val"}, second ${["a", "b"]}`

// 2:
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3:
func2`first ${"val"}, second ${["a", "b"]}`

// 4:
func2(`first ${"val"}, second ${["a", "b"]}`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html index d93e00b82..ce81bb355 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Czy potrafisz wskazać, w którym przykładzie (1, 2, 3, 4) zostanie zwrócona wartość first val, second a,b ?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html index ab0762108..23ca77833 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html index a6fb07838..0e9ce3817 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości
const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1: ["first ", ", second ", ""]
func1`first ${"val"}, second ${["a", "b"]}`

// 2: first val, second a,b
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3: [Array[3], "val", Array[2]]
func2`first ${"val"}, second ${["a", "b"]}`

// 4: ["first val, second a,b"]
func2(`first ${"val"}, second ${["a", "b"]}`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html index a873ca8ed..91f0853ae 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

first val, second a,b zostanie zwrócone w wywołaniu nr 2.

Przykłady 1 i 3 to wywołania tzw. etykietowanego szablonu (tagged template). Używając grawisów (backtick `) możemy wywoływać funkcje przekazując literał szablonu (template literal) jako argument.

Funkcja ma wtedy do dyspozycji goły tekst jako pierwszy parametr, a pod kolejnymi, dynamicznie generowanymi parametrami, dostępne są ewaluacje notacji ${} przekazane wewnątrz literału szablonu.

W przykładzie 1, w funkcji pod parametrem args mamy dostępną tylko tablicę z gołymi fragmentami tekstu z literału szablonu. Brakuje w niej elementów wywoływanych za pomocą notacji ${}, które dostępne są pod kolejnymi, dynamicznie tworzonymi parametrami funkcji.

Przykład 3 różni się od 1 tylko użyciem parametru reszty dla argumentów funkcji. Tym samym, wszystkie dynamicznie wygenerowane parametry dostępne są w tablicy args.

Pierwszy element tablicy zawiera 3 wartości gołego tekstu, te same, które zostały zalogowane w przykładzie 1.

Kolejne elementy tablicy to wartości wywołane wewnątrz notacji ${}, czyli val oraz tablica z 2 elementami ["a", "b"].

Przykład 2 zwraca nam ciąg znaków przekazany jako argument, już po ewaluacji kodu umieszczonego w notacjach ${}.

Przykład 4 robi to samo co 2, jednak z uwagi na użycie parametru reszty ...args, zwrócona zostaje tablica przekazanych argumentów. Przekazany został tylko 1 argument w postaci literału szablonu, więc tablica zawiera tylko 1 element, ciąg znaków, taki jak ten z przykładu nr 2.

- - + + \ No newline at end of file diff --git a/100-bugow-js/sukces.html b/100-bugow-js/sukces.html index 567603868..04ddad5b5 100644 --- a/100-bugow-js/sukces.html +++ b/100-bugow-js/sukces.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Pomyślnie potwierdziłeś zapis 🎉

Pierwszy bug został właśnie wysłany do Twojej skrzynki. Sprawdź go.

Kolejne wiadomości będziesz otrzymywał w odstępach co 24 godziny.

Sprawdź też kanał na YouTube, jeśli nie chcesz przegapić nowych materiałów.

- - + + \ No newline at end of file diff --git a/100-bugow-js/wymagane-potwierdzenie.html b/100-bugow-js/wymagane-potwierdzenie.html index 2fe23bd18..c72a8d81b 100644 --- a/100-bugow-js/wymagane-potwierdzenie.html +++ b/100-bugow-js/wymagane-potwierdzenie.html @@ -7,15 +7,15 @@ - - + +
Przejdź do głównej zawartości

Sprawdź swoją skrzynkę 📩

Aby zacząć otrzymywać wiadomości z bugami,
kliknij w właśnie wysłany do Ciebie link aktywacyjny.

Sprawdź inne foldery w poczcie np. Oferty lub Spam.

Jeśli wiadomość tam trafiła, przenieś ją do głównego folderu,
aby kolejne wiadomości trafiały do Ciebie bez problemu.

- - + + \ No newline at end of file diff --git a/404.html b/404.html index 99bdcc99a..48bad8e35 100644 --- a/404.html +++ b/404.html @@ -7,13 +7,13 @@ - - + +
Przejdź do głównej zawartości

Strona nie została znaleziona

Nie mogliśmy znaleźć strony której szukasz.

Proszę skontaktuj się z właścielem strony, z której link doprowadził Cię tutaj i poinformuj go, że link jest nieprawidłowy.

- - + + \ No newline at end of file diff --git a/assets/js/26a6d6fe.2e29b319.js b/assets/js/26a6d6fe.2e29b319.js deleted file mode 100644 index 69abbdf31..000000000 --- a/assets/js/26a6d6fe.2e29b319.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodisity_pl=self.webpackChunkcodisity_pl||[]).push([[13666],{8060:(e,t,a)=>{a.r(t),a.d(t,{contentTitle:()=>p,default:()=>x,frontMatter:()=>c,metadata:()=>w,toc:()=>b});var n=a(87462),l=a(67294),o=a(3905),i=a(9669),s=a.n(i);const r="/100-bugow-js/wymagane-potwierdzenie",d="https://codisity.pl/100-bugow-js/sukces",m="https://mailer.codisity.pl/api/subscribe/";function u(e){let{listName:t,buttonText:a}=e;const[n,o]=(0,l.useState)(!1),[i,u]=(0,l.useState)(null);return l.createElement(l.Fragment,null,l.createElement("form",{onSubmit:async function(e){e.preventDefault();const a=e.target,n=new FormData(a).get("email");localStorage.setItem("email",n),o(!0),u(null);try{await s().post(m,{email:n,listName:t,confirmationRedirectUrl:d}),window.location.assign(r)}catch(l){return o(!1),l?.response?.data?.error?u(l?.response?.data?.error):(console.error(l),u("Niezdefiniowany b\u0142\u0105d"))}},autoComplete:"on"},l.createElement("fieldset",{className:"min-w-[360px] inline-flex flex-col gap-2 p-2 shadow-xl focus-within:shadow-xl transition-shadow duration-300 rounded-lg disabled:opacity-75 outline-3",disabled:n},l.createElement("label",{htmlFor:"inputEmail",className:"sr-only"},"Tw\xf3j email"),l.createElement("input",{name:"email",type:"email",id:"inputEmail",className:"px-3 py-2 rounded-md placeholder:text-slate-500 "+(i?"border-2 border-rose-600":""),placeholder:"twoj-adres@gmail.com"}),l.createElement("button",{className:"text-white text-xl font-bold whitespace-nowrap py-4 rounded-md bg-blue-700 enabled:hover:bg-blue-800"},n?"Przetwarzam...":a)),i&&l.createElement("p",{className:"mt-1 text-base text-rose-600"},i)))}const c={title:"100 Bug\xf3w JS"},p=void 0,w={type:"mdx",permalink:"/100-bugow-js/",source:"@site/src/pages/100-bugow-js/index.mdx",title:"100 Bug\xf3w JS",description:"100 Bug\xf3w JS \ud83e\udeb2",frontMatter:{title:"100 Bug\xf3w JS"}},b=[],g={toc:b},k="wrapper";function x(e){let{components:t,...a}=e;return(0,o.kt)(k,(0,n.Z)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("div",{className:"max-w-xl mx-auto"},(0,o.kt)("h1",{className:"text-center"},"100 Bug\xf3w JS \ud83e\udeb2"),(0,o.kt)("div",{className:"mb-12 text-lg text-justify flex justify-center"},(0,o.kt)("div",null,(0,o.kt)("p",null,(0,o.kt)("strong",null,"Poznaj lepiej JavaScript"),", odnajduj\u0105c drobne b\u0142\u0119dy w kodzie."),(0,o.kt)("p",null,"Zapisz si\u0119 podaj\u0105c sw\xf3j email, a ",(0,o.kt)("strong",null,"przez 100 dni")," b\u0119dziesz otrzymywa\u0142 na swoj\u0105 skrzynk\u0119"," ",(0,o.kt)("strong",null,"kr\xf3tki fragment kodu JavaScript")," z ukrytym b\u0142\u0119dem."),(0,o.kt)("p",null,"Ka\u017cda wiadomo\u015b\u0107 b\u0119dzie zawiera\u0107 r\xf3wnie\u017c"," ",(0,o.kt)("strong",null,"link do rozwi\u0105zania"),"."))),(0,o.kt)("div",{className:"flex justify-center"},(0,o.kt)(u,{listName:"100-bugow-js",buttonText:"Zacznij Odkrywa\u0107 Bugi",mdxType:"AutoresponderForm"}))))}x.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/26a6d6fe.88a609bd.js b/assets/js/26a6d6fe.88a609bd.js new file mode 100644 index 000000000..81f0db1cc --- /dev/null +++ b/assets/js/26a6d6fe.88a609bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodisity_pl=self.webpackChunkcodisity_pl||[]).push([[13666],{8060:(e,t,a)=>{a.r(t),a.d(t,{contentTitle:()=>p,default:()=>x,frontMatter:()=>c,metadata:()=>w,toc:()=>b});var n=a(87462),l=a(67294),o=a(3905),i=a(9669),s=a.n(i);const r="/100-bugow-js/wymagane-potwierdzenie",d="https://codisity.pl/100-bugow-js/sukces",m="https://mailer.codisity.pl/api/subscribe";function u(e){let{listName:t,buttonText:a}=e;const[n,o]=(0,l.useState)(!1),[i,u]=(0,l.useState)(null);return l.createElement(l.Fragment,null,l.createElement("form",{onSubmit:async function(e){e.preventDefault();const a=e.target,n=new FormData(a).get("email");localStorage.setItem("email",n),o(!0),u(null);try{await s().post(m,{email:n,listName:t,confirmationRedirectUrl:d}),window.location.assign(r)}catch(l){return o(!1),l?.response?.data?.error?u(l?.response?.data?.error):(console.error(l),u("Niezdefiniowany b\u0142\u0105d"))}},autoComplete:"on"},l.createElement("fieldset",{className:"min-w-[360px] inline-flex flex-col gap-2 p-2 shadow-xl focus-within:shadow-xl transition-shadow duration-300 rounded-lg disabled:opacity-75 outline-3",disabled:n},l.createElement("label",{htmlFor:"inputEmail",className:"sr-only"},"Tw\xf3j email"),l.createElement("input",{name:"email",type:"email",id:"inputEmail",className:"px-3 py-2 rounded-md placeholder:text-slate-500 "+(i?"border-2 border-rose-600":""),placeholder:"twoj-adres@gmail.com"}),l.createElement("button",{className:"text-white text-xl font-bold whitespace-nowrap py-4 rounded-md bg-blue-700 enabled:hover:bg-blue-800"},n?"Przetwarzam...":a)),i&&l.createElement("p",{className:"mt-1 text-base text-rose-600"},i)))}const c={title:"100 Bug\xf3w JS"},p=void 0,w={type:"mdx",permalink:"/100-bugow-js/",source:"@site/src/pages/100-bugow-js/index.mdx",title:"100 Bug\xf3w JS",description:"100 Bug\xf3w JS \ud83e\udeb2",frontMatter:{title:"100 Bug\xf3w JS"}},b=[],g={toc:b},k="wrapper";function x(e){let{components:t,...a}=e;return(0,o.kt)(k,(0,n.Z)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("div",{className:"max-w-xl mx-auto"},(0,o.kt)("h1",{className:"text-center"},"100 Bug\xf3w JS \ud83e\udeb2"),(0,o.kt)("div",{className:"mb-12 text-lg text-justify flex justify-center"},(0,o.kt)("div",null,(0,o.kt)("p",null,(0,o.kt)("strong",null,"Poznaj lepiej JavaScript"),", odnajduj\u0105c drobne b\u0142\u0119dy w kodzie."),(0,o.kt)("p",null,"Zapisz si\u0119 podaj\u0105c sw\xf3j email, a ",(0,o.kt)("strong",null,"przez 100 dni")," b\u0119dziesz otrzymywa\u0142 na swoj\u0105 skrzynk\u0119"," ",(0,o.kt)("strong",null,"kr\xf3tki fragment kodu JavaScript")," z ukrytym b\u0142\u0119dem."),(0,o.kt)("p",null,"Ka\u017cda wiadomo\u015b\u0107 b\u0119dzie zawiera\u0107 r\xf3wnie\u017c"," ",(0,o.kt)("strong",null,"link do rozwi\u0105zania"),"."))),(0,o.kt)("div",{className:"flex justify-center"},(0,o.kt)(u,{listName:"100-bugow-js",buttonText:"Zacznij Odkrywa\u0107 Bugi",mdxType:"AutoresponderForm"}))))}x.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.1ba32202.js b/assets/js/main.1d5c8ab5.js similarity index 99% rename from assets/js/main.1ba32202.js rename to assets/js/main.1d5c8ab5.js index f7b90335a..599dd29b8 100644 --- a/assets/js/main.1ba32202.js +++ b/assets/js/main.1d5c8ab5.js @@ -1,2 +1,2 @@ -/*! For license information please see main.1ba32202.js.LICENSE.txt */ -(self.webpackChunkcodisity_pl=self.webpackChunkcodisity_pl||[]).push([[40179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(67294),a=n(87462),c=n(68356),i=n.n(c),s=n(16887);const r={"000665dd":[()=>n.e(85230).then(n.bind(n,16203)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.md",16203],"01a4e876":[()=>n.e(53952).then(n.bind(n,11734)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-2-mapa-strony.md",11734],"02e6af99":[()=>n.e(17384).then(n.bind(n,20386)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.md",20386],"02ffdfe4":[()=>Promise.all([n.e(40532),n.e(3473),n.e(17119)]).then(n.bind(n,1657)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/index.mdx",1657],"03236927":[()=>n.e(55119).then(n.bind(n,60900)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.md",60900],"0330f347":[()=>n.e(57860).then(n.bind(n,86546)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-0-wprowadzenie.md",86546],"034f1ed4":[()=>n.e(9929).then(n.bind(n,818)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.md",818],"039c99a0":[()=>n.e(43191).then(n.bind(n,20803)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.md",20803],"03faf0a9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(78309)]).then(n.bind(n,84047)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/index.mdx",84047],"0411acde":[()=>n.e(49583).then(n.bind(n,359)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.md",359],"0418672b":[()=>n.e(92815).then(n.bind(n,67747)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.md",67747],"041d4130":[()=>n.e(11279).then(n.bind(n,55250)),"@site/docs/01-informatyka/03-systemy-operacyjne/05-free-bsd.md",55250],"0440d02f":[()=>n.e(96953).then(n.bind(n,76477)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.md",76477],"0464ef27":[()=>n.e(54414).then(n.bind(n,5707)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.md",5707],"048a21ad":[()=>n.e(89238).then(n.bind(n,94990)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.md",94990],"04f6e2c3":[()=>n.e(86151).then(n.bind(n,4893)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-1-przygotowanie-elementow-szkieletu.md",4893],"05149cde":[()=>n.e(9258).then(n.t.bind(n,914,19)),"~docs/default/tag-docs-tags-big-o-c6d.json",914],"051f438e":[()=>n.e(62982).then(n.bind(n,50684)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.md",50684],"051f7773":[()=>n.e(7667).then(n.t.bind(n,50777,19)),"~docs/default/tag-docs-tags-ddd-a9b.json",50777],"05add8f7":[()=>n.e(63364).then(n.bind(n,31613)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.md",31613],"05c66f1b":[()=>n.e(67138).then(n.bind(n,68085)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.md",68085],"05f0acd5":[()=>n.e(45442).then(n.bind(n,79366)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.md",79366],"0640dad6":[()=>n.e(24426).then(n.bind(n,71890)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.md",71890],"0673ff60":[()=>Promise.all([n.e(40532),n.e(3473),n.e(70423)]).then(n.bind(n,72207)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/index.mdx",72207],"071d0e20":[()=>n.e(69252).then(n.bind(n,3378)),"@site/docs/01-informatyka/03-systemy-operacyjne/01-linux.md",3378],"07cd6fa5":[()=>n.e(13366).then(n.bind(n,78706)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.md",78706],"08bf3db3":[()=>n.e(29124).then(n.bind(n,22145)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.md",22145],"093bf030":[()=>Promise.all([n.e(40532),n.e(3473),n.e(30999)]).then(n.bind(n,61094)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/index.mdx",61094],"09bb6e5a":[()=>n.e(92372).then(n.t.bind(n,93423,19)),"~docs/default/tag-docs-tags-dns-a72.json",93423],"0aa05009":[()=>n.e(14867).then(n.bind(n,49645)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.md",49645],"0b1402ec":[()=>n.e(77196).then(n.bind(n,1917)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.md",1917],"0b54690a":[()=>n.e(52643).then(n.bind(n,17053)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.md",17053],"0b93d927":[()=>n.e(92273).then(n.bind(n,61448)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.md",61448],"0be52f91":[()=>n.e(38773).then(n.bind(n,85620)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.md",85620],"0bfaecab":[()=>n.e(32658).then(n.t.bind(n,91103,19)),"~docs/default/tag-docs-tags-pwa-12c.json",91103],"0c910f2c":[()=>n.e(47269).then(n.bind(n,25081)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.md",25081],"0cb16f1a":[()=>n.e(6395).then(n.bind(n,51500)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.md",51500],"0ce570b0":[()=>n.e(58172).then(n.bind(n,23618)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.md",23618],"0ce5b853":[()=>n.e(14334).then(n.bind(n,26791)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.md",26791],"0d0cfc9b":[()=>n.e(89731).then(n.bind(n,3323)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.md",3323],"0d1c7671":[()=>n.e(64785).then(n.t.bind(n,35548,19)),"~docs/default/tag-docs-tags-algorytm-cf6.json",35548],"0d2e8ed2":[()=>n.e(54702).then(n.t.bind(n,29694,19)),"~docs/default/tag-docs-tags-db-fec.json",29694],"0e149194":[()=>n.e(1173).then(n.bind(n,70064)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.md",70064],"0e30e5b5":[()=>n.e(94866).then(n.bind(n,18412)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.md",18412],"0e839c7a":[()=>n.e(37827).then(n.bind(n,99975)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.md",99975],"0ed29833":[()=>n.e(40609).then(n.bind(n,48817)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.md",48817],"0f793388":[()=>n.e(51661).then(n.t.bind(n,6182,19)),"~docs/default/tag-docs-tags-state-5b3.json",6182],"0fc669ab":[()=>n.e(40078).then(n.bind(n,10927)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.md",10927],"101401c2":[()=>n.e(55510).then(n.bind(n,34201)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.md",34201],"107ec02c":[()=>n.e(91543).then(n.bind(n,18757)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.md",18757],"10e8a4c3":[()=>n.e(41243).then(n.bind(n,57199)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.md",57199],"11ec7ab7":[()=>Promise.all([n.e(40532),n.e(3473),n.e(63037)]).then(n.bind(n,93157)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/index.mdx",93157],"124f8898":[()=>n.e(28096).then(n.bind(n,99418)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.md",99418],"12a26bf9":[()=>n.e(77922).then(n.bind(n,89892)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.md",89892],"132ae864":[()=>Promise.all([n.e(40532),n.e(3473),n.e(93520)]).then(n.bind(n,51937)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/index.mdx",51937],"1348f3b9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(71154)]).then(n.bind(n,91790)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/index.mdx",91790],"139744d8":[()=>Promise.all([n.e(40532),n.e(3473),n.e(57052)]).then(n.bind(n,50503)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/index.mdx",50503],14108782:[()=>n.e(31226).then(n.bind(n,8008)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.md",8008],"143bde44":[()=>n.e(49444).then(n.bind(n,94148)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.md",94148],"14c39212":[()=>n.e(4323).then(n.t.bind(n,49582,19)),"~docs/default/tag-docs-tags-docs-d3a.json",49582],"1512e94b":[()=>Promise.all([n.e(40532),n.e(3473),n.e(33427)]).then(n.bind(n,66701)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/index.mdx",66701],"1568ef07":[()=>n.e(10457).then(n.bind(n,41349)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.md",41349],"15dcd4d5":[()=>n.e(95028).then(n.bind(n,35209)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.md",35209],"16090ce9":[()=>n.e(28714).then(n.bind(n,98858)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.md",98858],"168c3334":[()=>n.e(53414).then(n.bind(n,45456)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.md",45456],16949589:[()=>n.e(4181).then(n.bind(n,12)),"@site/docs/01-informatyka/16-debugowanie.md",12],"16a86f87":[()=>n.e(55327).then(n.bind(n,12755)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.md",12755],"16dc8209":[()=>n.e(47391).then(n.bind(n,18096)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.md",18096],"16e67a08":[()=>n.e(83770).then(n.bind(n,39661)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.md",39661],"1762f0ac":[()=>n.e(65799).then(n.bind(n,64440)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.md",64440],17896441:[()=>Promise.all([n.e(40532),n.e(3473),n.e(10817),n.e(27918)]).then(n.bind(n,49657)),"@theme/DocItem",49657],"180ed2a4":[()=>n.e(47373).then(n.bind(n,12115)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.md",12115],"187e279e":[()=>n.e(35651).then(n.bind(n,55287)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.md",55287],"18ca5c79":[()=>n.e(20001).then(n.bind(n,34917)),"@site/docs/01-informatyka/05-programowanie/00-programowanie.md",34917],"18e1cb18":[()=>n.e(78920).then(n.bind(n,4399)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.md",4399],"18e7f551":[()=>n.e(54469).then(n.t.bind(n,11094,19)),"~docs/default/tag-docs-tags-hosting-634.json",11094],"18ed0261":[()=>n.e(5926).then(n.bind(n,31374)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.md",31374],"19091cdf":[()=>n.e(39074).then(n.bind(n,27628)),"@site/docs/02-ux-ui/00-ux-ui.md",27628],"1946c1b0":[()=>n.e(34194).then(n.bind(n,84736)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.md",84736],"198a1ccf":[()=>n.e(6122).then(n.bind(n,26297)),"@site/docs/01-informatyka/15-testowanie.md",26297],"19b2d324":[()=>n.e(77618).then(n.bind(n,41621)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.md",41621],"19d620af":[()=>n.e(75834).then(n.t.bind(n,65041,19)),"~docs/default/tag-docs-tags-ui-22c.json",65041],"19ebc4f2":[()=>n.e(55056).then(n.bind(n,70377)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.md",70377],"1a030ce7":[()=>Promise.all([n.e(40532),n.e(3473),n.e(15198)]).then(n.bind(n,40947)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/index.mdx",40947],"1a6a286c":[()=>n.e(65893).then(n.bind(n,87652)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.md",87652],"1a941675":[()=>n.e(12291).then(n.bind(n,35531)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.md",35531],"1aa6d80f":[()=>n.e(31087).then(n.bind(n,75022)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.md",75022],"1acfb591":[()=>n.e(68073).then(n.bind(n,1972)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.md",1972],"1adb1ec9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(2268)]).then(n.bind(n,19949)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/index.mdx",19949],"1b3221f9":[()=>n.e(31775).then(n.bind(n,14013)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.md",14013],"1be78505":[()=>Promise.all([n.e(40532),n.e(29514)]).then(n.bind(n,19963)),"@theme/DocPage",19963],"1c18c48f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(3918)]).then(n.bind(n,31833)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/index.mdx",31833],"1d485327":[()=>n.e(41605).then(n.bind(n,92540)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.md",92540],"1df25d8f":[()=>n.e(80160).then(n.bind(n,57198)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.md",57198],"1df93b7f":[()=>n.e(53237).then(n.bind(n,69754)),"@site/src/pages/index.tsx",69754],"1e23a1d1":[()=>n.e(55795).then(n.bind(n,89623)),"@site/docs/03-frontend/07-pakiety/01-webpack/08-\u25b6\ufe0f-podzial-plikow-konfiguracyjnych.md",89623],"1e5b87d5":[()=>n.e(73828).then(n.t.bind(n,35958,19)),"~docs/default/tag-docs-tags-hash-88d.json",35958],"1e971022":[()=>n.e(43022).then(n.bind(n,82522)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.md",82522],"1ecfb6a1":[()=>Promise.all([n.e(40532),n.e(3473),n.e(49724)]).then(n.bind(n,63500)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/index.mdx",63500],"1ee67351":[()=>n.e(93107).then(n.bind(n,28173)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.md",28173],"1f391b9e":[()=>Promise.all([n.e(40532),n.e(3473),n.e(10817),n.e(13085)]).then(n.bind(n,14247)),"@theme/MDXPage",14247],"1f8688ca":[()=>n.e(48783).then(n.bind(n,49764)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.md",49764],"1fdec661":[()=>n.e(53442).then(n.t.bind(n,80856,19)),"~docs/default/tag-docs-tags-cache-b57.json",80856],"1fe945cb":[()=>n.e(71022).then(n.bind(n,71865)),"@site/docs/01-informatyka/10-dns-i-domeny.md",71865],"205db268":[()=>n.e(78166).then(n.bind(n,39753)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-2-formularzdostepnosci-uslugi.md",39753],"219ef9cb":[()=>n.e(48723).then(n.bind(n,18913)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.md",18913],"21daf841":[()=>n.e(12219).then(n.bind(n,29301)),"@site/src/pages/100-bugow-js/wymagane-potwierdzenie.md",29301],"221c2bc4":[()=>Promise.all([n.e(40532),n.e(3473),n.e(88066)]).then(n.bind(n,1977)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/index.mdx",1977],"23553ba2":[()=>n.e(37181).then(n.bind(n,246)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.md",246],"23beba54":[()=>n.e(44090).then(n.bind(n,56299)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.md",56299],"240efcf0":[()=>Promise.all([n.e(40532),n.e(3473),n.e(4955)]).then(n.bind(n,11668)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/index.mdx",11668],"2417b2dd":[()=>n.e(64343).then(n.bind(n,19593)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.md",19593],"24185e05":[()=>n.e(16538).then(n.bind(n,40788)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.md",40788],24521656:[()=>n.e(58942).then(n.bind(n,99723)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.md",99723],"24726fc0":[()=>n.e(98108).then(n.bind(n,3234)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.md",3234],"2476c1c4":[()=>n.e(50701).then(n.bind(n,10814)),"@site/docs/02-ux-ui/02-praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-02-material-uzupelniajacy-ui.md",10814],"258699c7":[()=>n.e(9203).then(n.bind(n,14383)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.md",14383],"25ac8ba7":[()=>n.e(49248).then(n.bind(n,11629)),"@site/docs/01-informatyka/03-systemy-operacyjne/03-windows.md",11629],"25ebd437":[()=>Promise.all([n.e(40532),n.e(3473),n.e(44759)]).then(n.bind(n,95241)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/index.mdx",95241],"2610f6c0":[()=>n.e(1645).then(n.bind(n,77160)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.md",77160],"2688ef21":[()=>n.e(48189).then(n.t.bind(n,28142,19)),"~docs/default/tag-docs-tags-microsoft-ced.json",28142],"26a6d6fe":[()=>Promise.all([n.e(16214),n.e(13666)]).then(n.bind(n,8060)),"@site/src/pages/100-bugow-js/index.mdx",8060],"26d61991":[()=>Promise.all([n.e(40532),n.e(3473),n.e(352)]).then(n.bind(n,65613)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/index.mdx",65613],"26dcbbb2":[()=>n.e(81416).then(n.bind(n,3795)),"@site/docs/01-informatyka/03-systemy-operacyjne/04-chrome-os.md",3795],"26ddc48b":[()=>n.e(83706).then(n.bind(n,32502)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.md",32502],"27ac0aac":[()=>n.e(91862).then(n.bind(n,8592)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.md",8592],"27da2a28":[()=>n.e(93716).then(n.t.bind(n,41074,19)),"~docs/default/tag-docs-tags-chrome-83a.json",41074],"2800bf0b":[()=>n.e(97288).then(n.bind(n,60791)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.md",60791],"28a3451b":[()=>n.e(27107).then(n.bind(n,19474)),"@site/docs/01-informatyka/03-systemy-operacyjne/00-systemy-operacyjne.md",19474],"29256a58":[()=>n.e(68965).then(n.bind(n,53005)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.md",53005],"29ad98c9":[()=>n.e(12493).then(n.bind(n,51118)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.md",51118],"2a1cbcea":[()=>n.e(52622).then(n.bind(n,32205)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.md",32205],"2ab483d6":[()=>Promise.all([n.e(40532),n.e(3473),n.e(29653)]).then(n.bind(n,79017)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/index.mdx",79017],"2aec2163":[()=>n.e(83535).then(n.bind(n,56195)),"@site/docs/03-frontend/01-html/05-\u25b6\ufe0f-tabele-formularze-elementy-interaktywne-komponenty.md",56195],"2b0866cd":[()=>n.e(37065).then(n.bind(n,24052)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.md",24052],"2b14d38f":[()=>n.e(63012).then(n.bind(n,36716)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.md",36716],"2b16e227":[()=>n.e(16922).then(n.bind(n,91283)),"@site/docs/03-frontend/02-css/01-\u25b6\ufe0f-wprowadzenie-w-css.md",91283],"2c0d42e6":[()=>n.e(21171).then(n.bind(n,34004)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.md",34004],"2c3f2294":[()=>n.e(80697).then(n.bind(n,53383)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.md",53383],"2c428535":[()=>n.e(91832).then(n.bind(n,92907)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.md",92907],"2c71b8c7":[()=>n.e(80772).then(n.bind(n,26100)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.md",26100],"2ce9e165":[()=>n.e(79039).then(n.bind(n,70257)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.md",70257],"2d50d312":[()=>n.e(87332).then(n.bind(n,34913)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.md",34913],"2eb4db55":[()=>n.e(55574).then(n.bind(n,96617)),"@site/docs/01-informatyka/19-architektura-oprogramowania.md",96617],"2ebb811d":[()=>n.e(50114).then(n.bind(n,60050)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.md",60050],"2eeb76f5":[()=>Promise.all([n.e(40532),n.e(3473),n.e(36942)]).then(n.bind(n,59203)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/index.mdx",59203],"2fae5484":[()=>n.e(54707).then(n.bind(n,11024)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.md",11024],"2faf5f8d":[()=>n.e(75333).then(n.bind(n,77171)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.md",77171],"2fbb5300":[()=>n.e(63126).then(n.bind(n,97820)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-3-glebia.md",97820],"300c37de":[()=>n.e(33212).then(n.bind(n,88294)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.md",88294],"304051a0":[()=>n.e(81930).then(n.bind(n,64937)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.md",64937],"30be5cfe":[()=>Promise.all([n.e(40532),n.e(3473),n.e(11979)]).then(n.bind(n,64193)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/index.mdx",64193],"30c781ac":[()=>n.e(87548).then(n.bind(n,30208)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-6-detale.md",30208],"30d40704":[()=>n.e(49672).then(n.bind(n,16332)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.md",16332],"31734a7a":[()=>n.e(53211).then(n.t.bind(n,61664,19)),"~docs/default/tag-docs-tags-seo-baf.json",61664],31816458:[()=>Promise.all([n.e(40532),n.e(3473),n.e(39304)]).then(n.bind(n,29754)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/index.mdx",29754],"31b7bbe6":[()=>n.e(59790).then(n.t.bind(n,59247,19)),"~docs/default/tag-docs-tags-vps-610.json",59247],"31c250e4":[()=>Promise.all([n.e(40532),n.e(3473),n.e(56712)]).then(n.bind(n,25161)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/index.mdx",25161],"32b6cb06":[()=>n.e(99360).then(n.bind(n,28016)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.md",28016],"32c84f75":[()=>n.e(58365).then(n.bind(n,13811)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.md",13811],"3315e240":[()=>n.e(13069).then(n.bind(n,87066)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.md",87066],"332a8094":[()=>n.e(4124).then(n.bind(n,26747)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.md",26747],"3338c0e0":[()=>n.e(55791).then(n.t.bind(n,53592,19)),"~docs/default/tag-docs-tags-frontend-43f.json",53592],"335c931a":[()=>n.e(3036).then(n.bind(n,18304)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.md",18304],"34696ee0":[()=>n.e(16279).then(n.bind(n,2255)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.md",2255],"3482ea4d":[()=>n.e(23066).then(n.bind(n,41195)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.md",41195],"3484e3da":[()=>n.e(93013).then(n.bind(n,29022)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.md",29022],"34e24484":[()=>Promise.all([n.e(40532),n.e(3473),n.e(10679)]).then(n.bind(n,32164)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/index.mdx",32164],"355ae17e":[()=>n.e(39092).then(n.bind(n,58643)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.md",58643],"35acaae7":[()=>Promise.all([n.e(40532),n.e(3473),n.e(12126)]).then(n.bind(n,64832)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/index.mdx",64832],"35e8cbe2":[()=>n.e(95486).then(n.bind(n,43733)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.md",43733],"35f22c59":[()=>n.e(86522).then(n.bind(n,15268)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.md",15268],"360b6ef2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(1876)]).then(n.bind(n,16743)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/index.mdx",16743],"3683b838":[()=>Promise.all([n.e(40532),n.e(3473),n.e(6202)]).then(n.bind(n,61395)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/index.mdx",61395],"3720c009":[()=>Promise.all([n.e(40532),n.e(13751)]).then(n.bind(n,9861)),"@theme/DocTagsListPage",9861],"372d5953":[()=>n.e(68581).then(n.bind(n,38864)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.md",38864],"380577eb":[()=>n.e(21744).then(n.bind(n,64206)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.md",64206],"3897ba98":[()=>n.e(88155).then(n.bind(n,54233)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.md",54233],"39558a93":[()=>n.e(96307).then(n.bind(n,253)),"@site/docs/03-frontend/05-seo.md",253],"3989dfa9":[()=>n.e(67158).then(n.bind(n,1322)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.md",1322],"39e28333":[()=>n.e(66664).then(n.bind(n,23997)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.md",23997],"3a826b7d":[()=>n.e(62623).then(n.bind(n,64923)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.md",64923],"3abfc78d":[()=>n.e(80986).then(n.bind(n,43482)),"@site/docs/03-frontend/07-pakiety/00-pakiety.md",43482],"3ad6bc89":[()=>Promise.all([n.e(40532),n.e(3473),n.e(59298)]).then(n.bind(n,107)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/index.mdx",107],"3aed7afa":[()=>Promise.all([n.e(40532),n.e(3473),n.e(11412)]).then(n.bind(n,87139)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/index.mdx",87139],"3af07524":[()=>n.e(49376).then(n.bind(n,60419)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.md",60419],"3b35082a":[()=>n.e(3877).then(n.bind(n,87575)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.md",87575],"3bb7a4af":[()=>n.e(66378).then(n.t.bind(n,91327,19)),"~docs/default/tag-docs-tags-i-os-d44.json",91327],"3befa614":[()=>n.e(79459).then(n.t.bind(n,78447,19)),"~docs/default/tag-docs-tags-ux-c00.json",78447],"3c2a6dbe":[()=>n.e(66695).then(n.bind(n,18481)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.md",18481],"3ce88d35":[()=>n.e(98325).then(n.bind(n,32649)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.md",32649],"3d77b269":[()=>n.e(47512).then(n.bind(n,95049)),"@site/docs/03-frontend/07-pakiety/01-webpack/07-\u25b6\ufe0f-rozwiazywanie-sciezek-importu-plikow.md",95049],"3de4a2fa":[()=>n.e(50285).then(n.bind(n,55311)),"@site/docs/01-informatyka/05-programowanie/05-programowanie-deklaratywne.md",55311],"3e8f528e":[()=>n.e(50953).then(n.bind(n,91027)),"@site/docs/01-informatyka/12-dokumentacje.md",91027],"3ecc7b49":[()=>n.e(23334).then(n.bind(n,51028)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.md",51028],"3ecdd954":[()=>n.e(61108).then(n.bind(n,1387)),"@site/docs/01-informatyka/05-programowanie/06-programowanie-obiektowe.md",1387],"402ad4fa":[()=>Promise.all([n.e(40532),n.e(3473),n.e(35497)]).then(n.bind(n,99937)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/index.mdx",99937],"4050c730":[()=>n.e(48613).then(n.bind(n,25012)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.md",25012],"40b0947d":[()=>n.e(9625).then(n.bind(n,2181)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.md",2181],"40dee476":[()=>n.e(40824).then(n.bind(n,98932)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.md",98932],"40fe54c2":[()=>n.e(47223).then(n.bind(n,8411)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-1-korzystanie-z-figmy.md",8411],"41027c2e":[()=>n.e(2817).then(n.bind(n,75023)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.md",75023],"41154ebd":[()=>n.e(87175).then(n.bind(n,11464)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.md",11464],"41239f1e":[()=>n.e(51876).then(n.bind(n,6846)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.md",6846],"41b6678e":[()=>n.e(14091).then(n.t.bind(n,16879,19)),"~docs/default/tag-docs-tags-dev-tools-c6e.json",16879],"4217490a":[()=>n.e(7688).then(n.bind(n,43046)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.md",43046],"4256b6ae":[()=>n.e(35944).then(n.bind(n,64509)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-1-schemat-dzialan-uzytkownika.md",64509],"433883a5":[()=>Promise.all([n.e(40532),n.e(3473),n.e(65204)]).then(n.bind(n,3169)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/index.mdx",3169],"43ae16eb":[()=>n.e(9991).then(n.bind(n,19739)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.md",19739],"43fe1f45":[()=>n.e(53554).then(n.bind(n,53656)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.md",53656],"449a6de5":[()=>n.e(21724).then(n.bind(n,58515)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.md",58515],"44aca286":[()=>n.e(85311).then(n.bind(n,31750)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.md",31750],"453221ae":[()=>n.e(99739).then(n.bind(n,68374)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-5-rozmieszczenie-grafik.md",68374],"454290ab":[()=>n.e(92429).then(n.bind(n,51545)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.md",51545],"45651f83":[()=>n.e(58974).then(n.t.bind(n,59841,19)),"~docs/default/tag-docs-tags-scss-48a.json",59841],"45805a7d":[()=>n.e(29964).then(n.bind(n,86400)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.md",86400],"45aff26c":[()=>n.e(99606).then(n.bind(n,43294)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.md",43294],"46d7704f":[()=>n.e(7625).then(n.bind(n,83542)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.md",83542],"46dfeda4":[()=>n.e(2819).then(n.bind(n,61130)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.md",61130],"47e1c281":[()=>n.e(2575).then(n.bind(n,75579)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.md",75579],"4831cb31":[()=>Promise.all([n.e(40532),n.e(3473),n.e(39706)]).then(n.bind(n,46233)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/index.mdx",46233],"483304b7":[()=>n.e(61238).then(n.bind(n,7842)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.md",7842],"486ea28d":[()=>Promise.all([n.e(40532),n.e(3473),n.e(76393)]).then(n.bind(n,50529)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/index.mdx",50529],"4896f5b9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(73061)]).then(n.bind(n,7804)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/index.mdx",7804],"4968a63a":[()=>n.e(71600).then(n.bind(n,55816)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.md",55816],"49d00c1e":[()=>n.e(48070).then(n.bind(n,70453)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.md",70453],"4a2ee408":[()=>n.e(23838).then(n.bind(n,45345)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.md",45345],"4a3b31c2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(43164)]).then(n.bind(n,92851)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/index.mdx",92851],"4a4fb967":[()=>n.e(53549).then(n.t.bind(n,29294,19)),"~docs/default/tag-docs-tags-accessibility-83c.json",29294],"4a9578c3":[()=>n.e(78411).then(n.bind(n,74226)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.md",74226],"4aa65195":[()=>n.e(43042).then(n.bind(n,71124)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.md",71124],"4ad55a8e":[()=>n.e(34392).then(n.bind(n,37219)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/04-\u25b6\ufe0f-modyfikowanie-stanu-pojedynczych-elementow.md",37219],"4b0b58c4":[()=>n.e(98348).then(n.bind(n,5423)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.md",5423],"4b71967f":[()=>n.e(25357).then(n.bind(n,22378)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.md",22378],"4b7b9211":[()=>Promise.all([n.e(40532),n.e(3473),n.e(30836)]).then(n.bind(n,3058)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/index.mdx",3058],"4bee98d3":[()=>n.e(60262).then(n.bind(n,59345)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.md",59345],"4c337b15":[()=>Promise.all([n.e(40532),n.e(3473),n.e(21944)]).then(n.bind(n,13859)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/index.mdx",13859],"4c9f1066":[()=>n.e(15797).then(n.bind(n,78446)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.md",78446],"4ccefd11":[()=>n.e(68636).then(n.bind(n,54081)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.md",54081],"4d00a314":[()=>n.e(40536).then(n.t.bind(n,68341,19)),"~docs/default/tag-docs-tags-ram-4e4.json",68341],"4d98f1ea":[()=>n.e(5945).then(n.bind(n,71780)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.md",71780],"4db381fd":[()=>Promise.all([n.e(40532),n.e(3473),n.e(76080)]).then(n.bind(n,29971)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/index.mdx",29971],"4dd85953":[()=>Promise.all([n.e(40532),n.e(3473),n.e(85269)]).then(n.bind(n,62601)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/index.mdx",62601],"4e05102b":[()=>n.e(95719).then(n.bind(n,67546)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.md",67546],"4e84773e":[()=>n.e(42458).then(n.bind(n,34286)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.md",34286],"4eaca2fe":[()=>n.e(25385).then(n.bind(n,77391)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.md",77391],"4efe941e":[()=>n.e(49096).then(n.bind(n,24788)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.md",24788],"4f4efa3d":[()=>n.e(41563).then(n.bind(n,83896)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.md",83896],"4f5b3fa9":[()=>n.e(4013).then(n.bind(n,75164)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.md",75164],"4fcc4f38":[()=>n.e(43342).then(n.bind(n,43434)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.md",43434],"4fe941f7":[()=>n.e(17858).then(n.bind(n,97511)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.md",97511],"4ff7731a":[()=>n.e(10449).then(n.bind(n,54061)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.md",54061],"50c21f40":[()=>n.e(89885).then(n.bind(n,86042)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.md",86042],"522d4eee":[()=>n.e(62563).then(n.bind(n,94887)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.md",94887],"52385b6d":[()=>n.e(78624).then(n.bind(n,99466)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.md",99466],"5243faf5":[()=>Promise.all([n.e(40532),n.e(3473),n.e(98289)]).then(n.bind(n,75461)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/index.mdx",75461],"52916f6f":[()=>n.e(40843).then(n.bind(n,45260)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.md",45260],"531e550b":[()=>n.e(62331).then(n.bind(n,57039)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.md",57039],"5346f0db":[()=>n.e(82989).then(n.bind(n,31716)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.md",31716],"53ca6561":[()=>n.e(42342).then(n.bind(n,47929)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.md",47929],"5455a04e":[()=>n.e(37249).then(n.bind(n,87264)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.md",87264],"549e43c4":[()=>n.e(46632).then(n.bind(n,97478)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.md",97478],"54d23b05":[()=>n.e(68598).then(n.bind(n,98901)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.md",98901],"54d4bf9a":[()=>n.e(49256).then(n.bind(n,50001)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.md",50001],"55960ee5":[()=>n.e(74121).then(n.t.bind(n,37245,19)),"~docs/default/tags-list-current-prop-15a.json",37245],"5617f217":[()=>n.e(10656).then(n.bind(n,28108)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.md",28108],"569bff92":[()=>n.e(88203).then(n.t.bind(n,30488,19)),"~docs/default/tag-docs-tags-hardware-92c.json",30488],"56ebfa9f":[()=>n.e(14765).then(n.bind(n,97926)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.md",97926],"56f59040":[()=>n.e(68997).then(n.bind(n,78934)),"@site/docs/01-informatyka/21-praca-w-it.md",78934],"580d32c1":[()=>n.e(74539).then(n.bind(n,77143)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.md",77143],"5818cd7c":[()=>n.e(22603).then(n.bind(n,34263)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.md",34263],"587c2fe9":[()=>n.e(58053).then(n.bind(n,9020)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.md",9020],"58bd2c04":[()=>n.e(26558).then(n.t.bind(n,88468,19)),"~docs/default/tag-docs-tags-node-js-393.json",88468],"5925d5cc":[()=>n.e(14954).then(n.bind(n,83969)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.md",83969],"593ee81a":[()=>n.e(1835).then(n.bind(n,51346)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.md",51346],"595b6480":[()=>n.e(7494).then(n.bind(n,82578)),"@site/docs/03-frontend/09-progresywne-aplikacje.md",82578],"59b32e70":[()=>n.e(96888).then(n.bind(n,55010)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.md",55010],"59ea7eb4":[()=>n.e(44921).then(n.bind(n,97057)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.md",97057],"5a2a6530":[()=>n.e(31665).then(n.bind(n,8529)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.md",8529],"5a3e2929":[()=>n.e(55257).then(n.bind(n,64829)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.md",64829],"5a5a80ab":[()=>Promise.all([n.e(40532),n.e(3473),n.e(96643)]).then(n.bind(n,6935)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/index.mdx",6935],"5a5db26c":[()=>n.e(30554).then(n.bind(n,80863)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.md",80863],"5a76456b":[()=>n.e(9820).then(n.t.bind(n,25444,19)),"~docs/default/tag-docs-tags-cs-a4d.json",25444],"5a9db848":[()=>n.e(13462).then(n.bind(n,47869)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.md",47869],"5ae73cbf":[()=>Promise.all([n.e(40532),n.e(3473),n.e(69762)]).then(n.bind(n,21863)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/index.mdx",21863],"5c21f2de":[()=>n.e(41433).then(n.t.bind(n,14164,19)),"~docs/default/tag-docs-tags-ftp-3be.json",14164],"5c30c7a9":[()=>n.e(20116).then(n.bind(n,43858)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.md",43858],"5e014a9c":[()=>n.e(15164).then(n.bind(n,85465)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.md",85465],"5e2a3367":[()=>n.e(92162).then(n.bind(n,68629)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.md",68629],"5e39e38e":[()=>n.e(54307).then(n.bind(n,11903)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.md",11903],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"5ef9144f":[()=>n.e(37201).then(n.t.bind(n,6394,19)),"~docs/default/tag-docs-tags-tdd-62b.json",6394],"5f1e8e0d":[()=>n.e(73721).then(n.bind(n,70002)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/01-\u25b6\ufe0f-przygotowanie-srodowiska-deweloperskiego.md",70002],"5f5b5355":[()=>Promise.all([n.e(40532),n.e(3473),n.e(85233)]).then(n.bind(n,20701)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/index.mdx",20701],"5fea0253":[()=>n.e(8276).then(n.bind(n,45279)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.md",45279],"601f3968":[()=>n.e(26235).then(n.bind(n,32808)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.md",32808],"60ea458f":[()=>n.e(1404).then(n.bind(n,13973)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.md",13973],"6178c87f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(94878)]).then(n.bind(n,20508)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/index.mdx",20508],"61b4440e":[()=>n.e(76150).then(n.bind(n,72328)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.md",72328],"62239b99":[()=>n.e(4603).then(n.bind(n,65822)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.md",65822],"62e3e103":[()=>n.e(13310).then(n.bind(n,93971)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.md",93971],"6375d944":[()=>n.e(48040).then(n.bind(n,94407)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.md",94407],"6429ca61":[()=>n.e(24805).then(n.bind(n,77150)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.md",77150],"64df448d":[()=>n.e(62072).then(n.bind(n,63874)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.md",63874],"6522dcf6":[()=>n.e(77979).then(n.t.bind(n,44990,19)),"~docs/default/tag-docs-tags-os-647.json",44990],"6553856a":[()=>n.e(73006).then(n.bind(n,83450)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.md",83450],"6571e997":[()=>n.e(65401).then(n.bind(n,20644)),"@site/docs/01-informatyka/20-zarzadzanie-projektami.md",20644],"65feace0":[()=>n.e(75569).then(n.bind(n,37387)),"@site/docs/01-informatyka/02-warstwy-abstrakcji.md",37387],"660a9e4e":[()=>n.e(81573).then(n.bind(n,36431)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.md",36431],"6673f904":[()=>n.e(33484).then(n.bind(n,36655)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.md",36655],"679161de":[()=>n.e(40941).then(n.t.bind(n,83769,19)),"/home/runner/work/codisity.pl/codisity.pl/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"679c6249":[()=>n.e(63206).then(n.bind(n,96845)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.md",96845],"684344f5":[()=>n.e(77168).then(n.bind(n,90471)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.md",90471],"68d0df65":[()=>n.e(69633).then(n.t.bind(n,3486,19)),"~docs/default/tag-docs-tags-a-11-y-058.json",3486],"68dd6750":[()=>n.e(67183).then(n.bind(n,76732)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.md",76732],"697a838c":[()=>n.e(76569).then(n.bind(n,51284)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.md",51284],"69cfb56e":[()=>n.e(92966).then(n.bind(n,87588)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.md",87588],"6a184817":[()=>n.e(43109).then(n.bind(n,29259)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.md",29259],"6a6018ac":[()=>n.e(46746).then(n.t.bind(n,34907,19)),"~docs/default/tag-docs-tags-scrum-c11.json",34907],"6a677fa0":[()=>n.e(33050).then(n.bind(n,31668)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.md",31668],"6ab7799b":[()=>n.e(33466).then(n.bind(n,51374)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.md",51374],"6af14956":[()=>n.e(58221).then(n.t.bind(n,16567,19)),"~docs/default/tag-docs-tags-linux-f75.json",16567],"6b2ba85f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(32320)]).then(n.bind(n,58368)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/index.mdx",58368],"6b66f5c6":[()=>n.e(59218).then(n.bind(n,66241)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.md",66241],"6be015a4":[()=>n.e(69117).then(n.bind(n,58488)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/02-\u25b6\ufe0f-koncept-dzialania-redux-a.md",58488],"6be2343b":[()=>n.e(11118).then(n.bind(n,98809)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.md",98809],"6c674d03":[()=>n.e(17600).then(n.t.bind(n,80372,19)),"~docs/default/tag-docs-tags-network-cb4.json",80372],"6d0f3166":[()=>n.e(7295).then(n.bind(n,91375)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.md",91375],"6d948a43":[()=>n.e(33180).then(n.bind(n,5710)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.md",5710],"6dc651c7":[()=>n.e(28393).then(n.bind(n,89510)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.md",89510],"6e53e527":[()=>n.e(36073).then(n.bind(n,2904)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.md",2904],"6e7a2422":[()=>n.e(77542).then(n.bind(n,32747)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.md",32747],"6e8ed2cc":[()=>n.e(5034).then(n.bind(n,5780)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.md",5780],"6fd2e06c":[()=>n.e(62740).then(n.bind(n,2641)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.md",2641],"704c0f1d":[()=>n.e(62866).then(n.t.bind(n,32152,19)),"~docs/default/tag-docs-tags-css-690.json",32152],"7080ced1":[()=>n.e(81024).then(n.bind(n,59181)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.md",59181],"70b23246":[()=>n.e(84220).then(n.bind(n,50136)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.md",50136],"70ba2e6f":[()=>n.e(98441).then(n.bind(n,54967)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.md",54967],"715aca11":[()=>n.e(33502).then(n.bind(n,13567)),"@site/docs/03-frontend/07-pakiety/01-webpack/01-\u25b6\ufe0f-podstawowy-sposob-uzycia.md",13567],"7184ccab":[()=>Promise.all([n.e(40532),n.e(3473),n.e(58870)]).then(n.bind(n,65578)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/index.mdx",65578],"7186fb88":[()=>n.e(98200).then(n.bind(n,61151)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.md",61151],"7208d235":[()=>n.e(66790).then(n.bind(n,20994)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.md",20994],"7233e7af":[()=>n.e(78071).then(n.bind(n,18892)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.md",18892],"7249f594":[()=>n.e(39161).then(n.bind(n,93747)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.md",93747],"73579a94":[()=>n.e(71752).then(n.bind(n,58191)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.md",58191],"73760c40":[()=>n.e(72111).then(n.bind(n,69805)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.md",69805],"73a6c610":[()=>n.e(6523).then(n.bind(n,87436)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-1-tablica-inspiracji.md",87436],"73b80b4c":[()=>n.e(82140).then(n.bind(n,65456)),"@site/docs/01-informatyka/06-kontrola-wersji.md",65456],"73fca604":[()=>n.e(19034).then(n.bind(n,61037)),"@site/docs/02-ux-ui/02-praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-01-nagranie-z-webinaru-ux.md",61037],"741bccd0":[()=>n.e(16333).then(n.bind(n,49555)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.md",49555],"744fb43a":[()=>n.e(15068).then(n.bind(n,5842)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.md",5842],"747e705f":[()=>n.e(66240).then(n.bind(n,19773)),"@site/docs/03-frontend/07-pakiety/01-webpack/00-webpack.md",19773],"74b8c826":[()=>n.e(41546).then(n.bind(n,94837)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.md",94837],"74ecb5a8":[()=>n.e(4096).then(n.bind(n,92961)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/03-\u25b6\ufe0f-modyfikowanie-stanu-magazynu.md",92961],"75ce0515":[()=>n.e(71652).then(n.bind(n,36319)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.md",36319],"75fb086c":[()=>n.e(30206).then(n.bind(n,68029)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.md",68029],"75fdfa1a":[()=>Promise.all([n.e(40532),n.e(3473),n.e(94083)]).then(n.bind(n,91476)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/index.mdx",91476],"77afab95":[()=>n.e(46394).then(n.bind(n,4422)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.md",4422],78106965:[()=>n.e(7835).then(n.bind(n,82863)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.md",82863],"7845ab9e":[()=>Promise.all([n.e(40532),n.e(3473),n.e(95076)]).then(n.bind(n,33668)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/index.mdx",33668],"7896f7be":[()=>n.e(41202).then(n.bind(n,74072)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.md",74072],"78bdd589":[()=>n.e(76091).then(n.t.bind(n,49483,19)),"~docs/default/tag-docs-tags-app-88f.json",49483],"78d92bfa":[()=>n.e(53766).then(n.bind(n,60898)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.md",60898],"79f9d31c":[()=>n.e(91502).then(n.bind(n,60402)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.md",60402],"7a464885":[()=>n.e(4167).then(n.bind(n,53275)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.md",53275],"7a877d9a":[()=>n.e(81117).then(n.bind(n,22471)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.md",22471],"7ac739e8":[()=>n.e(21850).then(n.bind(n,28088)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.md",28088],"7b21172a":[()=>Promise.all([n.e(40532),n.e(3473),n.e(27536)]).then(n.bind(n,6840)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/index.mdx",6840],"7b4d6381":[()=>n.e(18494).then(n.bind(n,952)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/09-\u25b6\ufe0f-asynchroniczne-akcje.md",952],"7b667a7f":[()=>n.e(35649).then(n.t.bind(n,85274,19)),"~docs/default/tag-docs-tags-git-514.json",85274],"7bfa9b50":[()=>n.e(45198).then(n.bind(n,878)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.md",878],"7c03907c":[()=>n.e(42011).then(n.bind(n,93077)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.md",93077],"7c0e94c5":[()=>n.e(94003).then(n.bind(n,66838)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/10-\u25b6\ufe0f-redux-thunk.md",66838],"7c59c602":[()=>n.e(64239).then(n.bind(n,30354)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.md",30354],"7cfb0829":[()=>n.e(21218).then(n.bind(n,35010)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.md",35010],"7db916a2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(14642)]).then(n.bind(n,13086)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/index.mdx",13086],"7dbdef65":[()=>n.e(30364).then(n.bind(n,54182)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.md",54182],"7df43df9":[()=>n.e(583).then(n.t.bind(n,15745,19)),"/home/runner/work/codisity.pl/codisity.pl/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"7e1c5dce":[()=>n.e(85061).then(n.bind(n,6535)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.md",6535],"7e37ae38":[()=>n.e(77587).then(n.t.bind(n,91975,19)),"~docs/default/tag-docs-tags-apple-e9d.json",91975],"7e516c75":[()=>n.e(29922).then(n.t.bind(n,78573,19)),"~docs/default/tag-docs-tags-java-script-6c3.json",78573],"7f1f28b5":[()=>n.e(98777).then(n.bind(n,70967)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.md",70967],"7f676b5b":[()=>n.e(50896).then(n.bind(n,5279)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.md",5279],"7f8f93b5":[()=>n.e(82208).then(n.bind(n,69481)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.md",69481],"800ca0ac":[()=>n.e(75586).then(n.bind(n,99125)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.md",99125],"8011578d":[()=>n.e(61544).then(n.bind(n,63617)),"@site/docs/03-frontend/00-frontend.md",63617],"8021a7ed":[()=>n.e(60370).then(n.bind(n,52035)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.md",52035],"8042f440":[()=>n.e(80100).then(n.bind(n,69707)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.md",69707],"80dd8e85":[()=>Promise.all([n.e(40532),n.e(3473),n.e(41493)]).then(n.bind(n,38868)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/index.mdx",38868],"8183696c":[()=>Promise.all([n.e(40532),n.e(3473),n.e(40616)]).then(n.bind(n,37702)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/index.mdx",37702],"81e6c770":[()=>n.e(51228).then(n.bind(n,43548)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.md",43548],"82230cb9":[()=>n.e(80969).then(n.bind(n,67561)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.md",67561],"8263abbd":[()=>Promise.all([n.e(40532),n.e(3473),n.e(34411)]).then(n.bind(n,98311)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/index.mdx",98311],"8284ef15":[()=>n.e(64161).then(n.bind(n,74789)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.md",74789],"82f0b858":[()=>n.e(20786).then(n.bind(n,58027)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.md",58027],"8308c780":[()=>n.e(66508).then(n.bind(n,69998)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.md",69998],"833c1831":[()=>n.e(35515).then(n.bind(n,12182)),"@site/docs/01-informatyka/04-aplikacje.md",12182],"833ee563":[()=>n.e(37985).then(n.bind(n,23280)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.md",23280],"8346b090":[()=>Promise.all([n.e(40532),n.e(3473),n.e(13267)]).then(n.bind(n,18003)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/index.mdx",18003],"839ae7ca":[()=>n.e(71960).then(n.bind(n,64900)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.md",64900],"83af2250":[()=>n.e(72904).then(n.bind(n,1476)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.md",1476],"83c03d41":[()=>Promise.all([n.e(40532),n.e(3473),n.e(6692)]).then(n.bind(n,771)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/index.mdx",771],"83c85293":[()=>n.e(60557).then(n.bind(n,40298)),"@site/docs/01-informatyka/05-programowanie/03-typowanie-statyczne-i-dynamiczne.md",40298],"8476ee46":[()=>n.e(59113).then(n.bind(n,57988)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.md",57988],"8490af85":[()=>n.e(88319).then(n.bind(n,5309)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.md",5309],"84d56036":[()=>n.e(75532).then(n.bind(n,20965)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.md",20965],85009468:[()=>Promise.all([n.e(40532),n.e(3473),n.e(12594)]).then(n.bind(n,16106)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/index.mdx",16106],"861289f9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(44473)]).then(n.bind(n,66395)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/index.mdx",66395],"86676c71":[()=>n.e(75384).then(n.bind(n,39017)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-2-tresci-graficzne.md",39017],"8699b075":[()=>Promise.all([n.e(40532),n.e(3473),n.e(7898)]).then(n.bind(n,17628)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/index.mdx",17628],"86a46ae2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(42372)]).then(n.bind(n,11979)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/index.mdx",11979],"86cec129":[()=>n.e(42781).then(n.bind(n,18868)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.md",18868],"86e14a43":[()=>n.e(52865).then(n.bind(n,5550)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.md",5550],"86e2beea":[()=>n.e(37543).then(n.bind(n,49550)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/06-\u25b6\ufe0f-predefiniowane-typy-akcji-i-kreatory-akcji.md",49550],"87a50603":[()=>n.e(77723).then(n.t.bind(n,9602,19)),"~docs/default/tag-docs-tags-api-a37.json",9602],"884a095c":[()=>n.e(80867).then(n.bind(n,86708)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.md",86708],"884f9af5":[()=>n.e(88725).then(n.bind(n,32058)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.md",32058],"88bff478":[()=>n.e(95128).then(n.bind(n,70188)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.md",70188],"88db79f1":[()=>n.e(19612).then(n.bind(n,76968)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.md",76968],"88f40300":[()=>n.e(1124).then(n.t.bind(n,49970,19)),"~docs/default/tag-docs-tags-html-22d.json",49970],"88fd2dc3":[()=>n.e(81121).then(n.bind(n,47916)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.md",47916],"892e0442":[()=>n.e(47965).then(n.bind(n,71014)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.md",71014],"89507eba":[()=>n.e(62502).then(n.bind(n,28680)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.md",28680],"896a5d99":[()=>Promise.all([n.e(40532),n.e(3473),n.e(60069)]).then(n.bind(n,52673)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/index.mdx",52673],89721372:[()=>n.e(80870).then(n.t.bind(n,27410,19)),"~docs/default/tag-docs-tags-mobile-87f.json",27410],"8a12ef4f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(58658)]).then(n.bind(n,14773)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/index.mdx",14773],"8a20b002":[()=>n.e(65421).then(n.bind(n,41888)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.md",41888],"8aae1625":[()=>n.e(17050).then(n.bind(n,32318)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.md",32318],"8b4b867e":[()=>Promise.all([n.e(40532),n.e(3473),n.e(44894)]).then(n.bind(n,65482)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/index.mdx",65482],"8b6b92b4":[()=>n.e(55147).then(n.bind(n,88631)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.md",88631],"8bab4b8f":[()=>n.e(64999).then(n.bind(n,71159)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.md",71159],"8bbfc048":[()=>n.e(5405).then(n.bind(n,74364)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.md",74364],"8c0d6f34":[()=>n.e(96829).then(n.bind(n,27805)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.md",27805],"8c0e9a04":[()=>n.e(27914).then(n.t.bind(n,97794,19)),"~docs/default/tag-docs-tags-ssd-a98.json",97794],"8c15db71":[()=>n.e(61056).then(n.bind(n,24445)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.md",24445],"8cebce07":[()=>Promise.all([n.e(40532),n.e(3473),n.e(49702)]).then(n.bind(n,35611)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/index.mdx",35611],"8ceff3df":[()=>n.e(18883).then(n.bind(n,67122)),"@site/docs/03-frontend/01-html/03-\u25b6\ufe0f-tekst.md",67122],"8d3ec686":[()=>n.e(21364).then(n.bind(n,55922)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.md",55922],"8d63b9c8":[()=>n.e(29670).then(n.bind(n,63026)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.md",63026],"8d790c4a":[()=>n.e(49071).then(n.bind(n,69985)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.md",69985],"8de46d05":[()=>n.e(46422).then(n.bind(n,25669)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.md",25669],"8deea890":[()=>n.e(63680).then(n.t.bind(n,69409,19)),"~docs/default/tag-docs-tags-web-components-ea2.json",69409],"8e5789a1":[()=>n.e(66791).then(n.bind(n,80248)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/00-redux.md",80248],"8e7dd0aa":[()=>n.e(78126).then(n.bind(n,83632)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.md",83632],"8f3da505":[()=>n.e(68526).then(n.bind(n,74233)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.md",74233],"8f5b0fd5":[()=>n.e(51374).then(n.bind(n,27986)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.md",27986],"8f6cb3fb":[()=>Promise.all([n.e(40532),n.e(3473),n.e(52237)]).then(n.bind(n,11606)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/index.mdx",11606],"8fbac301":[()=>n.e(23034).then(n.bind(n,1031)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-1-identyfikacja-marki.md",1031],"9045d99b":[()=>n.e(60198).then(n.bind(n,51025)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.md",51025],"90ab0c65":[()=>n.e(71585).then(n.bind(n,35667)),"@site/docs/01-informatyka/05-programowanie/11-biblioteki.md",35667],"910c4c34":[()=>n.e(62736).then(n.bind(n,40861)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.md",40861],"912a0ee3":[()=>n.e(99387).then(n.bind(n,81106)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.md",81106],"917ba351":[()=>n.e(41283).then(n.bind(n,5838)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.md",5838],"91f13cf4":[()=>n.e(76097).then(n.bind(n,2931)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.md",2931],"923b862e":[()=>n.e(71735).then(n.bind(n,11494)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.md",11494],"935f2afb":[()=>n.e(80053).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93e41b29":[()=>n.e(91411).then(n.bind(n,16926)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.md",16926],"93ea23c6":[()=>n.e(62141).then(n.bind(n,55926)),"@site/docs/03-frontend/10-webassembly.md",55926],"941a0403":[()=>n.e(45276).then(n.t.bind(n,4060,19)),"~docs/default/tag-docs-tags-bundle-925.json",4060],"942c5c91":[()=>n.e(11362).then(n.bind(n,46363)),"@site/docs/03-frontend/01-html/01-\u25b6\ufe0f-wprowadzenie-do-htmla.md",46363],"9551079d":[()=>n.e(64680).then(n.bind(n,3893)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.md",3893],"956c2f24":[()=>n.e(89993).then(n.bind(n,32226)),"@site/docs/01-informatyka/05-programowanie/07-programowanie-funkcyjne.md",32226],"957af57a":[()=>n.e(21320).then(n.bind(n,27542)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.md",27542],"957d840c":[()=>Promise.all([n.e(40532),n.e(3473),n.e(51029)]).then(n.bind(n,38067)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/index.mdx",38067],"95b7f57f":[()=>n.e(93693).then(n.bind(n,46550)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.md",46550],"95f84dda":[()=>n.e(81078).then(n.bind(n,70014)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.md",70014],"967d3173":[()=>n.e(24242).then(n.bind(n,28520)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.md",28520],"96b173c7":[()=>n.e(95610).then(n.bind(n,42227)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.md",42227],"96c4889e":[()=>n.e(57880).then(n.bind(n,59476)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.md",59476],"970793ad":[()=>n.e(99302).then(n.bind(n,10144)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.md",10144],"97aa5688":[()=>n.e(71887).then(n.bind(n,2458)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.md",2458],"97d74462":[()=>n.e(24471).then(n.bind(n,62859)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.md",62859],"98f5acd1":[()=>n.e(91557).then(n.bind(n,61477)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.md",61477],"9922a044":[()=>Promise.all([n.e(40532),n.e(3473),n.e(50286)]).then(n.bind(n,43005)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/index.mdx",43005],99431438:[()=>n.e(62691).then(n.bind(n,67855)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.md",67855],"9a4f33c7":[()=>n.e(74591).then(n.bind(n,57508)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.md",57508],"9b127ca6":[()=>n.e(85404).then(n.bind(n,51127)),"@site/docs/03-frontend/02-css/02-\u25b6\ufe0f-organizacja-styli-css-i-preprocesory.md",51127],"9bee5ad8":[()=>n.e(31927).then(n.t.bind(n,91285,19)),"~docs/default/tag-docs-tags-ssh-a8b.json",91285],"9c1e0711":[()=>n.e(76222).then(n.bind(n,43894)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.md",43894],"9cce491e":[()=>n.e(61378).then(n.bind(n,58045)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.md",58045],"9cfa293c":[()=>n.e(65142).then(n.bind(n,2983)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.md",2983],"9d0e2c8d":[()=>n.e(58197).then(n.bind(n,61014)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.md",61014],"9d94b6e3":[()=>n.e(157).then(n.bind(n,87047)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.md",87047],"9df91c1b":[()=>n.e(32996).then(n.bind(n,87322)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.md",87322],"9e4ad429":[()=>n.e(55406).then(n.t.bind(n,16060,19)),"~docs/default/tag-docs-tags-performance-339.json",16060],"9e978b7a":[()=>n.e(13651).then(n.bind(n,7907)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.md",7907],"9ea02cba":[()=>Promise.all([n.e(40532),n.e(3473),n.e(92441)]).then(n.bind(n,50700)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/index.mdx",50700],"9ecc835d":[()=>n.e(21623).then(n.bind(n,23578)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.md",23578],"9ed914e7":[()=>n.e(41900).then(n.bind(n,36022)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.md",36022],"9f10ee4f":[()=>n.e(6205).then(n.bind(n,44204)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.md",44204],"9f1a3f2d":[()=>n.e(3139).then(n.bind(n,85760)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.md",85760],"9f37913d":[()=>n.e(74314).then(n.bind(n,9314)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.md",9314],"9fe94d36":[()=>n.e(11764).then(n.bind(n,58673)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.md",58673],"9ff5d104":[()=>n.e(57221).then(n.t.bind(n,68057,19)),"~docs/default/tag-docs-tags-security-eea.json",68057],a04ecd15:[()=>n.e(3721).then(n.bind(n,89868)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.md",89868],a0d9dc55:[()=>n.e(16940).then(n.bind(n,60174)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.md",60174],a11c5b80:[()=>n.e(59949).then(n.bind(n,97079)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.md",97079],a1bb398e:[()=>n.e(84843).then(n.t.bind(n,29032,19)),"~docs/default/tag-docs-tags-cloud-29f.json",29032],a1c5878a:[()=>n.e(46991).then(n.bind(n,27958)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.md",27958],a2ae1405:[()=>n.e(48762).then(n.bind(n,48045)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.md",48045],a307b126:[()=>n.e(57575).then(n.bind(n,49162)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.md",49162],a3689074:[()=>n.e(24075).then(n.bind(n,54748)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.md",54748],a4dc21c3:[()=>n.e(68987).then(n.bind(n,21145)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.md",21145],a4dfa1d7:[()=>n.e(59999).then(n.t.bind(n,59751,19)),"~docs/default/tag-docs-tags-js-f26.json",59751],a5352ad5:[()=>n.e(79445).then(n.bind(n,78641)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.md",78641],a53608ef:[()=>n.e(33177).then(n.bind(n,27870)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.md",27870],a5bcb468:[()=>n.e(50944).then(n.bind(n,64257)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.md",64257],a627361b:[()=>n.e(68499).then(n.bind(n,54475)),"@site/docs/01-informatyka/05-programowanie/01-api.md",54475],a766a857:[()=>n.e(21342).then(n.t.bind(n,76018,19)),"~docs/default/tag-docs-tags-windows-4a4.json",76018],a8fc05df:[()=>n.e(41232).then(n.bind(n,98739)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.md",98739],a945daee:[()=>Promise.all([n.e(40532),n.e(3473),n.e(28584)]).then(n.bind(n,86332)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/index.mdx",86332],a9672d4f:[()=>n.e(96846).then(n.bind(n,12589)),"@site/docs/03-frontend/07-pakiety/01-webpack/02-\u25b6\ufe0f-plik-konfiguracyjny.md",12589],a96b0693:[()=>n.e(61267).then(n.bind(n,25112)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.md",25112],a97c0255:[()=>n.e(96544).then(n.bind(n,96202)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.md",96202],a9863ec3:[()=>n.e(33291).then(n.bind(n,40199)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.md",40199],a989a199:[()=>n.e(85397).then(n.bind(n,69874)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.md",69874],a99ff4f5:[()=>n.e(27080).then(n.bind(n,1402)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.md",1402],a9e2a5f5:[()=>n.e(33577).then(n.bind(n,12242)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.md",12242],aa23cbb1:[()=>n.e(36662).then(n.bind(n,83068)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.md",83068],aa638fa0:[()=>n.e(54852).then(n.bind(n,79322)),"@site/docs/03-frontend/03-javascript/02-\u25b6\ufe0f-node-js-na-frontendzie.md",79322],aa66f5f8:[()=>n.e(75617).then(n.bind(n,98108)),"@site/docs/01-informatyka/17-bezpieczenstwo.md",98108],aaefe1e6:[()=>n.e(94176).then(n.bind(n,31145)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-1-dostosowanie-typografii-i-kolorow.md",31145],ab068eac:[()=>n.e(29544).then(n.bind(n,2537)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.md",2537],ab72c14f:[()=>n.e(30516).then(n.bind(n,19634)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.md",19634],ab98e4e2:[()=>n.e(83245).then(n.bind(n,88923)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.md",88923],ac0ce67e:[()=>n.e(60921).then(n.bind(n,92201)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.md",92201],acebbe6f:[()=>n.e(21646).then(n.bind(n,7966)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.md",7966],ad6306e2:[()=>n.e(88782).then(n.bind(n,61402)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-2-zapoznanie-z-interfejsem.md",61402],ada3cb0c:[()=>n.e(25456).then(n.bind(n,53448)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.md",53448],adffcafd:[()=>n.e(40463).then(n.t.bind(n,92180,19)),"~docs/default/tag-docs-tags-bsd-628.json",92180],aef2cd7d:[()=>n.e(99059).then(n.bind(n,68621)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.md",68621],afe2f6b5:[()=>n.e(97219).then(n.bind(n,30121)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.md",30121],b0973ba4:[()=>n.e(45989).then(n.bind(n,11102)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.md",11102],b12b33e9:[()=>Promise.all([n.e(40532),n.e(3473),n.e(68345)]).then(n.bind(n,87387)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/index.mdx",87387],b1698e34:[()=>n.e(89675).then(n.bind(n,54073)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.md",54073],b1ba4cc6:[()=>n.e(25505).then(n.bind(n,94642)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.md",94642],b218f480:[()=>n.e(56755).then(n.bind(n,42654)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.md",42654],b2383198:[()=>n.e(65310).then(n.bind(n,97799)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.md",97799],b2383bc8:[()=>Promise.all([n.e(40532),n.e(3473),n.e(72803)]).then(n.bind(n,12721)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/index.mdx",12721],b2cc28ad:[()=>n.e(8554).then(n.bind(n,93564)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.md",93564],b2ea0aa3:[()=>n.e(82366).then(n.bind(n,36535)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.md",36535],b2fdfbb7:[()=>n.e(55346).then(n.bind(n,81864)),"@site/docs/03-frontend/01-html/02-\u25b6\ufe0f-rdzen-metadane-sekcje.md",81864],b31218dc:[()=>n.e(62280).then(n.bind(n,32367)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.md",32367],b3b46ceb:[()=>n.e(78415).then(n.t.bind(n,3326,19)),"~docs/default/tag-docs-tags-i-o-3f8.json",3326],b471f1aa:[()=>n.e(85326).then(n.bind(n,6754)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.md",6754],b4839aa5:[()=>n.e(46650).then(n.bind(n,74015)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.md",74015],b49b0f90:[()=>n.e(72087).then(n.bind(n,73244)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.md",73244],b49f76fb:[()=>n.e(10824).then(n.bind(n,44091)),"@site/docs/03-frontend/01-html/04-\u25b6\ufe0f-obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji.md",44091],b4a5aef4:[()=>n.e(20018).then(n.bind(n,11186)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-3-scenariusze-uzytkownika.md",11186],b4ca7cd2:[()=>n.e(47128).then(n.bind(n,88802)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.md",88802],b5f07768:[()=>n.e(82969).then(n.bind(n,95586)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.md",95586],b6052b98:[()=>n.e(77518).then(n.bind(n,99565)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.md",99565],b651fca4:[()=>n.e(31289).then(n.bind(n,87995)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.md",87995],b67bb9f8:[()=>n.e(92534).then(n.bind(n,10035)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.md",10035],b766ccfd:[()=>n.e(56039).then(n.bind(n,2917)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.md",2917],b773aa83:[()=>n.e(75035).then(n.bind(n,84893)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.md",84893],b83483c6:[()=>n.e(95923).then(n.bind(n,88617)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.md",88617],b85753b3:[()=>n.e(60299).then(n.bind(n,1395)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.md",1395],b9c437a8:[()=>n.e(36248).then(n.bind(n,12212)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.md",12212],b9c8e7c7:[()=>n.e(4259).then(n.bind(n,72353)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.md",72353],ba33c47c:[()=>n.e(30061).then(n.bind(n,289)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.md",289],ba3d1627:[()=>n.e(83743).then(n.bind(n,79917)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.md",79917],ba412cf9:[()=>n.e(23716).then(n.bind(n,13115)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.md",13115],bac901eb:[()=>n.e(30634).then(n.bind(n,77598)),"@site/docs/03-frontend/11-aplikacje-mobilne.md",77598],bbb08c75:[()=>n.e(1977).then(n.bind(n,92760)),"@site/docs/01-informatyka/05-programowanie/04-programowanie-imperatywne.md",92760],bbc80a75:[()=>n.e(15734).then(n.bind(n,54458)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.md",54458],bc8dc425:[()=>n.e(7482).then(n.bind(n,46105)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.md",46105],bcd37ac2:[()=>n.e(62090).then(n.bind(n,19821)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.md",19821],bcd70e60:[()=>Promise.all([n.e(40532),n.e(3473),n.e(48587)]).then(n.bind(n,53737)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/index.mdx",53737],bcfe4bdc:[()=>Promise.all([n.e(40532),n.e(3473),n.e(96771)]).then(n.bind(n,12625)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/index.mdx",12625],bd5a1384:[()=>n.e(81301).then(n.bind(n,50679)),"@site/docs/03-frontend/07-pakiety/01-webpack/03-\u25b6\ufe0f-ladowarki.md",50679],bd786b82:[()=>Promise.all([n.e(40532),n.e(3473),n.e(79944)]).then(n.bind(n,35244)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/index.mdx",35244],bd840618:[()=>n.e(9753).then(n.bind(n,79701)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.md",79701],bdddc7f5:[()=>n.e(92974).then(n.bind(n,49709)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.md",49709],be1f00d7:[()=>n.e(17589).then(n.t.bind(n,68595,19)),"~docs/default/tag-docs-tags-sass-ef4.json",68595],be5bae9f:[()=>n.e(39979).then(n.bind(n,70719)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.md",70719],be6c48cf:[()=>n.e(7233).then(n.bind(n,92075)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.md",92075],be76e3a2:[()=>Promise.all([n.e(40532),n.e(3473),n.e(5616)]).then(n.bind(n,74906)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/index.mdx",74906],bee2906b:[()=>n.e(80161).then(n.bind(n,86569)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.md",86569],bf0bae1a:[()=>n.e(65769).then(n.bind(n,90595)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.md",90595],bf6af72d:[()=>n.e(37179).then(n.bind(n,61506)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.md",61506],bf6db502:[()=>n.e(18268).then(n.bind(n,15341)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.md",15341],c007ecfe:[()=>n.e(45391).then(n.bind(n,2399)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.md",2399],c0b7a52a:[()=>n.e(84971).then(n.bind(n,26875)),"@site/docs/03-frontend/02-css/00-css.md",26875],c10819ce:[()=>n.e(40583).then(n.bind(n,78483)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.md",78483],c11e4322:[()=>n.e(30544).then(n.bind(n,59238)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.md",59238],c188cb46:[()=>n.e(94117).then(n.bind(n,12338)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.md",12338],c1b33453:[()=>n.e(54665).then(n.t.bind(n,95848,19)),"~docs/default/tag-docs-tags-tcp-ip-1d7.json",95848],c229b3fd:[()=>n.e(41244).then(n.bind(n,73681)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.md",73681],c2b14adf:[()=>n.e(5796).then(n.bind(n,68825)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.md",68825],c2be12b7:[()=>n.e(38863).then(n.bind(n,80559)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.md",80559],c2e1a208:[()=>n.e(39474).then(n.t.bind(n,25259,19)),"~docs/default/tag-docs-tags-bug-25f.json",25259],c392861d:[()=>n.e(62562).then(n.bind(n,53543)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.md",53543],c3b45d2c:[()=>n.e(64402).then(n.bind(n,37138)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.md",37138],c3c2bd6c:[()=>n.e(81679).then(n.bind(n,20304)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.md",20304],c3df5564:[()=>n.e(28023).then(n.bind(n,4259)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.md",4259],c4186bc6:[()=>n.e(18835).then(n.bind(n,96151)),"@site/docs/01-informatyka/03-systemy-operacyjne/02-macos-i-ios.md",96151],c44bf7b1:[()=>n.e(62735).then(n.t.bind(n,50961,19)),"~docs/default/tag-docs-tags-sem-ver-fbc.json",50961],c4a79712:[()=>n.e(1690).then(n.bind(n,68247)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.md",68247],c4bc606e:[()=>n.e(69046).then(n.t.bind(n,27766,19)),"~docs/default/tag-docs-tags-ip-afc.json",27766],c5132abf:[()=>n.e(3826).then(n.bind(n,26388)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.md",26388],c56402d8:[()=>n.e(64401).then(n.bind(n,244)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.md",244],c673fddf:[()=>n.e(47115).then(n.bind(n,30849)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.md",30849],c6748bb6:[()=>n.e(75621).then(n.bind(n,49264)),"@site/docs/03-frontend/07-pakiety/01-webpack/06-\u25b6\ufe0f-deweloperski-serwer-webpack-i-gorace-przeladowania.md",49264],c675cfeb:[()=>Promise.all([n.e(40532),n.e(3473),n.e(68148)]).then(n.bind(n,35677)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/index.mdx",35677],c69e1516:[()=>n.e(58231).then(n.bind(n,37763)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/05-\u25b6\ufe0f-zarzadzanie-wieloma-stanami.md",37763],c7cb25dc:[()=>n.e(76938).then(n.bind(n,88628)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.md",88628],c7e62bb4:[()=>n.e(85830).then(n.bind(n,13668)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.md",13668],c9135948:[()=>n.e(1656).then(n.bind(n,96795)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.md",96795],c924a973:[()=>n.e(18657).then(n.bind(n,61804)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.md",61804],c95aa39f:[()=>n.e(22938).then(n.t.bind(n,8516,19)),"~docs/default/tag-docs-tags-mac-os-829.json",8516],c97ed21b:[()=>n.e(83911).then(n.bind(n,7846)),"@site/docs/03-frontend/01-html/06-\u25b6\ufe0f-zadanie-domowe.md",7846],c9c056cc:[()=>n.e(904).then(n.bind(n,19547)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.md",19547],c9c54e87:[()=>n.e(89914).then(n.bind(n,99576)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.md",99576],ca33b8f7:[()=>n.e(65276).then(n.t.bind(n,32712,19)),"~docs/default/tag-docs-tags-owasp-46d.json",32712],ca646102:[()=>n.e(26040).then(n.bind(n,50085)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.md",50085],ca6f906e:[()=>n.e(54818).then(n.bind(n,63974)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.md",63974],cacf64d3:[()=>n.e(30368).then(n.bind(n,96080)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.md",96080],cb12a0f1:[()=>n.e(34123).then(n.bind(n,44491)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.md",44491],cb225afc:[()=>n.e(35177).then(n.bind(n,3980)),"@site/docs/01-informatyka/00-informatyka.md",3980],cb2433f7:[()=>Promise.all([n.e(40532),n.e(3473),n.e(7015)]).then(n.bind(n,9311)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/index.mdx",9311],cb50e0fd:[()=>n.e(31106).then(n.bind(n,78105)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.md",78105],cbfa5c34:[()=>Promise.all([n.e(40532),n.e(3473),n.e(61126)]).then(n.bind(n,66599)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/index.mdx",66599],cca278b9:[()=>n.e(38257).then(n.bind(n,16585)),"@site/docs/03-frontend/04-dostepnosc.md",16585],ccbe7ce7:[()=>n.e(18567).then(n.bind(n,43426)),"@site/docs/01-informatyka/11-hosting.md",43426],ccc4640b:[()=>n.e(11146).then(n.bind(n,75099)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.md",75099],cd327e74:[()=>Promise.all([n.e(40532),n.e(3473),n.e(27620)]).then(n.bind(n,93021)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/index.mdx",93021],cd35f088:[()=>n.e(97637).then(n.bind(n,41807)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.md",41807],cd3ad747:[()=>n.e(4423).then(n.bind(n,43070)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.md",43070],cd894699:[()=>Promise.all([n.e(40532),n.e(3473),n.e(56883)]).then(n.bind(n,85948)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/index.mdx",85948],cfb509c7:[()=>n.e(66822).then(n.bind(n,62478)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.md",62478],cfdefec2:[()=>n.e(60950).then(n.bind(n,59479)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.md",59479],d02ab91e:[()=>n.e(49044).then(n.bind(n,49806)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.md",49806],d03034fb:[()=>n.e(76835).then(n.bind(n,13637)),"@site/docs/03-frontend/03-javascript/00-javascript.md",13637],d09ce8bf:[()=>n.e(53092).then(n.bind(n,87610)),"@site/docs/03-frontend/07-pakiety/01-webpack/04-\u25b6\ufe0f-generowanie-pliku-html-z-szablonu.md",87610],d0a7ea9b:[()=>n.e(60477).then(n.t.bind(n,87852,19)),"~docs/default/tag-docs-tags-agile-eb3.json",87852],d10de94a:[()=>n.e(45809).then(n.t.bind(n,25708,19)),"~docs/default/tag-docs-tags-readme-562.json",25708],d11837e3:[()=>n.e(18673).then(n.bind(n,43861)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.md",43861],d1628d6d:[()=>n.e(3292).then(n.bind(n,74395)),"@site/docs/01-informatyka/07-haszowanie.md",74395],d16bfa8b:[()=>n.e(48238).then(n.bind(n,56669)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.md",56669],d1c3e56f:[()=>Promise.all([n.e(40532),n.e(3473),n.e(13043)]).then(n.bind(n,86345)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/index.mdx",86345],d292be02:[()=>n.e(49936).then(n.bind(n,78438)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.md",78438],d2aec923:[()=>Promise.all([n.e(40532),n.e(3473),n.e(95875)]).then(n.bind(n,62325)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/index.mdx",62325],d2e2c39f:[()=>n.e(16860).then(n.bind(n,96179)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.md",96179],d3844963:[()=>n.e(29413).then(n.bind(n,29639)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.md",29639],d389b14e:[()=>n.e(48619).then(n.bind(n,23453)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.md",23453],d41aadf9:[()=>n.e(11755).then(n.bind(n,73345)),"@site/docs/01-informatyka/05-programowanie/08-algorytmy.md",73345],d49f4d31:[()=>n.e(78959).then(n.bind(n,30090)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.md",30090],d5f6f989:[()=>n.e(25396).then(n.t.bind(n,85990,19)),"~docs/default/tag-docs-tags-cpu-ebf.json",85990],d6bdfd6e:[()=>n.e(71747).then(n.bind(n,95776)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.md",95776],d6d9252c:[()=>n.e(59350).then(n.bind(n,7800)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.md",7800],d703025b:[()=>n.e(3322).then(n.bind(n,10589)),"@site/docs/01-informatyka/05-programowanie/12-frameworki.md",10589],d7b3e9d0:[()=>n.e(72933).then(n.t.bind(n,34712,19)),"~docs/default/tag-docs-tags-webpack-e6e.json",34712],d7e78ce2:[()=>n.e(43376).then(n.bind(n,62809)),"@site/docs/01-informatyka/09-siec.md",62809],d84f392e:[()=>Promise.all([n.e(40532),n.e(3473),n.e(87228)]).then(n.bind(n,21540)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/index.mdx",21540],d8754a83:[()=>n.e(62368).then(n.bind(n,49502)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.md",49502],d8756ba1:[()=>n.e(32353).then(n.bind(n,46409)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.md",46409],d8ed4f82:[()=>n.e(45352).then(n.bind(n,35311)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.md",35311],d9f2d1c4:[()=>n.e(70194).then(n.bind(n,44866)),"@site/docs/01-informatyka/05-programowanie/09-struktury-i-bazy-danych.md",44866],da1123e7:[()=>n.e(928).then(n.t.bind(n,27602,19)),"~docs/default/tag-docs-tags-oop-f28.json",27602],da3c7939:[()=>n.e(57922).then(n.bind(n,67072)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.md",67072],da9f8516:[()=>n.e(90243).then(n.bind(n,11548)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.md",11548],dabc814c:[()=>n.e(66403).then(n.bind(n,67970)),"@site/docs/01-informatyka/05-programowanie/02-jezyki-programowania.md",67970],db1cecfd:[()=>Promise.all([n.e(40532),n.e(3473),n.e(22214)]).then(n.bind(n,33191)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/index.mdx",33191],db523f3d:[()=>n.e(55534).then(n.bind(n,18268)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.md",18268],db88d36c:[()=>n.e(89895).then(n.bind(n,54605)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.md",54605],db9f9bb2:[()=>n.e(93343).then(n.bind(n,80080)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.md",80080],dbd503d3:[()=>n.e(85372).then(n.bind(n,59055)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.md",59055],ddc43b58:[()=>Promise.all([n.e(40532),n.e(3473),n.e(27984)]).then(n.bind(n,39983)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/index.mdx",39983],dddd2027:[()=>n.e(71257).then(n.bind(n,20733)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.md",20733],ddff506f:[()=>n.e(10899).then(n.bind(n,94029)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.md",94029],de0ea644:[()=>n.e(86700).then(n.bind(n,62430)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.md",62430],de75a204:[()=>n.e(10195).then(n.bind(n,89568)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.md",89568],ded9aecb:[()=>n.e(15967).then(n.bind(n,27789)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.md",27789],deff19d0:[()=>n.e(69816).then(n.bind(n,25392)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.md",25392],df203c0f:[()=>n.e(99924).then(n.bind(n,97068)),"@theme/DocTagDocListPage",97068],df4d1eca:[()=>n.e(93049).then(n.bind(n,49841)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.md",49841],dfad4e5b:[()=>n.e(67211).then(n.bind(n,61301)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.md",61301],dfd77bc1:[()=>n.e(92559).then(n.bind(n,89565)),"@site/docs/03-frontend/02-css/03-\u25b6\ufe0f-debugowanie-css-przez-narzedzia-developerskie.md",89565],e082f5ea:[()=>n.e(55411).then(n.bind(n,9155)),"@site/src/pages/100-bugow-js/sukces.mdx",9155],e0c1c0cc:[()=>n.e(62946).then(n.bind(n,52545)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.md",52545],e13c7883:[()=>Promise.all([n.e(40532),n.e(3473),n.e(43692)]).then(n.bind(n,19764)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/index.mdx",19764],e191101b:[()=>n.e(2705).then(n.bind(n,48995)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.md",48995],e2041b9b:[()=>n.e(9309).then(n.t.bind(n,17516,19)),"~docs/default/tag-docs-tags-redux-49b.json",17516],e216f4da:[()=>n.e(19496).then(n.bind(n,99423)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.md",99423],e27fbbe8:[()=>Promise.all([n.e(40532),n.e(3473),n.e(93985)]).then(n.bind(n,32505)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/index.mdx",32505],e280dc7f:[()=>n.e(75439).then(n.bind(n,59049)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/08-\u25b6\ufe0f-podzial-kodu-na-mniejsze-pliki.md",59049],e2a348e1:[()=>n.e(64911).then(n.bind(n,66386)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.md",66386],e2f82b8d:[()=>n.e(38718).then(n.bind(n,58950)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.md",58950],e3205e86:[()=>n.e(84313).then(n.bind(n,29014)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.md",29014],e3921745:[()=>n.e(92922).then(n.bind(n,78963)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.md",78963],e3c52b73:[()=>Promise.all([n.e(40532),n.e(3473),n.e(27879)]).then(n.bind(n,32762)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/index.mdx",32762],e41cc976:[()=>n.e(96293).then(n.bind(n,18238)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.md",18238],e41cf7ed:[()=>Promise.all([n.e(40532),n.e(3473),n.e(14041)]).then(n.bind(n,7747)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/index.mdx",7747],e432597c:[()=>n.e(80389).then(n.bind(n,70859)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.md",70859],e43f3435:[()=>Promise.all([n.e(40532),n.e(3473),n.e(86111)]).then(n.bind(n,51128)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/index.mdx",51128],e47104bd:[()=>Promise.all([n.e(40532),n.e(3473),n.e(13721)]).then(n.bind(n,33574)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/index.mdx",33574],e4e245d7:[()=>n.e(53302).then(n.bind(n,62685)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.md",62685],e4e385e6:[()=>n.e(20827).then(n.bind(n,17120)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.md",17120],e50fb3d1:[()=>Promise.all([n.e(40532),n.e(3473),n.e(53470)]).then(n.bind(n,49077)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/index.mdx",49077],e528424c:[()=>Promise.all([n.e(40532),n.e(3473),n.e(93583)]).then(n.bind(n,84598)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/index.mdx",84598],e537f109:[()=>n.e(12415).then(n.bind(n,51618)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-2-persona-uzytkownika.md",51618],e5501d88:[()=>n.e(20005).then(n.bind(n,76800)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.md",76800],e6036066:[()=>n.e(1983).then(n.bind(n,9677)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.md",9677],e62e4577:[()=>n.e(31489).then(n.bind(n,4211)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.md",4211],e69a7bb5:[()=>n.e(37358).then(n.bind(n,87339)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-4-prototyp.md",87339],e6bf88fd:[()=>n.e(17899).then(n.bind(n,61481)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.md",61481],e6cad7e4:[()=>n.e(36682).then(n.bind(n,55047)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.md",55047],e6f3dde7:[()=>n.e(25708).then(n.bind(n,15114)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.md",15114],e7edc101:[()=>n.e(33902).then(n.bind(n,80747)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.md",80747],e8103863:[()=>n.e(91934).then(n.bind(n,85784)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-1-tresci-tekstowe.md",85784],e854041a:[()=>Promise.all([n.e(40532),n.e(3473),n.e(6551)]).then(n.bind(n,51410)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/index.mdx",51410],e85f022e:[()=>n.e(93636).then(n.bind(n,4891)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.md",4891],e88156d1:[()=>Promise.all([n.e(40532),n.e(3473),n.e(10214)]).then(n.bind(n,84535)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/index.mdx",84535],e8aff1e0:[()=>Promise.all([n.e(40532),n.e(3473),n.e(13688)]).then(n.bind(n,70942)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/index.mdx",70942],e91a71ff:[()=>n.e(3269).then(n.bind(n,91827)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.md",91827],e96aa823:[()=>n.e(6071).then(n.bind(n,14431)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.md",14431],e9ab7552:[()=>n.e(83926).then(n.bind(n,21886)),"@site/docs/03-frontend/08-zarzadzanie-stanem/01-redux/07-\u25b6\ufe0f-laczenie-reduktorow.md",21886],e9b98b51:[()=>n.e(88342).then(n.bind(n,90399)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.md",90399],e9feae33:[()=>n.e(76058).then(n.t.bind(n,95844,19)),"~docs/default/tag-docs-tags-free-bsd-2c2.json",95844],ea826d89:[()=>n.e(20507).then(n.bind(n,89465)),"@site/docs/03-frontend/01-html/00-html.md",89465],eabad0ae:[()=>n.e(95359).then(n.bind(n,64296)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.md",64296],eb5542d6:[()=>n.e(66059).then(n.t.bind(n,65277,19)),"~docs/default/tag-docs-tags-kernel-ee2.json",65277],eb64c09b:[()=>n.e(56027).then(n.bind(n,82425)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.md",82425],eb9ffec0:[()=>n.e(78729).then(n.bind(n,55880)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.md",55880],ebbabef2:[()=>n.e(84395).then(n.bind(n,38380)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.md",38380],ebe70892:[()=>Promise.all([n.e(40532),n.e(3473),n.e(53526)]).then(n.bind(n,59218)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/index.mdx",59218],ec273f0b:[()=>n.e(53850).then(n.t.bind(n,52298,19)),"~docs/default/tag-docs-tags-library-77d.json",52298],ec6fef3a:[()=>Promise.all([n.e(40532),n.e(3473),n.e(10653)]).then(n.bind(n,10319)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/index.mdx",10319],ecc75780:[()=>n.e(79116).then(n.bind(n,90834)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.md",90834],ecd97ea8:[()=>n.e(24042).then(n.bind(n,12314)),"@site/docs/01-informatyka/18-formatowanie-kodu.md",12314],ed2f06be:[()=>n.e(55377).then(n.bind(n,61459)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.md",61459],edf2427f:[()=>n.e(44890).then(n.bind(n,92164)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.md",92164],eed8bbe9:[()=>n.e(24706).then(n.t.bind(n,88843,19)),"~docs/default/tag-docs-tags-http-daa.json",88843],ef00f9dc:[()=>n.e(60727).then(n.bind(n,91282)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.md",91282],efd3f90a:[()=>n.e(3702).then(n.bind(n,92660)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-2-projektowanie-szkieletu.md",92660],f042ee20:[()=>n.e(30259).then(n.bind(n,49884)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.md",49884],f05655d5:[()=>n.e(30118).then(n.bind(n,7006)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.md",7006],f0682135:[()=>n.e(33269).then(n.bind(n,44245)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.md",44245],f0f3b84a:[()=>n.e(50080).then(n.bind(n,6262)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.md",6262],f113a9ad:[()=>n.e(49319).then(n.bind(n,19006)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.md",19006],f1326702:[()=>n.e(53134).then(n.bind(n,1798)),"@site/docs/01-informatyka/01-dzialanie-komputerow.md",1798],f1c23ce2:[()=>n.e(1718).then(n.bind(n,54137)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.md",54137],f21972b9:[()=>n.e(9478).then(n.bind(n,64736)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.md",64736],f34ed74d:[()=>n.e(38161).then(n.bind(n,93094)),"@site/docs/01-informatyka/14-wydajnosc.md",93094],f35a7ead:[()=>n.e(72266).then(n.bind(n,75228)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.md",75228],f36e7a87:[()=>n.e(94725).then(n.bind(n,22421)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.md",22421],f3e49a96:[()=>n.e(21107).then(n.t.bind(n,82814,19)),"~docs/default/tag-docs-tags-google-fc6.json",82814],f430487a:[()=>n.e(20284).then(n.bind(n,73813)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.md",73813],f44c625b:[()=>n.e(14615).then(n.bind(n,11881)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.md",11881],f4530064:[()=>n.e(71584).then(n.bind(n,51483)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.md",51483],f457aeaf:[()=>n.e(66434).then(n.bind(n,80505)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.md",80505],f4689a72:[()=>n.e(16017).then(n.bind(n,50219)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.md",50219],f4fbc6cf:[()=>n.e(16508).then(n.bind(n,82427)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.md",82427],f52b3e0c:[()=>Promise.all([n.e(40532),n.e(3473),n.e(15735)]).then(n.bind(n,14958)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/index.mdx",14958],f56d2877:[()=>n.e(98269).then(n.bind(n,24030)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.md",24030],f5a689dc:[()=>n.e(86368).then(n.bind(n,98626)),"@site/docs/03-frontend/03-javascript/01-\u25b6\ufe0f-podstawy-javascript.md",98626],f5a94113:[()=>n.e(71723).then(n.bind(n,62752)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.md",62752],f612c143:[()=>n.e(5151).then(n.bind(n,79644)),"@site/docs/02-ux-ui/01-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-4-dostosowanie-ilustracji.md",79644],f693c536:[()=>n.e(76484).then(n.bind(n,44042)),"@site/docs/01-informatyka/13-licencje.md",44042],f70aa095:[()=>n.e(79350).then(n.bind(n,11474)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.md",11474],f765dd99:[()=>n.e(94799).then(n.bind(n,87030)),"@site/docs/03-frontend/08-zarzadzanie-stanem/00-zarzadzanie-stanem.md",87030],f782e33b:[()=>n.e(63685).then(n.bind(n,39264)),"@site/docs/01-informatyka/08-pamiec-podreczna.md",39264],f7bae6de:[()=>n.e(5971).then(n.bind(n,57549)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.md",57549],f8f47053:[()=>n.e(80812).then(n.bind(n,38223)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.md",38223],f92ef410:[()=>Promise.all([n.e(40532),n.e(3473),n.e(28049)]).then(n.bind(n,93635)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/index.mdx",93635],f9386273:[()=>n.e(69207).then(n.bind(n,27547)),"@site/docs/03-frontend/07-pakiety/01-webpack/05-\u25b6\ufe0f-tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian.md",27547],f94c1a71:[()=>n.e(35987).then(n.bind(n,34897)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.md",34897],f953a126:[()=>n.e(73736).then(n.bind(n,69277)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.md",69277],f989d062:[()=>n.e(4982).then(n.bind(n,86181)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.md",86181],f9ce6cc8:[()=>n.e(76472).then(n.bind(n,17833)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.md",17833],fa28ad03:[()=>n.e(48897).then(n.bind(n,25370)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.md",25370],fa4fac62:[()=>n.e(42381).then(n.bind(n,32162)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.md",32162],fa792f1c:[()=>n.e(15725).then(n.bind(n,45399)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.md",45399],fa91eed9:[()=>n.e(72906).then(n.t.bind(n,20563,19)),"~docs/default/tag-docs-tags-internet-542.json",20563],fa9af718:[()=>n.e(74105).then(n.bind(n,41437)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.md",41437],faa4534d:[()=>n.e(65665).then(n.bind(n,47590)),"@site/docs/03-frontend/06-komponenty.md",47590],fb2cd42c:[()=>n.e(16503).then(n.bind(n,10762)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.md",10762],fb797052:[()=>Promise.all([n.e(40532),n.e(3473),n.e(31185)]).then(n.bind(n,33577)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/index.mdx",33577],fc059f5d:[()=>n.e(98577).then(n.bind(n,47490)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.md",47490],fc262a50:[()=>n.e(18430).then(n.bind(n,53528)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.md",53528],fc6430c0:[()=>n.e(32771).then(n.bind(n,49727)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.md",49727],fc8b93a6:[()=>n.e(8747).then(n.bind(n,38259)),"@site/docs/01-informatyka/05-programowanie/10-wzorce-projektowe.md",38259],fcb295ad:[()=>n.e(17642).then(n.t.bind(n,22118,19)),"~docs/default/tag-docs-tags-vcs-af7.json",22118],fd08e427:[()=>n.e(69020).then(n.bind(n,70382)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.md",70382],fd1f9f5e:[()=>n.e(32945).then(n.bind(n,74630)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.md",74630],fde3afc6:[()=>n.e(20156).then(n.bind(n,7498)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.md",7498],feacc639:[()=>n.e(43120).then(n.bind(n,32876)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.md",32876],feb62326:[()=>n.e(54613).then(n.bind(n,6566)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.md",6566],fee0f439:[()=>n.e(94741).then(n.bind(n,76764)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.md",76764],ff02220a:[()=>Promise.all([n.e(40532),n.e(3473),n.e(42640)]).then(n.bind(n,72997)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/index.mdx",72997]};function d(e){let{error:t,retry:n,pastDelay:a}=e;return t?o.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},o.createElement("p",null,String(t)),o.createElement("div",null,o.createElement("button",{type:"button",onClick:n},"Retry"))):a?o.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},o.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},o.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},o.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},o.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),o.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),o.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),o.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},o.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),o.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),o.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),o.createElement("circle",{cx:"22",cy:"22",r:"8"},o.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(99670),b=n(30226);function l(e,t){if("*"===e)return i()({loading:d,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return o.createElement(b.z,{value:{plugin:{name:"native",id:"default"}}},o.createElement(n,t))}});const c=s[`${e}-${t}`],l={},f=[],p=[],g=(0,u.Z)(c);return Object.entries(g).forEach((e=>{let[t,n]=e;const o=r[n];o&&(l[t]=o[0],f.push(o[1]),p.push(o[2]))})),i().Map({loading:d,loader:l,modules:f,webpack:()=>p,render(t,n){const i=JSON.parse(JSON.stringify(c));Object.entries(t).forEach((t=>{let[n,o]=t;const a=o.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(o).filter((e=>"default"!==e)).forEach((e=>{a[e]=o[e]}));let c=i;const s=n.split(".");s.slice(0,-1).forEach((e=>{c=c[e]})),c[s[s.length-1]]=a}));const s=i.__comp;delete i.__comp;const r=i.__context;return delete i.__context,o.createElement(b.z,{value:r},o.createElement(s,(0,a.Z)({},i,n)))}})}const f=[{path:"/100-bugow-js",component:l("/100-bugow-js","f7f"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6","537"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode","73f"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription","253"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links","fc2"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode","efd"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription","f49"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732","4b5"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode","54c"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription","b3d"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links","cb3"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode","b90"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription","d46"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b","871"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode","b9c"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription","152"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links","812"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode","338"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription","011"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e","009"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode","ea4"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription","ba2"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links","36a"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode","7a9"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription","51d"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a","63f"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode","941"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription","e58"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links","853"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode","61c"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription","609"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03","d88"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode","bb4"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription","3be"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links","288"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode","9a4"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription","565"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885","a03"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode","48d"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription","e26"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links","bc3"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode","78e"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription","f6d"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211","149"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode","946"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription","3bb"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links","934"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode","803"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription","d64"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53","12c"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode","997"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription","79b"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links","4bd"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode","d46"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription","ef2"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4","e7b"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode","1e6"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription","30a"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links","edc"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode","89d"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription","2d2"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802","a19"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode","087"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription","24d"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links","042"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode","085"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription","d34"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd","9bd"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode","d19"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription","23f"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links","e98"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode","e43"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription","9f2"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f","654"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode","d35"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription","18b"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links","f0d"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode","a38"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription","9c8"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7","22d"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode","dbc"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription","4f2"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links","455"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode","1bc"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription","087"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696","c3a"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode","567"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription","c9c"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links","258"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode","60b"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription","96e"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b","cf2"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode","f7c"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription","c4e"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links","75b"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode","9b0"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription","cc5"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776","771"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode","798"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription","89f"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links","44c"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode","131"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription","7c1"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a","95d"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode","73f"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription","2b9"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links","b3f"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode","d21"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription","0f2"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295","0db"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode","b70"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription","69b"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links","3e6"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode","7e7"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription","fcd"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f","1a6"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode","198"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription","5d5"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links","a14"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode","1a4"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription","987"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143","ce5"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode","a61"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription","0a6"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links","f5f"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode","44e"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription","aef"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0","1c5"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode","11d"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription","46d"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links","9da"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode","7e6"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription","560"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc","140"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode","ddf"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription","8c3"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links","bff"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode","80e"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription","c93"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8","758"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode","2fd"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription","a83"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links","707"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode","36b"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription","864"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7","61d"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode","b2c"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription","433"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links","85f"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode","901"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription","669"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d","2ac"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode","e87"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription","8c5"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links","99a"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode","973"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription","427"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814","67b"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode","9f0"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription","ed8"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links","cbc"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode","c85"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription","81a"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896","126"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode","ead"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription","d29"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links","997"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode","b1a"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription","967"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166","e9b"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode","cce"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription","4d9"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links","3a3"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode","a12"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription","d50"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c","50b"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode","a6f"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription","f7a"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links","247"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode","d67"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription","dd4"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1","b4e"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode","cdc"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription","5e7"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links","231"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode","01f"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription","681"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8","f25"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode","6e1"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription","a51"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links","f9f"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode","f2f"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription","ef6"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7","d31"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode","ff6"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription","3a4"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links","5b3"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode","f63"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription","86b"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9","cb9"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode","611"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription","584"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links","a84"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode","d34"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription","d33"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d","e2c"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode","7e9"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription","72e"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links","df9"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode","09e"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription","ddd"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59","19d"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode","bbd"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription","f7d"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links","27c"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode","e9c"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription","3bb"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0","586"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode","7fe"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription","3d2"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links","07d"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode","375"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription","fc1"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07","736"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode","451"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription","223"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links","8af"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode","852"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription","ccf"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0","6e7"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode","4e3"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription","82c"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links","af6"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode","31a"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription","9ce"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb","dce"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode","3ee"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription","698"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links","6e2"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode","44c"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription","7be"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8","56c"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode","d46"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription","511"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links","491"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode","17e"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription","81b"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b","dcf"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode","491"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription","993"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links","189"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode","424"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription","98e"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6","c91"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode","572"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription","c73"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links","25b"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode","0a4"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription","111"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815","dd9"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode","ed5"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription","fae"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links","a1c"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode","149"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription","6af"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c","af9"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode","dcd"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription","72c"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links","f8e"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode","cca"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription","6d4"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7","e08"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode","35c"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription","058"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links","47f"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode","923"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription","b64"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6","a47"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode","058"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription","e12"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links","fcb"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode","688"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription","0f1"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071","c30"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode","e36"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription","0d0"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links","4f0"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode","269"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription","3c2"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01","ecb"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode","b29"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription","ebc"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links","bd8"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode","f12"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription","afd"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132","200"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode","ea3"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription","a33"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links","70d"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode","f4f"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription","f1c"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6","24d"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode","3d0"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription","9b0"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links","60b"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode","3f4"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription","e22"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6","077"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode","4df"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription","347"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links","ac4"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode","42e"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription","265"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096","533"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode","b0e"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription","2d2"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links","d06"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode","668"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription","b28"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09","e76"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode","4ab"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription","7c1"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links","c91"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode","cf0"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription","e54"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9","7d3"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode","996"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription","d5a"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links","846"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode","a9b"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription","0c9"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd","bc0"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode","166"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription","96e"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links","872"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode","440"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription","37e"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0","e6b"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode","cf5"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription","20a"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links","281"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode","e00"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription","116"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed","765"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode","491"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription","499"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links","580"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode","43e"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription","126"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115","ecd"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode","a23"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription","d36"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links","d5f"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode","447"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription","b92"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961","929"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode","e5f"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription","33f"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links","e88"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode","f31"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription","c68"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2","755"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode","b0f"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription","39c"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links","ea3"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode","f88"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription","37a"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03","a2d"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode","cef"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription","ed9"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links","dc9"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode","b52"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription","ad8"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153","e5a"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode","179"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription","81e"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links","afe"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode","349"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription","f75"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4","4fe"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode","73b"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription","76b"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links","646"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode","199"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription","597"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927","efa"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode","53b"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription","2ce"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links","d32"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode","6ea"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription","bc2"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb","7f6"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode","a90"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription","da9"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links","ed4"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode","efd"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription","30a"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5","58d"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode","6f0"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription","1d9"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links","c7a"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode","4d0"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription","b93"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e","152"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode","960"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription","bf0"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links","50d"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode","3ad"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription","878"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed","182"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode","3c0"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription","3af"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links","47a"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode","cde"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription","9b6"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91","d45"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode","266"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription","3be"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links","e5f"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode","f6d"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription","696"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910","b65"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode","518"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription","89b"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links","877"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode","517"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription","1a2"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2","5f6"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode","a23"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription","72c"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links","94d"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode","d89"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription","837"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050","f9d"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode","f7c"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription","3cc"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links","709"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode","d1b"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription","3bc"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2","830"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode","174"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription","e82"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links","b8e"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode","329"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription","490"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3","ca3"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode","86c"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription","0a4"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links","bd7"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode","863"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription","46b"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5","fab"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode","89a"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription","46a"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links","77e"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode","0d8"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription","0da"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4","b1e"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode","465"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription","397"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links","2bd"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode","5fd"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription","7eb"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe","d4a"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode","df3"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription","18f"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links","55c"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode","b6d"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription","e3b"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6","3fe"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode","ac1"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription","2c3"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links","4fb"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode","9b7"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription","5a6"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b","55d"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode","432"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription","620"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links","3cc"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode","a6f"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription","f16"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000","9f3"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode","8f2"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription","01e"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links","208"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode","cc3"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription","b81"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4","3b1"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode","dc0"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription","7db"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links","90d"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode","c45"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription","2f5"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6","e79"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode","fea"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription","f0e"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links","382"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode","4bf"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription","57d"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1","904"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode","da0"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription","306"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links","a3e"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode","616"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription","46b"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179","3aa"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode","0f7"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription","faf"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links","22d"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode","7ee"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription","d2c"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff","09c"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode","550"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription","196"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links","1bf"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode","58c"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription","ef5"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb","4bd"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode","990"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription","cf0"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links","71a"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode","966"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription","ae8"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e","fba"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode","f94"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription","934"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links","8e9"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode","f8e"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription","bcf"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a","491"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode","2e4"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription","cf8"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links","59f"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode","fc9"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription","021"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf","a60"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode","312"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription","3cb"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links","bca"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode","205"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription","ad3"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645","017"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode","dd6"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription","0c2"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links","145"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode","bf9"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription","a63"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e","b1c"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode","5ac"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription","478"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links","d5e"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode","34e"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription","245"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf","c42"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode","a2f"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription","f27"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links","b5c"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode","01d"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription","77e"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a","53c"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode","8df"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription","e8c"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links","a21"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode","ac6"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription","886"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea","79d"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode","556"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription","e79"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links","484"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode","4a6"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription","80d"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020","ae7"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode","231"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription","52c"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links","547"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode","464"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription","184"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f","c85"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode","6c2"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription","a6e"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links","e1b"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode","ca5"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription","357"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0","6c4"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode","3ec"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription","c30"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links","6cc"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode","f5f"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription","e72"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf","774"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode","ce3"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription","53a"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links","075"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode","620"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription","435"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef","2ea"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode","5e6"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription","cb9"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links","420"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode","a72"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription","084"),exact:!0},{path:"/100-bugow-js/sukces",component:l("/100-bugow-js/sukces","2a9"),exact:!0},{path:"/100-bugow-js/wymagane-potwierdzenie",component:l("/100-bugow-js/wymagane-potwierdzenie","877"),exact:!0},{path:"/docs/tags",component:l("/docs/tags","b97"),exact:!0},{path:"/docs/tags/a-11-y",component:l("/docs/tags/a-11-y","c03"),exact:!0},{path:"/docs/tags/accessibility",component:l("/docs/tags/accessibility","734"),exact:!0},{path:"/docs/tags/agile",component:l("/docs/tags/agile","ea1"),exact:!0},{path:"/docs/tags/algorytm",component:l("/docs/tags/algorytm","633"),exact:!0},{path:"/docs/tags/api",component:l("/docs/tags/api","8b0"),exact:!0},{path:"/docs/tags/app",component:l("/docs/tags/app","6d0"),exact:!0},{path:"/docs/tags/apple",component:l("/docs/tags/apple","e8d"),exact:!0},{path:"/docs/tags/big-o",component:l("/docs/tags/big-o","05d"),exact:!0},{path:"/docs/tags/bsd",component:l("/docs/tags/bsd","9f0"),exact:!0},{path:"/docs/tags/bug",component:l("/docs/tags/bug","5f9"),exact:!0},{path:"/docs/tags/bundle",component:l("/docs/tags/bundle","bbd"),exact:!0},{path:"/docs/tags/cache",component:l("/docs/tags/cache","249"),exact:!0},{path:"/docs/tags/chrome",component:l("/docs/tags/chrome","d37"),exact:!0},{path:"/docs/tags/cloud",component:l("/docs/tags/cloud","832"),exact:!0},{path:"/docs/tags/cpu",component:l("/docs/tags/cpu","67e"),exact:!0},{path:"/docs/tags/cs",component:l("/docs/tags/cs","16d"),exact:!0},{path:"/docs/tags/css",component:l("/docs/tags/css","35c"),exact:!0},{path:"/docs/tags/db",component:l("/docs/tags/db","ad0"),exact:!0},{path:"/docs/tags/ddd",component:l("/docs/tags/ddd","b13"),exact:!0},{path:"/docs/tags/dev-tools",component:l("/docs/tags/dev-tools","342"),exact:!0},{path:"/docs/tags/dns",component:l("/docs/tags/dns","a98"),exact:!0},{path:"/docs/tags/docs",component:l("/docs/tags/docs","8cb"),exact:!0},{path:"/docs/tags/free-bsd",component:l("/docs/tags/free-bsd","fec"),exact:!0},{path:"/docs/tags/frontend",component:l("/docs/tags/frontend","91a"),exact:!0},{path:"/docs/tags/ftp",component:l("/docs/tags/ftp","982"),exact:!0},{path:"/docs/tags/git",component:l("/docs/tags/git","291"),exact:!0},{path:"/docs/tags/google",component:l("/docs/tags/google","e17"),exact:!0},{path:"/docs/tags/hardware",component:l("/docs/tags/hardware","dae"),exact:!0},{path:"/docs/tags/hash",component:l("/docs/tags/hash","146"),exact:!0},{path:"/docs/tags/hosting",component:l("/docs/tags/hosting","d0e"),exact:!0},{path:"/docs/tags/html",component:l("/docs/tags/html","e3b"),exact:!0},{path:"/docs/tags/http",component:l("/docs/tags/http","66c"),exact:!0},{path:"/docs/tags/i-o",component:l("/docs/tags/i-o","f49"),exact:!0},{path:"/docs/tags/i-os",component:l("/docs/tags/i-os","ec0"),exact:!0},{path:"/docs/tags/internet",component:l("/docs/tags/internet","b20"),exact:!0},{path:"/docs/tags/ip",component:l("/docs/tags/ip","0b7"),exact:!0},{path:"/docs/tags/java-script",component:l("/docs/tags/java-script","ee7"),exact:!0},{path:"/docs/tags/js",component:l("/docs/tags/js","7d6"),exact:!0},{path:"/docs/tags/kernel",component:l("/docs/tags/kernel","b46"),exact:!0},{path:"/docs/tags/library",component:l("/docs/tags/library","906"),exact:!0},{path:"/docs/tags/linux",component:l("/docs/tags/linux","679"),exact:!0},{path:"/docs/tags/mac-os",component:l("/docs/tags/mac-os","ed2"),exact:!0},{path:"/docs/tags/microsoft",component:l("/docs/tags/microsoft","391"),exact:!0},{path:"/docs/tags/mobile",component:l("/docs/tags/mobile","f6b"),exact:!0},{path:"/docs/tags/network",component:l("/docs/tags/network","127"),exact:!0},{path:"/docs/tags/node-js",component:l("/docs/tags/node-js","b09"),exact:!0},{path:"/docs/tags/oop",component:l("/docs/tags/oop","cff"),exact:!0},{path:"/docs/tags/os",component:l("/docs/tags/os","a66"),exact:!0},{path:"/docs/tags/owasp",component:l("/docs/tags/owasp","5e7"),exact:!0},{path:"/docs/tags/performance",component:l("/docs/tags/performance","aae"),exact:!0},{path:"/docs/tags/pwa",component:l("/docs/tags/pwa","f84"),exact:!0},{path:"/docs/tags/ram",component:l("/docs/tags/ram","da7"),exact:!0},{path:"/docs/tags/readme",component:l("/docs/tags/readme","071"),exact:!0},{path:"/docs/tags/redux",component:l("/docs/tags/redux","cec"),exact:!0},{path:"/docs/tags/sass",component:l("/docs/tags/sass","f19"),exact:!0},{path:"/docs/tags/scrum",component:l("/docs/tags/scrum","ff7"),exact:!0},{path:"/docs/tags/scss",component:l("/docs/tags/scss","470"),exact:!0},{path:"/docs/tags/security",component:l("/docs/tags/security","5b9"),exact:!0},{path:"/docs/tags/sem-ver",component:l("/docs/tags/sem-ver","aff"),exact:!0},{path:"/docs/tags/seo",component:l("/docs/tags/seo","062"),exact:!0},{path:"/docs/tags/ssd",component:l("/docs/tags/ssd","5ba"),exact:!0},{path:"/docs/tags/ssh",component:l("/docs/tags/ssh","4b6"),exact:!0},{path:"/docs/tags/state",component:l("/docs/tags/state","213"),exact:!0},{path:"/docs/tags/tcp-ip",component:l("/docs/tags/tcp-ip","8fb"),exact:!0},{path:"/docs/tags/tdd",component:l("/docs/tags/tdd","b10"),exact:!0},{path:"/docs/tags/ui",component:l("/docs/tags/ui","936"),exact:!0},{path:"/docs/tags/ux",component:l("/docs/tags/ux","8a7"),exact:!0},{path:"/docs/tags/vcs",component:l("/docs/tags/vcs","52f"),exact:!0},{path:"/docs/tags/vps",component:l("/docs/tags/vps","c37"),exact:!0},{path:"/docs/tags/web-components",component:l("/docs/tags/web-components","004"),exact:!0},{path:"/docs/tags/webpack",component:l("/docs/tags/webpack","20d"),exact:!0},{path:"/docs/tags/windows",component:l("/docs/tags/windows","f21"),exact:!0},{path:"/docs",component:l("/docs","603"),routes:[{path:"/docs/frontend/aplikacje-mobilne",component:l("/docs/frontend/aplikacje-mobilne","61f"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/css/\u25b6\ufe0f-debugowanie-css-przez-narzedzia-developerskie",component:l("/docs/frontend/css/\u25b6\ufe0f-debugowanie-css-przez-narzedzia-developerskie","16e"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/css/\u25b6\ufe0f-organizacja-styli-css-i-preprocesory",component:l("/docs/frontend/css/\u25b6\ufe0f-organizacja-styli-css-i-preprocesory","a60"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/css/\u25b6\ufe0f-wprowadzenie-w-css",component:l("/docs/frontend/css/\u25b6\ufe0f-wprowadzenie-w-css","7e7"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/css/css",component:l("/docs/frontend/css/css","b9e"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/dostepnosc",component:l("/docs/frontend/dostepnosc","431"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/frontend",component:l("/docs/frontend/frontend","5de"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/\u25b6\ufe0f-obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji",component:l("/docs/frontend/html/\u25b6\ufe0f-obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji","035"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/\u25b6\ufe0f-rdzen-metadane-sekcje",component:l("/docs/frontend/html/\u25b6\ufe0f-rdzen-metadane-sekcje","132"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/\u25b6\ufe0f-tabele-formularze-elementy-interaktywne-komponenty",component:l("/docs/frontend/html/\u25b6\ufe0f-tabele-formularze-elementy-interaktywne-komponenty","353"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/\u25b6\ufe0f-tekst",component:l("/docs/frontend/html/\u25b6\ufe0f-tekst","cea"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/\u25b6\ufe0f-wprowadzenie-do-htmla",component:l("/docs/frontend/html/\u25b6\ufe0f-wprowadzenie-do-htmla","a03"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/\u25b6\ufe0f-zadanie-domowe",component:l("/docs/frontend/html/\u25b6\ufe0f-zadanie-domowe","8e6"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/html/html",component:l("/docs/frontend/html/html","f47"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/javascript/\u25b6\ufe0f-node-js-na-frontendzie",component:l("/docs/frontend/javascript/\u25b6\ufe0f-node-js-na-frontendzie","3fe"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/javascript/\u25b6\ufe0f-podstawy-javascript",component:l("/docs/frontend/javascript/\u25b6\ufe0f-podstawy-javascript","1c9"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/javascript/javascript",component:l("/docs/frontend/javascript/javascript","549"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/komponenty",component:l("/docs/frontend/komponenty","18f"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/pakiety",component:l("/docs/frontend/pakiety/pakiety","94a"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-deweloperski-serwer-webpack-i-gorace-przeladowania",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-deweloperski-serwer-webpack-i-gorace-przeladowania","1ac"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-generowanie-pliku-html-z-szablonu",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-generowanie-pliku-html-z-szablonu","b47"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-ladowarki",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-ladowarki","f62"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-plik-konfiguracyjny",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-plik-konfiguracyjny","b12"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-podstawowy-sposob-uzycia",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-podstawowy-sposob-uzycia","0ed"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-podzial-plikow-konfiguracyjnych",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-podzial-plikow-konfiguracyjnych","ec8"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-rozwiazywanie-sciezek-importu-plikow",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-rozwiazywanie-sciezek-importu-plikow","dd4"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian",component:l("/docs/frontend/pakiety/webpack/\u25b6\ufe0f-tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian","984"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/pakiety/webpack/webpack",component:l("/docs/frontend/pakiety/webpack/webpack","f13"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/progresywne-aplikacje",component:l("/docs/frontend/progresywne-aplikacje","e89"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/seo",component:l("/docs/frontend/seo","3f5"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/webassembly",component:l("/docs/frontend/webassembly","de4"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-asynchroniczne-akcje",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-asynchroniczne-akcje","dd7"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-koncept-dzialania-redux-a",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-koncept-dzialania-redux-a","4c7"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-laczenie-reduktorow",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-laczenie-reduktorow","a9f"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-magazynu",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-magazynu","7f9"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-pojedynczych-elementow",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-pojedynczych-elementow","c17"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-podzial-kodu-na-mniejsze-pliki",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-podzial-kodu-na-mniejsze-pliki","3e3"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-predefiniowane-typy-akcji-i-kreatory-akcji",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-predefiniowane-typy-akcji-i-kreatory-akcji","530"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-przygotowanie-srodowiska-deweloperskiego",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-przygotowanie-srodowiska-deweloperskiego","20c"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-redux-thunk",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-redux-thunk","3ea"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-zarzadzanie-wieloma-stanami",component:l("/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-zarzadzanie-wieloma-stanami","5ea"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/redux/redux",component:l("/docs/frontend/zarzadzanie-stanem/redux/redux","b0f"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/frontend/zarzadzanie-stanem/zarzadzanie-stanem",component:l("/docs/frontend/zarzadzanie-stanem/zarzadzanie-stanem","dcc"),exact:!0,sidebar:"frontendSidebar"},{path:"/docs/informatyka/aplikacje",component:l("/docs/informatyka/aplikacje","923"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/architektura-oprogramowania",component:l("/docs/informatyka/architektura-oprogramowania","302"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/bezpieczenstwo",component:l("/docs/informatyka/bezpieczenstwo","2a2"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/debugowanie",component:l("/docs/informatyka/debugowanie","9d7"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/dns-i-domeny",component:l("/docs/informatyka/dns-i-domeny","b0c"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/dokumentacje",component:l("/docs/informatyka/dokumentacje","d5d"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/dzialanie-komputerow",component:l("/docs/informatyka/dzialanie-komputerow","1eb"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/formatowanie-kodu",component:l("/docs/informatyka/formatowanie-kodu","9a1"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/haszowanie",component:l("/docs/informatyka/haszowanie","a8b"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/hosting",component:l("/docs/informatyka/hosting","0ae"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/informatyka",component:l("/docs/informatyka/informatyka","c77"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/kontrola-wersji",component:l("/docs/informatyka/kontrola-wersji","b3b"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/licencje",component:l("/docs/informatyka/licencje","fc0"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/pamiec-podreczna",component:l("/docs/informatyka/pamiec-podreczna","2ea"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/praca-w-it",component:l("/docs/informatyka/praca-w-it","5e2"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/algorytmy",component:l("/docs/informatyka/programowanie/algorytmy","3e4"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/api",component:l("/docs/informatyka/programowanie/api","f08"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/biblioteki",component:l("/docs/informatyka/programowanie/biblioteki","7d4"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/frameworki",component:l("/docs/informatyka/programowanie/frameworki","bff"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/jezyki-programowania",component:l("/docs/informatyka/programowanie/jezyki-programowania","32a"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/programowanie",component:l("/docs/informatyka/programowanie/programowanie","ba3"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/programowanie-deklaratywne",component:l("/docs/informatyka/programowanie/programowanie-deklaratywne","def"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/programowanie-funkcyjne",component:l("/docs/informatyka/programowanie/programowanie-funkcyjne","ad8"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/programowanie-imperatywne",component:l("/docs/informatyka/programowanie/programowanie-imperatywne","0f5"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/programowanie-obiektowe",component:l("/docs/informatyka/programowanie/programowanie-obiektowe","3ce"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/struktury-i-bazy-danych",component:l("/docs/informatyka/programowanie/struktury-i-bazy-danych","bb0"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/typowanie-statyczne-i-dynamiczne",component:l("/docs/informatyka/programowanie/typowanie-statyczne-i-dynamiczne","67d"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/programowanie/wzorce-projektowe",component:l("/docs/informatyka/programowanie/wzorce-projektowe","1e8"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/siec",component:l("/docs/informatyka/siec","546"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/systemy-operacyjne/chrome-os",component:l("/docs/informatyka/systemy-operacyjne/chrome-os","8e4"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/systemy-operacyjne/free-bsd",component:l("/docs/informatyka/systemy-operacyjne/free-bsd","b50"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/systemy-operacyjne/linux",component:l("/docs/informatyka/systemy-operacyjne/linux","a35"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/systemy-operacyjne/macos-i-ios",component:l("/docs/informatyka/systemy-operacyjne/macos-i-ios","f91"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/systemy-operacyjne/systemy-operacyjne",component:l("/docs/informatyka/systemy-operacyjne/systemy-operacyjne","fa2"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/systemy-operacyjne/windows",component:l("/docs/informatyka/systemy-operacyjne/windows","a8d"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/testowanie",component:l("/docs/informatyka/testowanie","cfe"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/warstwy-abstrakcji",component:l("/docs/informatyka/warstwy-abstrakcji","f77"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/wydajnosc",component:l("/docs/informatyka/wydajnosc","242"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/informatyka/zarzadzanie-projektami",component:l("/docs/informatyka/zarzadzanie-projektami","f38"),exact:!0,sidebar:"csFundamentalsSidebar"},{path:"/docs/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-01-nagranie-z-webinaru-ux",component:l("/docs/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-01-nagranie-z-webinaru-ux","168"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-02-material-uzupelniajacy-ui",component:l("/docs/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-02-material-uzupelniajacy-ui","bdc"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-0-wprowadzenie",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-0-wprowadzenie","b51"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-1-korzystanie-z-figmy",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-1-korzystanie-z-figmy","2de"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-2-zapoznanie-z-interfejsem",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-2-zapoznanie-z-interfejsem","2f7"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-1-tablica-inspiracji",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-1-tablica-inspiracji","da2"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-2-persona-uzytkownika",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-2-persona-uzytkownika","147"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-3-scenariusze-uzytkownika",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-3-scenariusze-uzytkownika","96d"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-1-schemat-dzialan-uzytkownika",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-1-schemat-dzialan-uzytkownika","9f6"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-2-mapa-strony",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-2-mapa-strony","09a"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-1-przygotowanie-elementow-szkieletu",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-1-przygotowanie-elementow-szkieletu","373"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-2-projektowanie-szkieletu",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-2-projektowanie-szkieletu","58e"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-4-prototyp",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-4-prototyp","7fd"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-1-tresci-tekstowe",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-1-tresci-tekstowe","2b1"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-2-tresci-graficzne",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-2-tresci-graficzne","a02"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-1-identyfikacja-marki",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-1-identyfikacja-marki","023"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-1-dostosowanie-typografii-i-kolorow",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-1-dostosowanie-typografii-i-kolorow","68a"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-2-formularzdostepnosci-uslugi",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-2-formularzdostepnosci-uslugi","258"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-3-glebia",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-3-glebia","e01"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-4-dostosowanie-ilustracji",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-4-dostosowanie-ilustracji","998"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-5-rozmieszczenie-grafik",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-5-rozmieszczenie-grafik","9cf"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-6-detale",component:l("/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-6-detale","c02"),exact:!0,sidebar:"uxuiSidebar"},{path:"/docs/ux-ui/ux-ui",component:l("/docs/ux-ui/ux-ui","fd6"),exact:!0,sidebar:"uxuiSidebar"}]},{path:"/",component:l("/","b41"),exact:!0},{path:"*",component:l("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>c});var o=n(67294);const a=o.createContext(!1);function c(e){let{children:t}=e;const[n,c]=(0,o.useState)(!1);return(0,o.useEffect)((()=>{c(!0)}),[]),o.createElement(a.Provider,{value:n},t)}},49383:(e,t,n)=>{"use strict";var o=n(67294),a=n(73935),c=n(73727),i=n(70405),s=n(10412);const r=[n(56657),n(32497),n(3310),n(18320),n(52295)];var d=n(723),u=n(16550),b=n(18790);function l(e){let{children:t}=e;return o.createElement(o.Fragment,null,t)}var f=n(87462),p=n(35742),g=n(52263),m=n(44996),w=n(86668),h=n(1944),_=n(94711),j=n(19727),y=n(43320),k=n(90197);function x(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,_.l)();return o.createElement(p.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return o.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),o.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function v(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,u.TH)();return e+(0,m.Z)(t)}(),c=t?`${n}${t}`:a;return o.createElement(p.Z,null,o.createElement("meta",{property:"og:url",content:c}),o.createElement("link",{rel:"canonical",href:c}))}function C(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,w.L)();return o.createElement(o.Fragment,null,o.createElement(p.Z,null,o.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),o.createElement("body",{className:j.h})),n&&o.createElement(h.d,{image:n}),o.createElement(v,null),o.createElement(x,null),o.createElement(k.Z,{tag:y.HX,locale:e}),o.createElement(p.Z,null,t.map(((e,t)=>o.createElement("meta",(0,f.Z)({key:t},e))))))}const S=new Map;function E(e){if(S.has(e.pathname))return{...e,pathname:S.get(e.pathname)};if((0,b.f)(d.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return S.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return S.set(e.pathname,t),{...e,pathname:t}}var D=n(98934),z=n(58940);function T(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o{const o=t.default?.[e]??t[e];return o?.(...n)}));return()=>a.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,o.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const o=t.pathname===n.pathname,a=t.hash===n.hash,c=t.search===n.search;if(o&&a&&!c)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),T("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,b.f)(d.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class A extends o.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?T("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=T("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return o.createElement(P,{previousLocation:this.previousLocation,location:t},o.createElement(u.AW,{location:t,render:()=>e}))}}const N=A,R="__docusaurus-base-url-issue-banner-container",O="__docusaurus-base-url-issue-banner",I="__docusaurus-base-url-issue-banner-suggestion-container",M="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return`\nwindow['${M}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${M}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${R}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[M]=!1}),[]),o.createElement(o.Fragment,null,!s.Z.canUseDOM&&o.createElement(p.Z,null,o.createElement("script",null,F(e))),o.createElement("div",{id:R}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?o.createElement(B,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:c}}=(0,g.Z)(),i=(0,m.Z)(e),{htmlLang:s,direction:r}=c[a];return o.createElement(p.Z,null,o.createElement("html",{lang:s,dir:r}),o.createElement("title",null,t),o.createElement("meta",{property:"og:title",content:t}),o.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&o.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&o.createElement("link",{rel:"icon",href:i}))}var q=n(44763);function H(){const e=(0,b.H)(d.Z),t=(0,u.TH)();return o.createElement(q.Z,null,o.createElement(z.M,null,o.createElement(D.t,null,o.createElement(l,null,o.createElement($,null),o.createElement(C,null),o.createElement(U,null),o.createElement(N,{location:E(t)},e)))))}var G=n(16887);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const o=new XMLHttpRequest;o.open("GET",e,!0),o.withCredentials=!0,o.onload=()=>{200===o.status?t():n()},o.send(null)}))};var V=n(99670);const W=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,b.f)(d.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),L(e))},Q=Object.freeze(X);if(s.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;L(window.location.pathname).then((()=>{e(o.createElement(i.B6,null,o.createElement(c.VK,null,o.createElement(H,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>b});var o=n(67294),a=n(36809);const c=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-C4MJB6VCM9"],"anonymizeIP":true,"id":"default"}},"docusaurus-lunr-search":{"default":{"fileNames":{"searchDoc":"search-doc-1688562608076.json","lunrIndex":"lunr-index-1688562608076.json"}}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"informatyka/informatyka","docs":[{"id":"frontend/aplikacje-mobilne","path":"/docs/frontend/aplikacje-mobilne","sidebar":"frontendSidebar"},{"id":"frontend/css/\u25b6\ufe0f-debugowanie-css-przez-narzedzia-developerskie","path":"/docs/frontend/css/\u25b6\ufe0f-debugowanie-css-przez-narzedzia-developerskie","sidebar":"frontendSidebar"},{"id":"frontend/css/\u25b6\ufe0f-organizacja-styli-css-i-preprocesory","path":"/docs/frontend/css/\u25b6\ufe0f-organizacja-styli-css-i-preprocesory","sidebar":"frontendSidebar"},{"id":"frontend/css/\u25b6\ufe0f-wprowadzenie-w-css","path":"/docs/frontend/css/\u25b6\ufe0f-wprowadzenie-w-css","sidebar":"frontendSidebar"},{"id":"frontend/css/css","path":"/docs/frontend/css/css","sidebar":"frontendSidebar"},{"id":"frontend/dostepnosc","path":"/docs/frontend/dostepnosc","sidebar":"frontendSidebar"},{"id":"frontend/frontend","path":"/docs/frontend/frontend","sidebar":"frontendSidebar"},{"id":"frontend/html/\u25b6\ufe0f-obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji","path":"/docs/frontend/html/\u25b6\ufe0f-obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji","sidebar":"frontendSidebar"},{"id":"frontend/html/\u25b6\ufe0f-rdzen-metadane-sekcje","path":"/docs/frontend/html/\u25b6\ufe0f-rdzen-metadane-sekcje","sidebar":"frontendSidebar"},{"id":"frontend/html/\u25b6\ufe0f-tabele-formularze-elementy-interaktywne-komponenty","path":"/docs/frontend/html/\u25b6\ufe0f-tabele-formularze-elementy-interaktywne-komponenty","sidebar":"frontendSidebar"},{"id":"frontend/html/\u25b6\ufe0f-tekst","path":"/docs/frontend/html/\u25b6\ufe0f-tekst","sidebar":"frontendSidebar"},{"id":"frontend/html/\u25b6\ufe0f-wprowadzenie-do-htmla","path":"/docs/frontend/html/\u25b6\ufe0f-wprowadzenie-do-htmla","sidebar":"frontendSidebar"},{"id":"frontend/html/\u25b6\ufe0f-zadanie-domowe","path":"/docs/frontend/html/\u25b6\ufe0f-zadanie-domowe","sidebar":"frontendSidebar"},{"id":"frontend/html/html","path":"/docs/frontend/html/html","sidebar":"frontendSidebar"},{"id":"frontend/javascript/\u25b6\ufe0f-node-js-na-frontendzie","path":"/docs/frontend/javascript/\u25b6\ufe0f-node-js-na-frontendzie","sidebar":"frontendSidebar"},{"id":"frontend/javascript/\u25b6\ufe0f-podstawy-javascript","path":"/docs/frontend/javascript/\u25b6\ufe0f-podstawy-javascript","sidebar":"frontendSidebar"},{"id":"frontend/javascript/javascript","path":"/docs/frontend/javascript/javascript","sidebar":"frontendSidebar"},{"id":"frontend/komponenty","path":"/docs/frontend/komponenty","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/pakiety","path":"/docs/frontend/pakiety/pakiety","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-deweloperski-serwer-webpack-i-gorace-przeladowania","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-deweloperski-serwer-webpack-i-gorace-przeladowania","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-generowanie-pliku-html-z-szablonu","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-generowanie-pliku-html-z-szablonu","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-ladowarki","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-ladowarki","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-plik-konfiguracyjny","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-plik-konfiguracyjny","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-podstawowy-sposob-uzycia","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-podstawowy-sposob-uzycia","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-podzial-plikow-konfiguracyjnych","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-podzial-plikow-konfiguracyjnych","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-rozwiazywanie-sciezek-importu-plikow","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-rozwiazywanie-sciezek-importu-plikow","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/\u25b6\ufe0f-tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian","path":"/docs/frontend/pakiety/webpack/\u25b6\ufe0f-tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian","sidebar":"frontendSidebar"},{"id":"frontend/pakiety/webpack/webpack","path":"/docs/frontend/pakiety/webpack/webpack","sidebar":"frontendSidebar"},{"id":"frontend/progresywne-aplikacje","path":"/docs/frontend/progresywne-aplikacje","sidebar":"frontendSidebar"},{"id":"frontend/seo","path":"/docs/frontend/seo","sidebar":"frontendSidebar"},{"id":"frontend/webassembly","path":"/docs/frontend/webassembly","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-asynchroniczne-akcje","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-asynchroniczne-akcje","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-koncept-dzialania-redux-a","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-koncept-dzialania-redux-a","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-laczenie-reduktorow","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-laczenie-reduktorow","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-magazynu","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-magazynu","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-pojedynczych-elementow","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-modyfikowanie-stanu-pojedynczych-elementow","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-podzial-kodu-na-mniejsze-pliki","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-podzial-kodu-na-mniejsze-pliki","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-predefiniowane-typy-akcji-i-kreatory-akcji","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-predefiniowane-typy-akcji-i-kreatory-akcji","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-przygotowanie-srodowiska-deweloperskiego","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-przygotowanie-srodowiska-deweloperskiego","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-redux-thunk","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-redux-thunk","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-zarzadzanie-wieloma-stanami","path":"/docs/frontend/zarzadzanie-stanem/redux/\u25b6\ufe0f-zarzadzanie-wieloma-stanami","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/redux/redux","path":"/docs/frontend/zarzadzanie-stanem/redux/redux","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/zarzadzanie-stanem","path":"/docs/frontend/zarzadzanie-stanem/zarzadzanie-stanem","sidebar":"frontendSidebar"},{"id":"informatyka/aplikacje","path":"/docs/informatyka/aplikacje","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/architektura-oprogramowania","path":"/docs/informatyka/architektura-oprogramowania","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/bezpieczenstwo","path":"/docs/informatyka/bezpieczenstwo","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/debugowanie","path":"/docs/informatyka/debugowanie","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/dns-i-domeny","path":"/docs/informatyka/dns-i-domeny","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/dokumentacje","path":"/docs/informatyka/dokumentacje","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/dzialanie-komputerow","path":"/docs/informatyka/dzialanie-komputerow","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/formatowanie-kodu","path":"/docs/informatyka/formatowanie-kodu","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/haszowanie","path":"/docs/informatyka/haszowanie","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/hosting","path":"/docs/informatyka/hosting","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/informatyka","path":"/docs/informatyka/informatyka","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/kontrola-wersji","path":"/docs/informatyka/kontrola-wersji","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/licencje","path":"/docs/informatyka/licencje","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/pamiec-podreczna","path":"/docs/informatyka/pamiec-podreczna","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/praca-w-it","path":"/docs/informatyka/praca-w-it","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/algorytmy","path":"/docs/informatyka/programowanie/algorytmy","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/api","path":"/docs/informatyka/programowanie/api","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/biblioteki","path":"/docs/informatyka/programowanie/biblioteki","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/frameworki","path":"/docs/informatyka/programowanie/frameworki","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/jezyki-programowania","path":"/docs/informatyka/programowanie/jezyki-programowania","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/programowanie","path":"/docs/informatyka/programowanie/programowanie","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/programowanie-deklaratywne","path":"/docs/informatyka/programowanie/programowanie-deklaratywne","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/programowanie-funkcyjne","path":"/docs/informatyka/programowanie/programowanie-funkcyjne","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/programowanie-imperatywne","path":"/docs/informatyka/programowanie/programowanie-imperatywne","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/programowanie-obiektowe","path":"/docs/informatyka/programowanie/programowanie-obiektowe","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/struktury-i-bazy-danych","path":"/docs/informatyka/programowanie/struktury-i-bazy-danych","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/typowanie-statyczne-i-dynamiczne","path":"/docs/informatyka/programowanie/typowanie-statyczne-i-dynamiczne","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/programowanie/wzorce-projektowe","path":"/docs/informatyka/programowanie/wzorce-projektowe","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/siec","path":"/docs/informatyka/siec","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/systemy-operacyjne/chrome-os","path":"/docs/informatyka/systemy-operacyjne/chrome-os","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/systemy-operacyjne/free-bsd","path":"/docs/informatyka/systemy-operacyjne/free-bsd","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/systemy-operacyjne/linux","path":"/docs/informatyka/systemy-operacyjne/linux","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/systemy-operacyjne/macos-i-ios","path":"/docs/informatyka/systemy-operacyjne/macos-i-ios","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/systemy-operacyjne/systemy-operacyjne","path":"/docs/informatyka/systemy-operacyjne/systemy-operacyjne","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/systemy-operacyjne/windows","path":"/docs/informatyka/systemy-operacyjne/windows","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/testowanie","path":"/docs/informatyka/testowanie","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/warstwy-abstrakcji","path":"/docs/informatyka/warstwy-abstrakcji","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/wydajnosc","path":"/docs/informatyka/wydajnosc","sidebar":"csFundamentalsSidebar"},{"id":"informatyka/zarzadzanie-projektami","path":"/docs/informatyka/zarzadzanie-projektami","sidebar":"csFundamentalsSidebar"},{"id":"ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-01-nagranie-z-webinaru-ux","path":"/docs/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-01-nagranie-z-webinaru-ux","sidebar":"uxuiSidebar"},{"id":"ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-02-material-uzupelniajacy-ui","path":"/docs/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/\u25b6\ufe0f-02-material-uzupelniajacy-ui","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-0-wprowadzenie","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-0-wprowadzenie","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-1-korzystanie-z-figmy","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-1-korzystanie-z-figmy","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-2-zapoznanie-z-interfejsem","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-1-2-zapoznanie-z-interfejsem","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-1-tablica-inspiracji","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-1-tablica-inspiracji","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-2-persona-uzytkownika","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-2-persona-uzytkownika","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-3-scenariusze-uzytkownika","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-2-3-scenariusze-uzytkownika","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-1-schemat-dzialan-uzytkownika","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-1-schemat-dzialan-uzytkownika","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-2-mapa-strony","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-2-mapa-strony","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-1-przygotowanie-elementow-szkieletu","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-1-przygotowanie-elementow-szkieletu","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-2-projektowanie-szkieletu","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-3-2-projektowanie-szkieletu","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-4-prototyp","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-3-4-prototyp","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-1-tresci-tekstowe","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-1-tresci-tekstowe","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-2-tresci-graficzne","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-4-2-tresci-graficzne","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-1-identyfikacja-marki","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-1-identyfikacja-marki","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-1-dostosowanie-typografii-i-kolorow","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-1-dostosowanie-typografii-i-kolorow","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-2-formularzdostepnosci-uslugi","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-2-formularzdostepnosci-uslugi","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-3-glebia","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-3-glebia","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-4-dostosowanie-ilustracji","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-4-dostosowanie-ilustracji","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-5-rozmieszczenie-grafik","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-5-rozmieszczenie-grafik","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-6-detale","path":"/docs/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/\u25b6\ufe0f-5-2-6-detale","sidebar":"uxuiSidebar"},{"id":"ux-ui/ux-ui","path":"/docs/ux-ui/ux-ui","sidebar":"uxuiSidebar"}],"draftIds":[],"sidebars":{"csFundamentalsSidebar":{"link":{"path":"/docs/informatyka/informatyka","label":"informatyka/informatyka"}},"uxuiSidebar":{"link":{"path":"/docs/ux-ui/ux-ui","label":"ux-ui/ux-ui"}},"frontendSidebar":{"link":{"path":"/docs/frontend/frontend","label":"frontend/frontend"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"pl","locales":["pl"],"path":"i18n","currentLocale":"pl","localeConfigs":{"pl":{"label":"Polski","direction":"ltr","htmlLang":"pl","calendar":"gregory","path":"pl"}}}');var s=n(57529);const r=JSON.parse('{"docusaurusVersion":"2.4.1","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"},"docusaurus-lunr-search":{"type":"package","name":"docusaurus-lunr-search","version":"2.3.2"},"docusaurus-tailwindcss":{"type":"local"}}}'),d={siteConfig:a.default,siteMetadata:r,globalData:c,i18n:i,codeTranslations:s},u=o.createContext(d);function b(e){let{children:t}=e;return o.createElement(u.Provider,{value:d},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var o=n(67294),a=n(10412),c=n(35742),i=n(18780),s=n(84173);function r(e){let{error:t,tryAgain:n}=e;return o.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},o.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),o.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),o.createElement(d,{error:t}))}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return o.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return o.createElement(l,{fallback:()=>o.createElement(r,{error:t,tryAgain:n})},o.createElement(c.Z,null,o.createElement("title",null,"Page Error")),o.createElement(s.Z,null,o.createElement(r,{error:t,tryAgain:n})))}const b=e=>o.createElement(u,e);class l extends o.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??b)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const o="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:o,canUseEventListeners:o&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:o&&"IntersectionObserver"in window,canUseViewport:o&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(67294),a=n(70405);function c(e){return o.createElement(a.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var o=n(87462),a=n(67294),c=n(73727),i=n(18780),s=n(52263),r=n(13919),d=n(10412);const u=a.createContext({collectLink:()=>{}});var b=n(44996);function l(e,t){let{isNavLink:n,to:l,href:f,activeClassName:p,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:w=!0,...h}=e;const{siteConfig:{trailingSlash:_,baseUrl:j}}=(0,s.Z)(),{withBaseUrl:y}=(0,b.C)(),k=(0,a.useContext)(u),x=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>x.current));const v=l||f;const C=(0,r.Z)(v),S=v?.replace("pathname://","");let E=void 0!==S?(D=S,w&&(e=>e.startsWith("/"))(D)?y(D):D):void 0;var D;E&&C&&(E=(0,i.applyTrailingSlash)(E,{trailingSlash:_,baseUrl:j}));const z=(0,a.useRef)(!1),T=n?c.OL:c.rU,P=d.Z.canUseIntersectionObserver,L=(0,a.useRef)(),A=()=>{z.current||null==E||(window.docusaurus.preload(E),z.current=!0)};(0,a.useEffect)((()=>(!P&&C&&null!=E&&window.docusaurus.prefetch(E),()=>{P&&L.current&&L.current.disconnect()})),[L,E,P,C]);const N=E?.startsWith("#")??!1,R=!E||!C||N;return R||m||k.collectLink(E),R?a.createElement("a",(0,o.Z)({ref:x,href:E},v&&!C&&{target:"_blank",rel:"noopener noreferrer"},h)):a.createElement(T,(0,o.Z)({},h,{onMouseEnter:A,onTouchStart:A,innerRef:e=>{x.current=e,P&&e&&C&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=E&&window.docusaurus.prefetch(E))}))})),L.current.observe(e))},to:E},n&&{isActive:g,activeClassName:p}))}const f=a.forwardRef(l)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r,I:()=>s});var o=n(67294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,o.isValidElement)(e)))?n.map(((e,t)=>(0,o.isValidElement)(e)?o.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var c=n(57529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return c[t??n]??n??t}function s(e,t){let{message:n,id:o}=e;return a(i({message:n,id:o}),t)}function r(e){let{children:t,id:n,values:c}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const s=i({message:t,id:n});return o.createElement(o.Fragment,null,a(s,c))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>o});const o="default"},13919:(e,t,n)=>{"use strict";function o(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!o(e)}n.d(t,{Z:()=>a,b:()=>o})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var o=n(67294),a=n(52263),c=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,o.useCallback)(((n,o)=>function(e,t,n,o){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===o?{}:o;if(!n||n.startsWith("#")||(0,c.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,o)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(67294),a=n(58940);function c(){return(0,o.useContext)(a._)}},28084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>c,eZ:()=>i});var o=n(52263),a=n(29935);function c(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const o=c(e),i=o?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(67294),a=n(98934);function c(){return(0,o.useContext)(a._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const o=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[c,i]=n;const s=a?`${a}.${c}`:c;o(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>c});var o=n(67294);const a=o.createContext(null);function c(e){let{children:t,value:n}=e;const c=o.useContext(a),i=(0,o.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const o={...t.data,...n?.data};return{plugin:t.plugin,data:o}}({parent:c,value:n})),[c,n]);return o.createElement(a.Provider,{value:i},t)}},94104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>f,gA:()=>u,_r:()=>r,Jo:()=>p,zh:()=>d,yW:()=>l,gB:()=>b});var o=n(16550),a=n(28084);const c=e=>e.versions.find((e=>e.isLast));function i(e,t){const n=function(e,t){const n=c(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,o.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,o.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((o=>{o.id===t&&(n[e.name]=o)}))})),n}(a.id):{}}}const s={},r=()=>(0,a.OD)("docusaurus-plugin-content-docs")??s,d=e=>(0,a.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function u(e){void 0===e&&(e={});const t=r(),{pathname:n}=(0,o.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,o.LX)(t,{path:n.path,exact:!1,strict:!1})})),c=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!c&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return c}(t,n,e)}function b(e){return d(e).versions}function l(e){const t=d(e);return c(t)}function f(e){const t=d(e),{pathname:n}=(0,o.TH)();return i(t,n)}function p(e){const t=d(e),{pathname:n}=(0,o.TH)();return function(e,t){const n=c(e);return{latestDocSuggestion:i(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},56657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});const o={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var o=n(74865),a=n.n(o);a().configure({showSpinner:!1});const c={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var o=n(87410),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:o}=t;globalThis.Prism=e,o.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(o.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(67294);const a={iconExternalLink:"iconExternalLink_nPIU"};function c(e){let{width:t=13.5,height:n=13.5}=e;return o.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},o.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},84173:(e,t,n)=>{"use strict";n.d(t,{Z:()=>pt});var o=n(67294),a=n(86010),c=n(44763),i=n(1944),s=n(87462),r=n(16550),d=n(95999),u=n(85936);const b="__docusaurus_skipToContent_fallback";function l(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,o.useRef)(null),{action:t}=(0,r.k6)(),n=(0,o.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(b);t&&l(t)}),[]);return(0,u.S)((n=>{let{location:o}=n;e.current&&!o.hash&&"PUSH"===t&&l(e.current)})),{containerRef:e,onClick:n}}const p=(0,d.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??p,{containerRef:n,onClick:a}=f();return o.createElement("div",{ref:n,role:"region","aria-label":p},o.createElement("a",(0,s.Z)({},e,{href:`#${b}`,onClick:a}),t))}var m=n(35281),w=n(19727);const h={skipToContent:"skipToContent_fXgn"};function _(){return o.createElement(g,{className:h.skipToContent})}var j=n(86668),y=n(59689);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:c=1.2,className:i,...r}=e;return o.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},r),o.createElement("g",{stroke:a,strokeWidth:c},o.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const x={closeButton:"closeButton_CVFx"};function v(e){return o.createElement("button",(0,s.Z)({type:"button","aria-label":(0,d.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",x.closeButton,e.className)}),o.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const C={content:"content_knG7"};function S(e){const{announcementBar:t}=(0,j.L)(),{content:n}=t;return o.createElement("div",(0,s.Z)({},e,{className:(0,a.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const E={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function D(){const{announcementBar:e}=(0,j.L)(),{isActive:t,close:n}=(0,y.nT)();if(!t)return null;const{backgroundColor:a,textColor:c,isCloseable:i}=e;return o.createElement("div",{className:E.announcementBar,style:{backgroundColor:a,color:c},role:"banner"},i&&o.createElement("div",{className:E.announcementBarPlaceholder}),o.createElement(S,{className:E.announcementBarContent}),i&&o.createElement(v,{onClick:n,className:E.announcementBarClose}))}var z=n(72961),T=n(12466);var P=n(902),L=n(13102);const A=o.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,z.e)(),t=(0,L.HY)(),[n,a]=(0,o.useState)(!1),c=null!==t.component,i=(0,P.D9)(c);return(0,o.useEffect)((()=>{c&&!i&&a(!0)}),[c,i]),(0,o.useEffect)((()=>{c?e.shown||a(!0):a(!1)}),[e.shown,c]),(0,o.useMemo)((()=>[n,a]),[n])}();return o.createElement(A.Provider,{value:n},t)}function R(e){if(e.component){const t=e.component;return o.createElement(t,e.props)}}function O(){const e=(0,o.useContext)(A);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,o.useCallback)((()=>n(!1)),[n]),c=(0,L.HY)();return(0,o.useMemo)((()=>({shown:t,hide:a,content:R(c)})),[a,c,t])}function I(e){let{header:t,primaryMenu:n,secondaryMenu:c}=e;const{shown:i}=O();return o.createElement("div",{className:"navbar-sidebar"},t,o.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},o.createElement("div",{className:"navbar-sidebar__item menu"},n),o.createElement("div",{className:"navbar-sidebar__item menu"},c)))}var M=n(92949),F=n(72389);function B(e){return o.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),o.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return o.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),o.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:c,onChange:i}=e;const s=(0,F.Z)(),r=(0,d.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===c?(0,d.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,d.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return o.createElement("div",{className:(0,a.Z)($.toggle,t)},o.createElement("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!s&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===c?"light":"dark"),disabled:!s,title:r,"aria-label":r,"aria-live":"polite"},o.createElement(B,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),o.createElement(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=o.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,j.L)().navbar.style,a=(0,j.L)().colorMode.disableSwitch,{colorMode:c,setColorMode:i}=(0,M.I)();return a?null:o.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:c,onChange:i})}var V=n(21327);function W(){return o.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,z.e)();return o.createElement("button",{type:"button","aria-label":(0,d.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},o.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return o.createElement("div",{className:"navbar-sidebar__brand"},o.createElement(W,null),o.createElement(Z,{className:"margin-right--md"}),o.createElement(Y,null))}var X=n(39960),Q=n(44996),J=n(13919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:c,label:i,html:r,isDropdownLink:d,prependBaseUrlToHref:u,...b}=e;const l=(0,Q.Z)(a),f=(0,Q.Z)(t),p=(0,Q.Z)(c,{forcePrependBaseUrl:!0}),g=i&&c&&!(0,J.Z)(c),m=r?{dangerouslySetInnerHTML:{__html:r}}:{children:o.createElement(o.Fragment,null,i,g&&o.createElement(te.Z,d&&{width:12,height:12}))};return c?o.createElement(X.Z,(0,s.Z)({href:u?p:c},b,m)):o.createElement(X.Z,(0,s.Z)({to:l,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},b,m))}function oe(e){let{className:t,isDropdownItem:n=!1,...c}=e;const i=o.createElement(ne,(0,s.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},c));return n?o.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...c}=e;return o.createElement("li",{className:"menu__list-item"},o.createElement(ne,(0,s.Z)({className:(0,a.Z)("menu__link",t)},c)))}function ce(e){let{mobile:t=!1,position:n,...a}=e;const c=t?ae:oe;return o.createElement(c,(0,s.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(86043),se=n(48596),re=n(52263);function de(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:c,onClick:i,...r}=e;const d=(0,o.useRef)(null),[u,b]=(0,o.useState)(!1);return(0,o.useEffect)((()=>{const e=e=>{d.current&&!d.current.contains(e.target)&&b(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[d]),o.createElement("div",{ref:d,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},o.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:r.to?void 0:"#",className:(0,a.Z)("navbar__link",c)},r,{onClick:r.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),b(!u))}}),r.children??r.label),o.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>o.createElement(Ee,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function be(e){let{items:t,className:n,position:c,onClick:i,...d}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,re.Z)(),{pathname:t}=(0,r.TH)();return t.replace(e,"/")}(),b=de(t,u),{collapsed:l,toggleCollapsed:f,setCollapsed:p}=(0,ie.u)({initialState:()=>!b});return(0,o.useEffect)((()=>{b&&p(!b)}),[u,b,p]),o.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":l})},o.createElement(ne,(0,s.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},d,{onClick:e=>{e.preventDefault(),f()}}),d.children??d.label),o.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:l},t.map(((e,t)=>o.createElement(Ee,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function le(e){let{mobile:t=!1,...n}=e;const a=t?be:ue;return o.createElement(a,n)}var fe=n(94711);function pe(e){let{width:t=20,height:n=20,...a}=e;return o.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),o.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var me=n(94184),we=n.n(me),he=n(28084);const _e=e=>{const t=(0,o.useRef)(!1),a=(0,o.useRef)(null),[c,i]=(0,o.useState)(!1),s=(0,r.k6)(),{siteConfig:d={}}=(0,re.Z)(),u=(0,F.Z)(),{baseUrl:b}=d,l=(0,he.eZ)("docusaurus-lunr-search"),f=()=>{t.current||(Promise.all([fetch(`${b}${l.fileNames.searchDoc}`).then((e=>e.json())),fetch(`${b}${l.fileNames.lunrIndex}`).then((e=>e.json())),Promise.all([n.e(84611),n.e(25684)]).then(n.bind(n,4734)),Promise.all([n.e(40532),n.e(32572)]).then(n.bind(n,32572))]).then((e=>{let[t,n,{default:o}]=e;0!==t.length&&(((e,t,n)=>{new n({searchDocs:e,searchIndex:t,baseUrl:b,inputSelector:"#search_input_react",handleSelected:(e,t,n)=>{const o=n.url||"/";document.createElement("a").href=o,s.push(o)}})})(t,n,o),i(!0))})),t.current=!0)},p=(0,o.useCallback)((t=>{a.current.contains(t.target)||a.current.focus(),e.handleSearchBarToggle&&e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]);return u&&f(),o.createElement("div",{className:"navbar__search",key:"search-box"},o.createElement("span",{"aria-label":"expand searchbar",role:"button",className:we()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:p,onKeyDown:p,tabIndex:0}),o.createElement("input",{id:"search_input_react",type:"search",placeholder:c?"Search":"Loading...","aria-label":"Search",className:we()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onClick:f,onMouseOver:f,onFocus:p,onBlur:p,ref:a,disabled:!c}))},je={searchBox:"searchBox_ZlJk"};function ye(e){let{children:t,className:n}=e;return o.createElement("div",{className:(0,a.Z)(n,je.searchBox)},t)}var ke=n(94104),xe=n(52802);var ve=n(60373);const Ce=e=>e.docs.find((t=>t.id===e.mainDocId));const Se={default:ce,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...c}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:b}}=(0,re.Z)(),l=(0,fe.l)(),{search:f,hash:p}=(0,r.TH)(),g=[...n,...u.map((e=>{const n=`${`pathname://${l.createUrl({locale:e,fullyQualified:!1})}`}${f}${p}`;return{label:b[e].label,lang:b[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],m=t?(0,d.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):b[i].label;return o.createElement(le,(0,s.Z)({},c,{mobile:t,label:o.createElement(o.Fragment,null,o.createElement(pe,{className:ge}),m),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:o.createElement(ye,{className:n},o.createElement(_e,null))},dropdown:le,html:function(e){let{value:t,className:n,mobile:c=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return o.createElement(s,{className:(0,a.Z)({navbar__item:!c&&!i,"menu__list-item":c},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...c}=e;const{activeDoc:i}=(0,ke.Iw)(a),r=(0,xe.vY)(t,a);return null===r?null:o.createElement(ce,(0,s.Z)({exact:!0},c,{isActive:()=>i?.path===r.path||!!i?.sidebar&&i.sidebar===r.sidebar,label:n??r.id,to:r.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...c}=e;const{activeDoc:i}=(0,ke.Iw)(a),r=(0,xe.oz)(t,a).link;if(!r)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return o.createElement(ce,(0,s.Z)({exact:!0},c,{isActive:()=>i?.sidebar===t,label:n??r.label,to:r.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...c}=e;const i=(0,xe.lO)(a)[0],r=t??i.label,d=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return o.createElement(ce,(0,s.Z)({},c,{label:r,to:d}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:c,dropdownItemsAfter:i,...u}=e;const{search:b,hash:l}=(0,r.TH)(),f=(0,ke.Iw)(n),p=(0,ke.gB)(n),{savePreferredVersionName:g}=(0,ve.J)(n),m=[...c,...p.map((e=>{const t=f.alternateDocVersions[e.name]??Ce(e);return{label:e.label,to:`${t.path}${b}${l}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...i],w=(0,xe.lO)(n)[0],h=t&&m.length>1?(0,d.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):w.label,_=t&&m.length>1?void 0:Ce(w).path;return m.length<=1?o.createElement(ce,(0,s.Z)({},u,{mobile:t,label:h,to:_,isActive:a?()=>!1:void 0})):o.createElement(le,(0,s.Z)({},u,{mobile:t,label:h,to:_,items:m,isActive:a?()=>!1:void 0}))}};function Ee(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),c=Se[a];if(!c)throw new Error(`No NavbarItem component found for type "${t}".`);return o.createElement(c,n)}function De(){const e=(0,z.e)(),t=(0,j.L)().navbar.items;return o.createElement("ul",{className:"menu__list"},t.map(((t,n)=>o.createElement(Ee,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function ze(e){return o.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),o.createElement(d.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Te(){const e=0===(0,j.L)().navbar.items.length,t=O();return o.createElement(o.Fragment,null,!e&&o.createElement(ze,{onClick:()=>t.hide()}),t.content)}function Pe(){const e=(0,z.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,o.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?o.createElement(I,{header:o.createElement(K,null),primaryMenu:o.createElement(De,null),secondaryMenu:o.createElement(Te,null)}):null}const Le={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ae(e){return o.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:c}}=(0,j.L)(),i=(0,z.e)(),{navbarRef:s,isNavbarVisible:r}=function(e){const[t,n]=(0,o.useState)(e),a=(0,o.useRef)(!1),c=(0,o.useRef)(0),i=(0,o.useCallback)((e=>{null!==e&&(c.current=e.getBoundingClientRect().height)}),[]);return(0,T.RF)(((t,o)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+d{if(!e)return;const o=t.location.hash;if(o?document.getElementById(o.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return o.createElement("nav",{ref:s,"aria-label":(0,d.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Le.navbarHideable,!r&&Le.navbarHidden],{"navbar--dark":"dark"===c,"navbar--primary":"primary"===c,"navbar-sidebar--show":i.shown})},t,o.createElement(Ae,{onClick:i.toggle}),o.createElement(Pe,null))}var Re=n(18780);const Oe={errorBoundaryError:"errorBoundaryError_a6uf"};function Ie(e){return o.createElement("button",(0,s.Z)({type:"button"},e),o.createElement(d.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Me(e){let{error:t}=e;const n=(0,Re.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return o.createElement("p",{className:Oe.errorBoundaryError},n)}class Fe extends o.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Be="right";function Ue(e){let{width:t=30,height:n=30,className:a,...c}=e;return o.createElement("svg",(0,s.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},c),o.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function $e(){const{toggle:e,shown:t}=(0,z.e)();return o.createElement("button",{onClick:e,"aria-label":(0,d.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},o.createElement(Ue,null))}const qe={colorModeToggle:"colorModeToggle_DEke"};function He(e){let{items:t}=e;return o.createElement(o.Fragment,null,t.map(((e,t)=>o.createElement(Fe,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},o.createElement(Ee,e)))))}function Ge(e){let{left:t,right:n}=e;return o.createElement("div",{className:"navbar__inner"},o.createElement("div",{className:"navbar__items"},t),o.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ze(){const e=(0,z.e)(),t=(0,j.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Be)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),c=t.find((e=>"search"===e.type));return o.createElement(Ge,{left:o.createElement(o.Fragment,null,!e.disabled&&o.createElement($e,null),o.createElement(W,null),o.createElement(He,{items:n})),right:o.createElement(o.Fragment,null,o.createElement(He,{items:a}),o.createElement(Z,{className:qe.colorModeToggle}),!c&&o.createElement(ye,null,o.createElement(_e,null)))})}function Ve(){return o.createElement(Ne,null,o.createElement(Ze,null))}function We(e){let{item:t}=e;const{to:n,href:a,label:c,prependBaseUrlToHref:i,...r}=t,d=(0,Q.Z)(n),u=(0,Q.Z)(a,{forcePrependBaseUrl:!0});return o.createElement(X.Z,(0,s.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:d},r),c,a&&!(0,J.Z)(a)&&o.createElement(te.Z,null))}function Ye(e){let{item:t}=e;return t.html?o.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):o.createElement("li",{key:t.href??t.to,className:"footer__item"},o.createElement(We,{item:t}))}function Ke(e){let{column:t}=e;return o.createElement("div",{className:"col footer__col"},o.createElement("div",{className:"footer__title"},t.title),o.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>o.createElement(Ye,{key:t,item:e})))))}function Xe(e){let{columns:t}=e;return o.createElement("div",{className:"row footer__links"},t.map(((e,t)=>o.createElement(Ke,{key:t,column:e}))))}function Qe(){return o.createElement("span",{className:"footer__link-separator"},"\xb7")}function Je(e){let{item:t}=e;return t.html?o.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):o.createElement(We,{item:t})}function et(e){let{links:t}=e;return o.createElement("div",{className:"footer__links text--center"},o.createElement("div",{className:"footer__links"},t.map(((e,n)=>o.createElement(o.Fragment,{key:n},o.createElement(Je,{item:e}),t.length!==n+1&&o.createElement(Qe,null))))))}function tt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?o.createElement(Xe,{columns:t}):o.createElement(et,{links:t})}var nt=n(50941);const ot={footerLogoLink:"footerLogoLink_BH7S"};function at(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),c={light:n(t.src),dark:n(t.srcDark??t.src)};return o.createElement(nt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:c,width:t.width,height:t.height,style:t.style})}function ct(e){let{logo:t}=e;return t.href?o.createElement(X.Z,{href:t.href,className:ot.footerLogoLink,target:t.target},o.createElement(at,{logo:t})):o.createElement(at,{logo:t})}function it(e){let{copyright:t}=e;return o.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function st(e){let{style:t,links:n,logo:c,copyright:i}=e;return o.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},o.createElement("div",{className:"container container-fluid"},n,(c||i)&&o.createElement("div",{className:"footer__bottom text--center"},c&&o.createElement("div",{className:"margin-bottom--sm"},c),i)))}function rt(){const{footer:e}=(0,j.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:c}=e;return o.createElement(st,{style:c,links:n&&n.length>0&&o.createElement(tt,{links:n}),logo:a&&o.createElement(ct,{logo:a}),copyright:t&&o.createElement(it,{copyright:t})})}const dt=o.memo(rt),ut=(0,P.Qc)([M.S,y.pl,T.OC,ve.L5,i.VC,function(e){let{children:t}=e;return o.createElement(L.n2,null,o.createElement(z.M,null,o.createElement(N,null,t)))}]);function bt(e){let{children:t}=e;return o.createElement(ut,null,t)}function lt(e){let{error:t,tryAgain:n}=e;return o.createElement("main",{className:"container margin-vert--xl"},o.createElement("div",{className:"row"},o.createElement("div",{className:"col col--6 col--offset-3"},o.createElement("h1",{className:"hero__title"},o.createElement(d.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),o.createElement("div",{className:"margin-vert--lg"},o.createElement(Ie,{onClick:n,className:"button button--primary shadow--lw"})),o.createElement("hr",null),o.createElement("div",{className:"margin-vert--md"},o.createElement(Me,{error:t})))))}const ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:s,title:r,description:d}=e;return(0,w.t)(),o.createElement(bt,null,o.createElement(i.d,{title:r,description:d}),o.createElement(_,null),o.createElement(D,null),o.createElement(Ve,null),o.createElement("div",{id:b,className:(0,a.Z)(m.k.wrapper.main,ft.mainWrapper,s)},o.createElement(c.Z,{fallback:e=>o.createElement(lt,e)},t)),!n&&o.createElement(dt,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>b});var o=n(87462),a=n(67294),c=n(39960),i=n(44996),s=n(52263),r=n(86668),d=n(50941);function u(e){let{logo:t,alt:n,imageClassName:o}=e;const c={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},s=a.createElement(d.Z,{className:t.className,sources:c,height:t.height,width:t.width,alt:n,style:t.style});return o?a.createElement("div",{className:o},s):s}function b(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:d}}=(0,r.L)(),{imageClassName:b,titleClassName:l,...f}=e,p=(0,i.Z)(d?.href||"/"),g=n?"":t,m=d?.alt??g;return a.createElement(c.Z,(0,o.Z)({to:p},f,d?.target&&{target:d.target}),d&&a.createElement(u,{logo:d,alt:m,imageClassName:b}),null!=n&&a.createElement("b",{className:l},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(67294),a=n(35742);function c(e){let{locale:t,version:n,tag:c}=e;const i=t;return o.createElement(a.Z,null,t&&o.createElement("meta",{name:"docusaurus_locale",content:t}),n&&o.createElement("meta",{name:"docusaurus_version",content:n}),c&&o.createElement("meta",{name:"docusaurus_tag",content:c}),i&&o.createElement("meta",{name:"docsearch:language",content:i}),n&&o.createElement("meta",{name:"docsearch:version",content:n}),c&&o.createElement("meta",{name:"docsearch:docusaurus_tag",content:c}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var o=n(87462),a=n(67294),c=n(86010),i=n(72389),s=n(92949);const r={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function d(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:d,className:u,alt:b,...l}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,o.Z)({key:e,src:d[e],alt:b,className:(0,c.Z)(r.themedImage,r[`themedImage--${e}`],u)},l)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>r,z:()=>m});var o=n(87462),a=n(67294),c=n(10412),i=n(91442);const s="ease-in-out";function r(e){let{initialState:t}=e;const[n,o]=(0,a.useState)(t??!1),c=(0,a.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:c}}const d={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function b(e,t){const n=t?d:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function l(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const c=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??s}`,height:`${t}px`}}function r(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!c.current)return b(e,n),void(c.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(r(),requestAnimationFrame((()=>{e.style.height=d.height,e.style.overflow=d.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{r()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function f(e){if(!c.Z.canUseDOM)return e?d:u}function p(e){let{as:t="div",collapsed:n,children:o,animation:c,onCollapseTransitionEnd:i,className:s,disableSSRStyle:r}=e;const d=(0,a.useRef)(null);return l({collapsibleRef:d,collapsed:n,animation:c}),a.createElement(t,{ref:d,style:r?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(b(d.current,n),i?.(n))},className:s},o)}function g(e){let{collapsed:t,...n}=e;const[c,i]=(0,a.useState)(!t),[s,r]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{c&&r(t)}),[c,t]),c?a.createElement(p,(0,o.Z)({},n,{collapsed:s})):null}function m(e){let{lazy:t,...n}=e;const o=t?g:p;return a.createElement(o,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>p,pl:()=>f});var o=n(67294),a=n(72389),c=n(50012),i=n(902),s=n(86668);const r=(0,c.WA)("docusaurus.announcement.dismiss"),d=(0,c.WA)("docusaurus.announcement.id"),u=()=>"true"===r.get(),b=e=>r.set(String(e)),l=o.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,c]=(0,o.useState)((()=>!!t&&u()));(0,o.useEffect)((()=>{c(u())}),[]);const i=(0,o.useCallback)((()=>{b(!0),c(!0)}),[]);return(0,o.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=d.get();"annoucement-bar"===n&&(n="announcement-bar");const o=t!==n;d.set(t),o&&b(!1),!o&&u()||c(!1)}),[e]),(0,o.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return o.createElement(l.Provider,{value:n},t)}function p(){const e=(0,o.useContext)(l);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>m,S:()=>g});var o=n(67294),a=n(10412),c=n(902),i=n(50012),s=n(86668);const r=o.createContext(void 0),d="theme",u=(0,i.WA)(d),b={light:"light",dark:"dark"},l=e=>e===b.dark?b.dark:b.light,f=e=>a.Z.canUseDOM?l(document.documentElement.getAttribute("data-theme")):l(e),p=e=>{u.set(l(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,c]=(0,o.useState)(f(e));(0,o.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,o.useCallback)((function(t,o){void 0===o&&(o={});const{persist:a=!0}=o;t?(c(t),a&&p(t)):(c(n?window.matchMedia("(prefers-color-scheme: dark)").matches?b.dark:b.light:e),u.del())}),[n,e]);(0,o.useEffect)((()=>{document.documentElement.setAttribute("data-theme",l(a))}),[a]),(0,o.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==d)return;const t=u.get();null!==t&&i(l(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const r=(0,o.useRef)(!1);return(0,o.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),o=()=>{window.matchMedia("print").matches||r.current?r.current=window.matchMedia("print").matches:i(null)};return e.addListener(o),()=>e.removeListener(o)}),[i,t,n]),(0,o.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===b.dark},setLightTheme(){i(b.light)},setDarkTheme(){i(b.dark)}})),[a,i])}();return o.createElement(r.Provider,{value:n},t)}function m(){const e=(0,o.useContext)(r);if(null==e)throw new c.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>h,L5:()=>m});var o=n(67294),a=n(94104),c=n(29935),i=n(86668),s=n(52802),r=n(902),d=n(50012);const u=e=>`docs-preferred-version-${e}`,b={save:(e,t,n)=>{(0,d.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,d.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,d.WA)(u(e),{persistence:t}).del()}},l=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=o.createContext(null);function p(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,o.useMemo)((()=>Object.keys(e)),[e]),[c,s]=(0,o.useState)((()=>l(n)));(0,o.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:o}=e;function a(e){const t=b.read(e,n);return o[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(b.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[c,(0,o.useMemo)((()=>({savePreferredVersion:function(e,n){b.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=p();return o.createElement(f.Provider,{value:n},t)}function m(e){let{children:t}=e;return s.cE?o.createElement(g,null,t):o.createElement(o.Fragment,null,t)}function w(){const e=(0,o.useContext)(f);if(!e)throw new r.i6("DocsPreferredVersionContextProvider");return e}function h(e){void 0===e&&(e=c.m);const t=(0,a.zh)(e),[n,i]=w(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,o.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>r,b:()=>s});var o=n(67294),a=n(902);const c=Symbol("EmptyContext"),i=o.createContext(c);function s(e){let{children:t,name:n,items:a}=e;const c=(0,o.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return o.createElement(i.Provider,{value:c},t)}function r(){const e=(0,o.useContext)(i);if(e===c)throw new a.i6("DocsSidebarProvider");return e}},72961:(e,t,n)=>{"use strict";n.d(t,{M:()=>l,e:()=>f});var o=n(67294),a=n(13102),c=n(87524),i=n(16550),s=(n(61688),n(902));function r(e){!function(e){const t=(0,i.k6)(),n=(0,s.zX)(e);(0,o.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var d=n(86668);const u=o.createContext(void 0);function b(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,d.L)().navbar;return 0===t.length&&!e.component}(),t=(0,c.i)(),n=!e&&"mobile"===t,[i,s]=(0,o.useState)(!1);r((()=>{if(i)return s(!1),!1}));const u=(0,o.useCallback)((()=>{s((e=>!e))}),[]);return(0,o.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,o.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function l(e){let{children:t}=e;const n=b();return o.createElement(u.Provider,{value:n},t)}function f(){const e=o.useContext(u);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>r,n2:()=>i});var o=n(67294),a=n(902);const c=o.createContext(null);function i(e){let{children:t}=e;const n=(0,o.useState)({component:null,props:null});return o.createElement(c.Provider,{value:n},t)}function s(){const e=(0,o.useContext)(c);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function r(e){let{component:t,props:n}=e;const i=(0,o.useContext)(c);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,r=(0,a.Ql)(n);return(0,o.useEffect)((()=>{s({component:t,props:r})}),[s,t,r]),(0,o.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>c});var o=n(67294);const a="navigation-with-keyboard";function c(){(0,o.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>d});var o=n(67294),a=n(10412);const c={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return a.Z.canUseDOM?window.innerWidth>i?c.desktop:c.mobile:c.ssr}const r=!1;function d(){const[e,t]=(0,o.useState)((()=>r?"ssr":s()));return(0,o.useEffect)((()=>{function e(){t(s())}const n=r?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>o});const o={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},91442:(e,t,n)=>{"use strict";function o(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>o})},52802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>l,_F:()=>g,cE:()=>b,hI:()=>y,lO:()=>h,vY:()=>j,oz:()=>_,s1:()=>w});var o=n(67294),a=n(16550),c=n(18790),i=n(94104),s=n(60373),r=n(1116);function d(e){return Array.from(new Set(e))}var u=n(48596);const b=!!i._r;function l(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=l(t);if(e)return e}}}const f=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),p=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||p(e.items,t))}function m(e){let{sidebarItems:t,pathname:n,onlyCategories:o=!1}=e;const a=[];return function e(t){for(const c of t)if("category"===c.type&&((0,u.Mg)(c.href,n)||e(c.items))||"link"===c.type&&(0,u.Mg)(c.href,n)){return o&&"category"!==c.type||a.unshift(c),!0}return!1}(t),a}function w(){const e=(0,r.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?m({sidebarItems:e.items,pathname:t}):null}function h(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,o.useMemo)((()=>d([t,n,a].filter(Boolean))),[t,n,a])}function _(e,t){const n=h(t);return(0,o.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),o=t.find((t=>t[0]===e));if(!o)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return o[1]}),[e,n])}function j(e,t){const n=h(t);return(0,o.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),o=t.find((t=>t.id===e));if(!o){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${d(t.map((e=>e.id))).join("\n- ")}`)}return o}),[e,n])}function y(e){let{route:t,versionMetadata:n}=e;const o=(0,a.TH)(),i=t.routes,s=i.find((e=>(0,a.LX)(o.pathname,e)));if(!s)return null;const r=s.sidebar,d=r?n.docsSidebars[r]:void 0;return{docElement:(0,c.H)(i),sidebarName:r,sidebarItems:d}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>l,d:()=>u,VC:()=>f});var o=n(67294),a=n(86010),c=n(35742),i=n(30226);function s(){const e=o.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var r=n(44996),d=n(52263);function u(e){let{title:t,description:n,keywords:a,image:i,children:s}=e;const u=function(e){const{siteConfig:t}=(0,d.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}(t),{withBaseUrl:b}=(0,r.C)(),l=i?b(i,{absolute:!0}):void 0;return o.createElement(c.Z,null,t&&o.createElement("title",null,u),t&&o.createElement("meta",{property:"og:title",content:u}),n&&o.createElement("meta",{name:"description",content:n}),n&&o.createElement("meta",{property:"og:description",content:n}),a&&o.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),l&&o.createElement("meta",{property:"og:image",content:l}),l&&o.createElement("meta",{name:"twitter:image",content:l}),s)}const b=o.createContext(void 0);function l(e){let{className:t,children:n}=e;const i=o.useContext(b),s=(0,a.Z)(i,t);return o.createElement(b.Provider,{value:s},o.createElement(c.Z,null,o.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),c=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return o.createElement(l,{className:(0,a.Z)(c,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>d,Ql:()=>r,i6:()=>s,zX:()=>c});var o=n(67294);const a=n(10412).Z.canUseDOM?o.useLayoutEffect:o.useEffect;function c(e){const t=(0,o.useRef)(e);return a((()=>{t.current=e}),[e]),(0,o.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,o.useRef)();return a((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function r(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,o.useMemo)((()=>e),t.flat())}function d(e){return t=>{let{children:n}=t;return o.createElement(o.Fragment,null,e.reduceRight(((e,t)=>o.createElement(t,null,e)),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var o=n(67294),a=n(723),c=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,c.Z)().siteConfig;return(0,o.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function o(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(o)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>l,OC:()=>r,RF:()=>b});var o=n(67294),a=n(10412),c=n(72389),i=n(902);const s=o.createContext(void 0);function r(e){let{children:t}=e;const n=function(){const e=(0,o.useRef)(!0);return(0,o.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return o.createElement(s.Provider,{value:n},t)}function d(){const e=(0,o.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function b(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),a=(0,o.useRef)(u()),c=(0,i.zX)(e);(0,o.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();c(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[c,n,...t])}function l(){const e=(0,o.useRef)(null),t=(0,c.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function o(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>o,os:()=>a});n(52263);const o="default";function a(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{WA:()=>r});n(67294),n(61688);const o="localStorage";function a(e){let{key:t,oldValue:n,newValue:o,storage:a}=e;if(n===o)return;const c=document.createEvent("StorageEvent");c.initStorageEvent("storage",!1,!1,t,n,o,window.location.href,a),window.dispatchEvent(c)}function c(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function r(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=c(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const o=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:o,newValue:t,storage:n})}catch(o){console.error(`Docusaurus storage error, can't set ${e}=${t}`,o)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const o=o=>{o.storageArea===n&&o.key===e&&t(o)};return window.addEventListener("storage",o),()=>window.removeEventListener("storage",o)}catch(o){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,o),()=>{}}}}}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>c});var o=n(52263),a=n(16550);function c(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:c}}=(0,o.Z)(),{pathname:i}=(0,a.TH)(),s=c===n?e:e.replace(`/${c}/`,"/"),r=i.replace(e,"");return{createUrl:function(e){let{locale:o,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${s}`:`${s}${e}/`}(o)}${r}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var o=n(67294),a=n(16550),c=n(902);function i(e){const t=(0,a.TH)(),n=(0,c.D9)(t),i=(0,c.zX)(e);(0,o.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var o=n(52263);function a(){return(0,o.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:o}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),c="/"===a||a===o?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,c)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},18780:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return o(a).default}});var c=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return c.getErrorCausalChain}})},94184:(e,t)=>{var n;!function(){"use strict";var o={}.hasOwnProperty;function a(){for(var e=[],t=0;t{"use strict";function o(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>j,q_:()=>S,ob:()=>f,PP:()=>D,Ep:()=>l});var o=n(87462);function a(e){return"/"===e.charAt(0)}function c(e,t){for(var n=t,o=n+1,a=e.length;o=0;l--){var f=i[l];"."===f?c(i,l):".."===f?(c(i,l),b++):b&&(c(i,l),b--)}if(!d)for(;b--;b)i.unshift("..");!d||""===i[0]||i[0]&&a(i[0])||i.unshift("");var p=i.join("/");return n&&"/"!==p.substr(-1)&&(p+="/"),p};var s=n(38776);function r(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function b(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function l(e){var t=e.pathname,n=e.search,o=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),o&&"#"!==o&&(a+="#"===o.charAt(0)?o:"#"+o),a}function f(e,t,n,a){var c;"string"==typeof e?(c=function(e){var t=e||"/",n="",o="",a=t.indexOf("#");-1!==a&&(o=t.substr(a),t=t.substr(0,a));var c=t.indexOf("?");return-1!==c&&(n=t.substr(c),t=t.substr(0,c)),{pathname:t,search:"?"===n?"":n,hash:"#"===o?"":o}}(e),c.state=t):(void 0===(c=(0,o.Z)({},e)).pathname&&(c.pathname=""),c.search?"?"!==c.search.charAt(0)&&(c.search="?"+c.search):c.search="",c.hash?"#"!==c.hash.charAt(0)&&(c.hash="#"+c.hash):c.hash="",void 0!==t&&void 0===c.state&&(c.state=t));try{c.pathname=decodeURI(c.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+c.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(c.key=n),a?c.pathname?"/"!==c.pathname.charAt(0)&&(c.pathname=i(c.pathname,a.pathname)):c.pathname=a.pathname:c.pathname||(c.pathname="/"),c}function p(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,o,a){if(null!=e){var c="function"==typeof e?e(t,n):e;"string"==typeof c?"function"==typeof o?o(c,a):a(!0):a(!1!==c)}else a(!0)},appendListener:function(e){var n=!0;function o(){n&&e.apply(void 0,arguments)}return t.push(o),function(){n=!1,t=t.filter((function(e){return e!==o}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),o=0;ot?n.splice(t,n.length-t,a):n.push(a),b({action:o,location:a,index:t,entries:n})}}))},replace:function(e,t){var o="REPLACE",a=f(e,t,g(),j.location);u.confirmTransitionTo(a,o,n,(function(e){e&&(j.entries[j.index]=a,b({action:o,location:a}))}))},go:_,goBack:function(){_(-1)},goForward:function(){_(1)},canGo:function(e){var t=j.index+e;return t>=0&&t{"use strict";var o=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},c={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function r(e){return o.isMemo(e)?i:s[e.$$typeof]||a}s[o.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[o.Memo]=i;var d=Object.defineProperty,u=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,l=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,p=Object.prototype;e.exports=function e(t,n,o){if("string"!=typeof n){if(p){var a=f(n);a&&a!==p&&e(t,a,o)}var i=u(n);b&&(i=i.concat(b(n)));for(var s=r(t),g=r(n),m=0;m{"use strict";e.exports=function(e,t,n,o,a,c,i,s){if(!e){var r;if(void 0===t)r=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[n,o,a,c,i,s],u=0;(r=new Error(t.replace(/%s/g,(function(){return d[u++]})))).name="Invariant Violation"}throw r.framesToPop=1,r}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var o,a;o=function(){var e,t,n={version:"0.2.0"},o=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function c(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===o.positionUsing?{transform:"translate3d("+c(e)+"%,0,0)"}:"translate"===o.positionUsing?{transform:"translate("+c(e)+"%,0)"}:{"margin-left":c(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(o[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,o.minimum,1),n.status=1===e?null:e;var c=n.render(!t),d=c.querySelector(o.barSelector),u=o.speed,b=o.easing;return c.offsetWidth,s((function(t){""===o.positionUsing&&(o.positionUsing=n.getPositioningCSS()),r(d,i(e,u,b)),1===e?(r(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){r(c,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),o.trickleSpeed)};return o.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*o.trickleRate)},e=0,t=0,n.promise=function(o){return o&&"resolved"!==o.state()?(0===t&&n.start(),e++,t++,o.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=o.template;var a,i=t.querySelector(o.barSelector),s=e?"-100":c(n.status||0),d=document.querySelector(o.parent);return r(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),o.showSpinner||(a=t.querySelector(o.spinnerSelector))&&f(a),d!=document.body&&u(d,"nprogress-custom-parent"),d.appendChild(t),t},n.remove=function(){b(document.documentElement,"nprogress-busy"),b(document.querySelector(o.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),r=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function o(t){var n=document.body.style;if(t in n)return t;for(var o,a=e.length,c=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((o=e[a]+c)in n)return o;return t}function a(e){return e=n(e),t[e]||(t[e]=o(e))}function c(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,o,a=arguments;if(2==a.length)for(n in t)void 0!==(o=t[n])&&t.hasOwnProperty(n)&&c(e,n,o);else c(e,a[1],a[2])}}();function d(e,t){return("string"==typeof e?e:l(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=l(e),o=n+t;d(n,t)||(e.className=o.substring(1))}function b(e,t){var n,o=l(e);d(e,t)&&(n=o.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function l(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof o?o.call(t,n,t,e):o)||(e.exports=a)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach((function(e){o[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var c,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),r=1;r{var o=n(5826);e.exports=f,e.exports.parse=c,e.exports.compile=function(e,t){return s(c(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=l;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function c(e,t){for(var n,o=[],c=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var b=n[0],l=n[1],f=n.index;if(s+=e.slice(i,f),i=f+b.length,l)s+=l[1];else{var p=e[i],g=n[2],m=n[3],w=n[4],h=n[5],_=n[6],j=n[7];s&&(o.push(s),s="");var y=null!=g&&null!=p&&p!==g,k="+"===_||"*"===_,x="?"===_||"*"===_,v=n[2]||u,C=w||h;o.push({name:m||c++,prefix:g||"",delimiter:v,optional:x,repeat:k,partial:y,asterisk:!!j,pattern:C?d(C):j?".*":"[^"+r(v)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>c});var o=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},o={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=b.reach);x+=k.value.length,k=k.next){var v=k.value;if(t.length>e.length)return;if(!(v instanceof a)){var C,S=1;if(h){if(!(C=c(y,x,e,w))||C.index>=e.length)break;var E=C.index,D=C.index+C[0].length,z=x;for(z+=k.value.length;E>=z;)z+=(k=k.next).value.length;if(x=z-=k.value.length,k.value instanceof a)continue;for(var T=k;T!==t.tail&&(zb.reach&&(b.reach=N);var R=k.prev;if(L&&(R=r(t,R,L),x+=L.length),d(t,R,S),k=r(t,R,new a(l,m?o.tokenize(P,m):P,_,P)),A&&r(t,k,A),S>1){var O={cause:l+","+p,reach:N};i(e,t,n,k.prev,x,O),b&&O.reach>b.reach&&(b.reach=O.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function r(e,t,n){var o=t.next,a={value:n,prev:t,next:o};return t.next=a,o.prev=a,e.length++,a}function d(e,t,n){for(var o=t.next,a=0;a"+c.content+""},o}(),a=o;o.default=o,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:n}};o["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var c={};c[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:o},a.languages.insertBefore("markup","cdata",c)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],c=o.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var o={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:o,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:o,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,o="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),c=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return o})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return o}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return o})).replace(/<>/g,(function(){return"(?:"+a+"|"+c+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(c),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var o=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return o})),c=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+c+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+c+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(o),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+c+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(o),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,o=t.length;n",quot:'"'},r=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=l(/^\{$/,/^\}$/);if(-1===s)continue;for(var r=n;r=0&&f(d,"variable-input")}}}}function u(e){return t[n+e]}function b(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,o=t.inside.interpolation,a=o.inside["interpolation-punctuation"],c=o.pattern.source;function i(t,o){if(e.languages[t])return{pattern:RegExp("((?:"+o+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function r(t,n,o){var a={code:t,grammar:n,language:o};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function d(t){var n={};n["interpolation-punctuation"]=a;var c=e.tokenize(t,n);if(3===c.length){var i=[1,1];i.push.apply(i,r(c[1],e.languages.javascript,"javascript")),c.splice.apply(c,i)}return new e.Token("interpolation",c,o.alias,t)}function u(t,n,o){var a=e.tokenize(t,{interpolation:{pattern:RegExp(c),lookbehind:!0}}),i=0,u={},b=r(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(i++,o)););return u[n]=a,n})).join(""),n,o),l=Object.keys(u);return i=0,function e(t){for(var n=0;n=l.length)return;var o=t[n];if("string"==typeof o||"string"==typeof o.content){var a=l[i],c="string"==typeof o?o:o.content,s=c.indexOf(a);if(-1!==s){++i;var r=c.substring(0,s),b=d(u[a]),f=c.substring(s+a.length),p=[];if(r&&p.push(r),p.push(b),f){var g=[f];e(g),p.push.apply(p,g)}"string"==typeof o?(t.splice.apply(t,[n,1].concat(p)),n+=p.length-1):o.content=p}}else{var m=o.content;Array.isArray(m)?e(m):e([m])}}}(b),new e.Token(o,b,"language-"+o,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var b={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function l(e){return"string"==typeof e?e:Array.isArray(e)?e.map(l).join(""):l(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in b&&function t(n){for(var o=0,a=n.length;o]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],o=0;o*\.{3}(?:[^{}]|)*\})/.source;function c(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return o})).replace(//g,(function(){return a})),RegExp(e,t)}a=c(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=c(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:c(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:c(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],o=0;o0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:c=!0),(c||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var r=i(a);o0&&("string"==typeof t[o-1]||"plain-text"===t[o-1].type)&&(r=i(t[o-1])+r,t.splice(o-1,1),o--),t[o]=new e.Token("plain-text",r,null,r)}a.content&&"string"!=typeof a.content&&s(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var o=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+o+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,o,a,c){if(n.language===o){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof c&&!c(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(o,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,o){if(n.language===o&&n.tokenStack){n.grammar=e.languages[o];var a=0,c=Object.keys(n.tokenStack);!function i(s){for(var r=0;r=c.length);r++){var d=s[r];if("string"==typeof d||d.content&&"string"==typeof d.content){var u=c[a],b=n.tokenStack[u],l="string"==typeof d?d:d.content,f=t(o,u),p=l.indexOf(f);if(p>-1){++a;var g=l.substring(0,p),m=new e.Token(o,e.tokenize(b,n.grammar),"language-"+o,b),w=l.substring(p+f.length),h=[];g&&h.push.apply(h,i([g])),h.push(m),w&&h.push.apply(h,i([w])),"string"==typeof d?s.splice.apply(s,[r,1].concat(h)):d.content=h}}else d.content&&i(d.content)}return s}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},o={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};o.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:o}},o.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:o}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:o}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:o}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:o}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:o.interpolation}},rest:o}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:o.interpolation,comment:o.comment,punctuation:/[{},]/}},func:o.func,string:o.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:o.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const c=a},29901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const o=n(29901),a=n(39642),c=new Set;function i(e){void 0===e?e=Object.keys(o.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...c,...Object.keys(Prism.languages)];a(o,e,t).load((e=>{if(!(e in o.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),c.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var o={"./":2885};function a(e){var t=c(e);return n(t)}function c(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}a.keys=function(){return Object.keys(o)},a.resolve=c,e.exports=a,a.id=6726},16500:(e,t,n)=>{var o={"./":2885};function a(e){var t=c(e);return n(t)}function c(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}a.keys=function(){return Object.keys(o)},a.resolve=c,e.exports=a,a.id=16500},39642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,o=e.length;n "));var s={},r=e[o];if(r){function d(t){if(!(t in e))throw new Error(o+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,c),s[t]=!0,n[t])s[i]=!0}t(r.require,d),t(r.optional,d),t(r.modify,d)}n[o]=s,c.pop()}}return function(e){var t=n[e];return t||(a(e,o),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(c,i,s){var r=function(e){var t={};for(var n in e){var o=e[n];for(var a in o)if("meta"!=a){var c=o[a];t[a]="string"==typeof c?{title:c}:c}}return t}(c),d=function(e){var n;return function(o){if(o in e)return o;if(!n)for(var a in n={},e){var c=e[a];t(c&&c.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[o]||o}}(r);i=i.map(d),s=(s||[]).map(d);var u=n(i),b=n(s);i.forEach((function e(n){var o=r[n];t(o&&o.require,(function(t){t in b||(u[t]=!0,e(t))}))}));for(var l,f=o(r),p=u;a(p);){for(var g in l={},p){var m=r[g];t(m&&m.modify,(function(e){e in b&&(l[e]=!0)}))}for(var w in b)if(!(w in u))for(var h in f(w))if(h in u){l[w]=!0;break}for(var _ in p=l)u[_]=!0}var j={getIds:function(){var e=[];return j.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,o,a){var c=a?a.series:void 0,i=a?a.parallel:e,s={},r={};function d(e){if(e in s)return s[e];r[e]=!0;var a,u=[];for(var b in t(e))b in n&&u.push(b);if(0===u.length)a=o(e);else{var l=i(u.map((function(e){var t=d(e);return delete r[e],t})));c?a=c(l,(function(){return o(e)})):o(e)}return s[e]=a}for(var u in n)d(u);var b=[];for(var l in r)b.push(s[l]);return i(b)}(f,u,t,n)}};return j}}();e.exports=t},92703:(e,t,n)=>{"use strict";var o=n(50414);function a(){}function c(){}c.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,c,i){if(i!==o){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:c,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var o=n(67294),a=n(27418),c=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n