{"id":68060,"date":"2019-07-12T04:19:10","date_gmt":"2019-07-12T11:19:10","guid":{"rendered":"http:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/"},"modified":"2019-07-12T04:19:10","modified_gmt":"2019-07-12T11:19:10","slug":"improve-your-javascript-knowledge-by-reading-source-code","status":"publish","type":"post","link":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/","title":{"rendered":"Improve Your JavaScript Knowledge By Reading Source Code"},"content":{"rendered":"<link rel=\"canonical\" href=\"https:\/\/www.smashingmagazine.com\/2019\/07\/javascript-knowledge-reading-source-code\/\"><title>Improve Your JavaScript Knowledge By Reading Source Code<\/title><\/p>\n<article>\n<header>\n<h1>Improve Your JavaScript Knowledge By Reading Source Code<\/h1>\n<address>Carl Mungazi<\/address>\n<p>                  <time datetime=\"2019-07-12T12:30:59+02:00\">2019-07-12T12:30:59+02:00<\/time><time datetime=\"2019-07-12T11:06:35+00:00\">2019-07-12T11:06:35+00:00<\/time><\/header>\n<p>Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago.<\/p>\n<p>We had just finished rewriting an internal legacy framework we used to create e-learning courses. At the beginning of the rewrite, we had spent time investigating a number of different solutions including Mithril, Inferno, Angular, React, Aurelia, Vue, and Polymer. As I was very much a beginner (I had just switched from journalism to web development), I remember feeling intimidated by the complexity of each framework and not understanding how each one worked.<\/p>\n<p>My understanding grew when I began investigating our chosen framework, Mithril, in greater depth. Since then, my knowledge of JavaScript \u2014 and programming in general \u2014 has been greatly helped by the hours I have spent digging deep into the guts of the libraries I use daily either at work or in my own projects. In this post, I will share some of the ways you can take your favorite library or framework and use it as an educational tool.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a94d53ac-c580-4a50-846d-74d997c484d9\/2-improve-your-javascript-knowledge-by-reading-source-code.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/2-improve-your-javascript-knowledge-by-reading-source-code.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a94d53ac-c580-4a50-846d-74d997c484d9\/2-improve-your-javascript-knowledge-by-reading-source-code.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a94d53ac-c580-4a50-846d-74d997c484d9\/2-improve-your-javascript-knowledge-by-reading-source-code.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a94d53ac-c580-4a50-846d-74d997c484d9\/2-improve-your-javascript-knowledge-by-reading-source-code.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a94d53ac-c580-4a50-846d-74d997c484d9\/2-improve-your-javascript-knowledge-by-reading-source-code.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/2-improve-your-javascript-knowledge-by-reading-source-code.png?w=900\" sizes=\"100vw\" alt=\"The source code for Mithril\u2019s hyperscript function\"><\/a><figcaption>\n      My first introduction to reading code was via Mithril\u2019s hyperscript function. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a94d53ac-c580-4a50-846d-74d997c484d9\/2-improve-your-javascript-knowledge-by-reading-source-code.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<div data-component=\"FeaturePanel\" data-audience=\"non-subscriber\" data-remove=\"true\"><\/div>\n<h3>The Benefits Of Reading Source Code<\/h3>\n<p>One of the major benefits of reading source code is the number of things you can learn. When I first looked into Mithril\u2019s codebase, I had a vague idea of what the virtual DOM was. When I finished, I came away with the knowledge that the virtual DOM is a technique which involves creating a tree of objects that describe what your user interface should look like. That tree is then turned into DOM elements using DOM APIs such as <code>document.createElement<\/code>. Updates are performed by creating a new tree describing the future state of the user interface and then comparing it with objects from the old tree.<\/p>\n<p>I had read about all of this in various articles and tutorials, and whilst it was helpful, being able to observe it at work in the context of an application we had shipped was very illuminating for me. It also taught me which questions to ask when comparing different frameworks. Instead of looking at GitHub stars, for example, I now knew to ask questions such as, \u201cHow does the way each framework performs updates affect performance and the user experience?\u201d<\/p>\n<p>Another benefit is an increase in your appreciation and understanding of good application architecture. Whilst most open-source projects generally follow the same structure with their repositories, each of them contains differences. Mithril\u2019s structure is pretty flat and if you are familiar with its API, you can make educated guesses about the code in folders such as <code>render<\/code>, <code>router<\/code> and <code>request<\/code>. On the other hand, React\u2019s structure reflects its new architecture. The maintainers have separated the module responsible for UI updates (<code>react-reconciler<\/code>) from the module responsible for rendering DOM elements (<code>react-dom<\/code>).<\/p>\n<p>One of the benefits of this is that it is now easier for developers to write their own <a href=\"https:\/\/github.com\/chentsulin\/awesome-react-renderer\">custom renderers<\/a> by hooking into the <code>react-reconciler<\/code> package. Parcel, a module bundler I have been studying recently, also has a <code>packages<\/code> folder like React. The key module is named <code>parcel-bundler<\/code> and it contains the code responsible for creating bundles, spinning up the hot module server and the command-line tool.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6777ea35-ee97-40c4-a0b8-5b4c2455f733\/1-improve-your-javascript-knowledge-by-reading-source-code.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/1-improve-your-javascript-knowledge-by-reading-source-code.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6777ea35-ee97-40c4-a0b8-5b4c2455f733\/1-improve-your-javascript-knowledge-by-reading-source-code.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6777ea35-ee97-40c4-a0b8-5b4c2455f733\/1-improve-your-javascript-knowledge-by-reading-source-code.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6777ea35-ee97-40c4-a0b8-5b4c2455f733\/1-improve-your-javascript-knowledge-by-reading-source-code.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6777ea35-ee97-40c4-a0b8-5b4c2455f733\/1-improve-your-javascript-knowledge-by-reading-source-code.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/1-improve-your-javascript-knowledge-by-reading-source-code.png?w=900\" sizes=\"100vw\" alt=\"The section of the JavaScript specification which explains how Object.prototype.toString works\"><\/a><figcaption>\n      It will not be long before the source code you are reading leads you to the JavaScript specification. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6777ea35-ee97-40c4-a0b8-5b4c2455f733\/1-improve-your-javascript-knowledge-by-reading-source-code.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>Yet another benefit \u2014 which came as a welcome surprise to me \u2014 is you become more comfortable reading the official JavaScript specification which defines how the language works. The first time I read the spec was when I was investigating the difference between <code>throw Error<\/code> and <code>throw new Error<\/code> (spoiler alert \u2014 there is <a href=\"http:\/\/www.ecma-international.org\/ecma-262\/7.0\/#sec-error-constructor\">none<\/a>). I looked into this because I noticed that Mithril used <code>throw Error<\/code> in the implementation of its <code>m<\/code> function and I wondered if there was a benefit to using it over <code>throw new Error<\/code>. Since then, I have also learnt that the logical operators <code>&&<\/code> and <code>||<\/code> <a href=\"https:\/\/tc39.es\/ecma262\/#prod-LogicalORExpression\">do not necessarily return booleans<\/a>, found the <a href=\"http:\/\/www.ecma-international.org\/ecma-262\/#sec-abstract-equality-comparison\">rules<\/a> which govern how the <code>==<\/code> equality operator coerces values and the <a href=\"http:\/\/www.ecma-international.org\/ecma-262\/#sec-object.prototype.tostring\">reason<\/a> <code>Object.prototype.toString.call({})<\/code> returns <code>'[object Object]'<\/code>.<\/p>\n<div><\/div>\n<h3>Techniques For Reading Source Code<\/h3>\n<p>There are many ways of approaching source code. I have found the easiest way to start is by selecting a method from your chosen library and documenting what happens when you call it. Do not document every single step but try to identify its overall flow and structure.<\/p>\n<p>I did this recently with <code>ReactDOM.render<\/code> and consequently learned a lot about React Fiber and some of the reasons behind its implementation. Thankfully, as React is a popular framework, I came across a lot of articles written by other developers on the same issue and this sped up the process.<\/p>\n<p>This deep dive also introduced me to the concepts of <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Background_Tasks_API\">co-operative scheduling<\/a>, the <code><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/requestIdleCallback\">window.requestIdleCallback<\/a><\/code> method and a <a href=\"https:\/\/github.com\/facebook\/react\/blob\/v16.7.0\/packages\/react-reconciler\/src\/ReactUpdateQueue.js#L10\">real world example of linked lists<\/a> (React handles updates by putting them in a queue which is a linked list of prioritised updates). When doing this, it is advisable to create a very basic application using the library. This makes it easier when debugging because you do not have to deal with the stack traces caused by other libraries.<\/p>\n<p>If I am not doing an in-depth review, I will open up the <code>\/node_modules<\/code> folder in a project I am working on or I will go to the GitHub repository. This usually happens when I come across a bug or interesting feature. When reading code on GitHub, make sure you are reading from the latest version. You can view the code from commits with the latest version tag by clicking the button used to change branches and select \u201ctags\u201d. Libraries and frameworks are forever undergoing changes so you do not want to learn about something which may be dropped in the next version.<\/p>\n<p>Another less involved way of reading source code is what I like to call the \u2018cursory glance\u2019 method. Early on when I started reading code, I installed <em>express.js<\/em>, opened its <code>\/node_modules<\/code> folder and went through its dependencies. If the <code>README<\/code> did not provide me with a satisfactory explanation, I read the source. Doing this led me to these interesting findings:<\/p>\n<ul>\n<li>Express depends on two modules which both merge objects but do so in very different ways. <code>merge-descriptors<\/code> only adds properties directly found directly on the source object and it also merges non-enumerable properties whilst <code>utils-merge<\/code> only iterates over an object\u2019s enumerable properties as well as those found in its prototype chain. <code>merge-descriptors<\/code> uses <code>Object.getOwnPropertyNames()<\/code> and <code>Object.getOwnPropertyDescriptor()<\/code> whilst <code>utils-merge<\/code> uses <code>for..in<\/code>;<\/li>\n<li>The <code>setprototypeof<\/code> module provides a cross platform way of setting the prototype of an instantiated object;<\/li>\n<li><code>escape-html<\/code> is a 78-line module for escaping a string of content so it can be interpolated in HTML content.<\/li>\n<\/ul>\n<p>Whilst the findings are not likely to be useful immediately, having a general understanding of the dependencies used by your library or framework is useful.<\/p>\n<p>When it comes to debugging front-end code, your browser\u2019s debugging tools are your best friend. Among other things, they allow you to stop the program at any time and inspect its state, skip a function\u2019s execution or step into or out of it. Sometimes this will not be immediately possible because the code has been minified. I tend to unminify it and copy the unminified code into the relevant file in the <code>\/node_modules<\/code> folder.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/798703fd-8689-40d9-9159-701f1a00f837\/3-improve-your-javascript-knowledge-by-reading-source-code.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/3-improve-your-javascript-knowledge-by-reading-source-code.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/798703fd-8689-40d9-9159-701f1a00f837\/3-improve-your-javascript-knowledge-by-reading-source-code.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/798703fd-8689-40d9-9159-701f1a00f837\/3-improve-your-javascript-knowledge-by-reading-source-code.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/798703fd-8689-40d9-9159-701f1a00f837\/3-improve-your-javascript-knowledge-by-reading-source-code.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/798703fd-8689-40d9-9159-701f1a00f837\/3-improve-your-javascript-knowledge-by-reading-source-code.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/3-improve-your-javascript-knowledge-by-reading-source-code.png?w=900\" sizes=\"100vw\" alt=\"The source code for the ReactDOM.render function\"><\/a><figcaption>\n      Approach debugging as you would any other application. Form a hypothesis and then test it. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/798703fd-8689-40d9-9159-701f1a00f837\/3-improve-your-javascript-knowledge-by-reading-source-code.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<h3>Case Study: Redux\u2019s Connect Function<\/h3>\n<p>React-Redux is a library used to manage the state of React applications. When dealing with popular libraries such as these, I start by searching for articles that have been written about its implementation. In doing so for this case study, I came across this <a href=\"https:\/\/blog.isquaredsoftware.com\/2018\/11\/react-redux-history-implementation\">article<\/a>. This is another good thing about reading source code. The research phase usually leads you to informative articles such as this which only improve your own thinking and understanding.<\/p>\n<p><code>connect<\/code> is a React-Redux function which connects React components to an application\u2019s Redux store. How? Well, according to the <a href=\"https:\/\/react-redux.js.org\/api\/connect\">docs<\/a>, it does the following:<\/p>\n<blockquote><p>\u201c&#8230;returns a new, connected component class that wraps the component you passed in.\u201d<\/p><\/blockquote>\n<p>After reading this, I would ask the following questions:<\/p>\n<ul>\n<li>Do I know any patterns or concepts in which functions take an input and then return that same input wrapped with additional functionality?<\/li>\n<li>If I know of any such patterns, how would I implement this based on the explanation given in the docs?<\/li>\n<\/ul>\n<p>Usually, the next step would be to create a very basic example app which uses <code>connect<\/code>. However, on this occasion I opted to use the new React app we are building at <a href=\"https:\/\/limejump.com\/\">Limejump<\/a> because I wanted to understand <code>connect<\/code> within the context of an application which will eventually be going into a production environment.<\/p>\n<p>The component I am focusing on looks like this:<\/p>\n<div>\n<pre><code>class MarketContainer extends Component {\n \/\/ code omitted for brevity\n}\n\nconst mapDispatchToProps = dispatch => {\n return {\n   updateSummary: (summary, start, today) => dispatch(updateSummary(summary, start, today))\n }\n}\n\nexport default connect(null, mapDispatchToProps)(MarketContainer);\n<\/code><\/pre>\n<\/div>\n<p>It is a container component which wraps four smaller connected components. One of the first things you come across in the <a href=\"https:\/\/github.com\/reduxjs\/react-redux\/blob\/v7.1.0\/src\/connect\/connect.js\">file<\/a> which exports <code>connect<\/code> method is this comment: <em>connect is a facade over connectAdvanced<\/em>. Without going far we have our first learning moment: <strong>an opportunity to observe the <a href=\"http:\/\/jargon.js.org\/_glossary\/FACADE_PATTERN.md\">facade<\/a> design pattern in action<\/strong>. At the end of the file we see that <code>connect<\/code> exports an invocation of a function called <code>createConnect<\/code>. Its parameters are a bunch of default values which have been destructured like this:<\/p>\n<div>\n<pre><code>export function createConnect({\n connectHOC = connectAdvanced,\n mapStateToPropsFactories = defaultMapStateToPropsFactories,\n mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,\n mergePropsFactories = defaultMergePropsFactories,\n selectorFactory = defaultSelectorFactory\n} = {})\n<\/code><\/pre>\n<\/div>\n<p>Again, we come across another learning moment: <strong>exporting invoked functions<\/strong> and <strong>destructuring default function arguments<\/strong>. The destructuring part is a learning moment because had the code been written like this:<\/p>\n<div>\n<pre><code>export function createConnect({\n connectHOC = connectAdvanced,\n mapStateToPropsFactories = defaultMapStateToPropsFactories,\n mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,\n mergePropsFactories = defaultMergePropsFactories,\n selectorFactory = defaultSelectorFactory\n})\n<\/code><\/pre>\n<\/div>\n<p>It would have resulted in this error <code>Uncaught TypeError: Cannot destructure property 'connectHOC' of 'undefined' or 'null'.<\/code> This is because the function has no default argument to fall back on.<\/p>\n<p><strong>Note<\/strong>: <em>For more on this, you can read David Walsh\u2019s <a href=\"https:\/\/davidwalsh.name\/destructuring-function-arguments\">article<\/a>. Some learning moments may seem trivial, depending on your knowledge of the language, and so it might be better to focus on things you have not seen before or need to learn more about.<\/em><\/p>\n<p><code>createConnect<\/code> itself does nothing in its function body. It returns a function called <code>connect<\/code>, the one I used here:<\/p>\n<pre><code>export default connect(null, mapDispatchToProps)(MarketContainer)\n<\/code><\/pre>\n<p>It takes four arguments, all optional, and the first three arguments each go through a <code><a href=\"https:\/\/github.com\/reduxjs\/react-redux\/blob\/v7.1.0\/src\/connect\/connect.js#L25\">match<\/a><\/code> function which helps define their behaviour according to whether the arguments are present and their value type. Now, because the second argument provided to <code>match<\/code> is one of three functions imported into <code>connect<\/code>, I have to decide which thread to follow.<\/p>\n<p>There are learning moments with the <a href=\"https:\/\/github.com\/reduxjs\/react-redux\/blob\/v7.1.0\/src\/connect\/wrapMapToProps.js#L29\">proxy function<\/a> used to wrap the first argument to <code>connect<\/code> if those arguments are functions, the <code><a href=\"https:\/\/github.com\/reduxjs\/react-redux\/blob\/v7.1.0\/src\/utils\/isPlainObject.js\">isPlainObject<\/a><\/code> utility used to check for plain objects or the <code><a href=\"https:\/\/github.com\/reduxjs\/react-redux\/blob\/v7.1.0\/src\/utils\/warning.js\">warning<\/a><\/code> module which reveals how you can set your debugger to <a href=\"https:\/\/developers.google.com\/web\/tools\/chrome-devtools\/javascript\/breakpoints#exceptions\">break on all exceptions<\/a>. After the match functions, we come to <code>connectHOC<\/code>, the function which takes our React component and connects it to Redux. It is another function invocation which returns <code><a href=\"https:\/\/github.com\/reduxjs\/react-redux\/blob\/v7.1.0\/src\/components\/connectAdvanced.js#L123\">wrapWithConnect<\/a><\/code>, the function which actually handles connecting the component to the store.<\/p>\n<p>Looking at <code>connectHOC<\/code>\u2019s implementation, I can appreciate why it needs <code>connect<\/code> to hide its implementation details. It is the heart of React-Redux and contains logic which does not need to be exposed via <code>connect<\/code>. Even though I will end the deep dive here, had I continued, this would have been the perfect time to consult the reference material I found earlier as it contains an incredibly detailed explanation of the codebase.<\/p>\n<div><\/div>\n<h3>Summary<\/h3>\n<p>Reading source code is difficult at first but as with anything, it becomes easier with time. The goal is not to understand everything but to come away with a different perspective and new knowledge. The key is to be deliberate about the entire process and intensely curious about everything.<\/p>\n<p>For example, I found the <code>isPlainObject<\/code> function interesting because it uses this <code>if (typeof obj !== 'object' || obj === null) return false<\/code> to make sure the given argument is a plain object. When I first read its implementation, I wondered why it did not use <code>Object.prototype.toString.call(opts) !== '[object Object]'<\/code>, which is less code and distinguishes between objects and object sub types such as the Date object. However, reading the next line revealed that in the extremely unlikely event that a developer using <code>connect<\/code> returns a Date object, for example, this will be handled by the <code>Object.getPrototypeOf(obj) === null<\/code> check.<\/p>\n<p>Another bit of intrigue in <code>isPlainObject<\/code> is this code:<\/p>\n<pre><code>while (Object.getPrototypeOf(baseProto) !== null) {\n baseProto = Object.getPrototypeOf(baseProto)\n}\n<\/code><\/pre>\n<p>Some Google searching led me to <a href=\"https:\/\/stackoverflow.com\/questions\/51722354\/the-implementation-of-isplainobject-function-in-redux\/51726564#51726564\">this<\/a> StackOverflow thread and the Redux <a href=\"https:\/\/github.com\/reduxjs\/redux\/pull\/2599#issuecomment-342849867\">issue<\/a> explaining how that code handles cases such as checking against objects which originate from an iFrame.<\/p>\n<h4>Useful Links On Reading Source Code<\/h4>\n<ul>\n<li>\u201c<a href=\"https:\/\/blog.angularindepth.com\/level-up-your-reverse-engineering-skills-8f910ae10630\">How To Reverse Engineer Frameworks<\/a>,\u201d Max Koretskyi, Medium<\/li>\n<li>\u201c<a href=\"https:\/\/github.com\/aredridel\/how-to-read-code\/blob\/master\/how-to-read-code.md\">How To Read Code<\/a>,\u201d Aria Stewart, GitHub<\/li>\n<\/ul>\n<div>\n  <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/logo-red-10.png?w=900\" alt=\"Smashing Editorial\"><span>(dm, yk, il)<\/span>\n<\/div>\n<\/article>\n<p class=\"wpematico_credit\"><small>Powered by <a href=\"http:\/\/www.wpematico.com\" target=\"_blank\">WPeMatico<\/a><\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Improve Your JavaScript Knowledge By Reading Source Code Improve Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00 Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years&#8230;<a class=\"moretag\" href=\"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/\"> Read the full article&#8230;<\/a><\/p>\n","protected":false},"author":4,"featured_media":68061,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[371],"tags":[],"class_list":["post-68060","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-user-experience"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Guest Contribution\"\/>\n\t<meta name=\"keywords\" content=\"user experience\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Design for Immersive Technologies | User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies\" \/>\n\t\t<meta property=\"og:description\" content=\"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-07-12T11:19:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-07-12T11:19:10+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#article\",\"name\":\"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies\",\"headline\":\"Improve Your JavaScript Knowledge By Reading Source Code\",\"author\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.taterboy.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/07\\\/2-improve-your-javascript-knowledge-by-reading-source-code.png?fit=400%2C308&ssl=1\",\"width\":400,\"height\":308},\"datePublished\":\"2019-07-12T04:19:10-07:00\",\"dateModified\":\"2019-07-12T04:19:10-07:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#webpage\"},\"articleSection\":\"User Experience\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.taterboy.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/user-experience\\\/#listItem\",\"name\":\"User Experience\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/user-experience\\\/#listItem\",\"position\":2,\"name\":\"User Experience\",\"item\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/user-experience\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#listItem\",\"name\":\"Improve Your JavaScript Knowledge By Reading Source Code\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#listItem\",\"position\":3,\"name\":\"Improve Your JavaScript Knowledge By Reading Source Code\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/user-experience\\\/#listItem\",\"name\":\"User Experience\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#organization\",\"name\":\"Design for Immersive Technologies\",\"description\":\"User Experience for Games, Virtual Reality (VR) and Augmented\\\/Mixed Reality (AR\\\/MR)\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/\",\"name\":\"Guest Contribution\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d2aad73eb0f48c67b141e9fc978a0e498969791ed623346e361d02d19775b0bb?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Guest Contribution\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#webpage\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/\",\"name\":\"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies\",\"description\":\"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.taterboy.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/07\\\/2-improve-your-javascript-knowledge-by-reading-source-code.png?fit=400%2C308&ssl=1\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#mainImage\",\"width\":400,\"height\":308},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/07\\\/improve-your-javascript-knowledge-by-reading-source-code\\\/#mainImage\"},\"datePublished\":\"2019-07-12T04:19:10-07:00\",\"dateModified\":\"2019-07-12T04:19:10-07:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/\",\"name\":\"Design for Immersive Technologies\",\"description\":\"User Experience for Games, Virtual Reality (VR) and Augmented\\\/Mixed Reality (AR\\\/MR)\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies","description":"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We","canonical_url":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/","robots":"max-image-preview:large","keywords":"user experience","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#article","name":"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies","headline":"Improve Your JavaScript Knowledge By Reading Source Code","author":{"@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author"},"publisher":{"@id":"https:\/\/www.taterboy.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/2-improve-your-javascript-knowledge-by-reading-source-code.png?fit=400%2C308&ssl=1","width":400,"height":308},"datePublished":"2019-07-12T04:19:10-07:00","dateModified":"2019-07-12T04:19:10-07:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#webpage"},"isPartOf":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#webpage"},"articleSection":"User Experience"},{"@type":"BreadcrumbList","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.taterboy.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/category\/user-experience\/#listItem","name":"User Experience"}},{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/category\/user-experience\/#listItem","position":2,"name":"User Experience","item":"https:\/\/www.taterboy.com\/blog\/category\/user-experience\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#listItem","name":"Improve Your JavaScript Knowledge By Reading Source Code"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#listItem","position":3,"name":"Improve Your JavaScript Knowledge By Reading Source Code","previousItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/category\/user-experience\/#listItem","name":"User Experience"}}]},{"@type":"Organization","@id":"https:\/\/www.taterboy.com\/blog\/#organization","name":"Design for Immersive Technologies","description":"User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)","url":"https:\/\/www.taterboy.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author","url":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/","name":"Guest Contribution","image":{"@type":"ImageObject","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d2aad73eb0f48c67b141e9fc978a0e498969791ed623346e361d02d19775b0bb?s=96&d=mm&r=g","width":96,"height":96,"caption":"Guest Contribution"}},{"@type":"WebPage","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#webpage","url":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/","name":"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies","description":"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.taterboy.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#breadcrumblist"},"author":{"@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author"},"creator":{"@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/2-improve-your-javascript-knowledge-by-reading-source-code.png?fit=400%2C308&ssl=1","@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#mainImage","width":400,"height":308},"primaryImageOfPage":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/#mainImage"},"datePublished":"2019-07-12T04:19:10-07:00","dateModified":"2019-07-12T04:19:10-07:00"},{"@type":"WebSite","@id":"https:\/\/www.taterboy.com\/blog\/#website","url":"https:\/\/www.taterboy.com\/blog\/","name":"Design for Immersive Technologies","description":"User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.taterboy.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Design for Immersive Technologies | User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)","og:type":"article","og:title":"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies","og:description":"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We","og:url":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/","article:published_time":"2019-07-12T11:19:10+00:00","article:modified_time":"2019-07-12T11:19:10+00:00","twitter:card":"summary","twitter:title":"Improve Your JavaScript Knowledge By Reading Source Code | Design for Immersive Technologies","twitter:description":"Improve Your JavaScript Knowledge By Reading Source CodeImprove Your JavaScript Knowledge By Reading Source Code Carl Mungazi 2019-07-12T12:30:59+02:002019-07-12T11:06:35+00:00Do you remember the first time you dug deep into the source code of a library or framework you use frequently? For me, that moment came during my first job as a frontend developer three years ago. We"},"aioseo_meta_data":{"post_id":"68060","title":null,"description":null,"keywords":null,"keyphrases":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_custom_image_width":null,"og_custom_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"created":"2021-02-07 18:59:01","updated":"2026-09-01 15:42:09","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"primary_term":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"twitter_image_url":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.taterboy.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.taterboy.com\/blog\/category\/user-experience\/\" title=\"User Experience\">User Experience<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tImprove Your JavaScript Knowledge By Reading Source Code\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.taterboy.com\/blog"},{"label":"User Experience","link":"https:\/\/www.taterboy.com\/blog\/category\/user-experience\/"},{"label":"Improve Your JavaScript Knowledge By Reading Source Code","link":"https:\/\/www.taterboy.com\/blog\/2019\/07\/improve-your-javascript-knowledge-by-reading-source-code\/"}],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8wzr5-hHK","jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/07\/2-improve-your-javascript-knowledge-by-reading-source-code.png?fit=400%2C308&ssl=1","_links":{"self":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/posts\/68060","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/comments?post=68060"}],"version-history":[{"count":0,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/posts\/68060\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/media\/68061"}],"wp:attachment":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/media?parent=68060"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/categories?post=68060"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/tags?post=68060"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}