Skip to main content

Command Palette

Search for a command to run...

JavaScript Objects: A Beginner-Friendly Guide

How key-value data structures work in JavaScript

Updated
13 min read
JavaScript Objects: A Beginner-Friendly Guide

Welcome back to our JavaScript learning journey. So far, we've explored how to control program flow, how to package reusable logic with functions, and how to work with arrays to manage collections of data.

Now we arrive at one of the most fundamental and powerful concepts in JavaScript: objects.

If arrays help us organize lists of things, objects help us describe things themselves complete with their characteristics, properties, and details.

The Problem: Scattered Data

Imagine you are building a student management system for your college. You need to store information about a student named Purakhnath.

Without objects, you might write something like this:

let studentName = "Purakhnath";
let studentAge = 20;
let studentCourse = "BCA";
let studentState = "Rajasthan";

This works, but think about what happens when you need to manage 500 students. You will have 2,000 separate variables floating around with no clear relationship between them. The data is scattered.

More importantly, these four variables actually describe one entity -> a single student. They belong together conceptually, but in our code, they are completely separate. There's nothing telling JavaScript (or the next developer reading your code) that studentName and studentAge are related.

This is where objects come in.

What Is an Object?

An object in JavaScript is a collection of key-value pairs. Think of it as a container that groups related data together under meaningful labels.

Instead of four separate variables, we create one structured entity:

const student = {
  name: "Purakhnath",
  age: 20,
  course: "BCA",
  state: "Rajasthan"
};

Now we have a single variable student that encapsulates everything we know about this person. The relationship between the data is clear, both to JavaScript and to anyone reading the code.

Understanding the Structure

Let's break down what you're seeing:

  • Keys: name, age, course, state - these are property names (also called "keys")

  • Values: "Purakhnath", 20, "BCA", "Rajasthan" - the actual data stored

  • Colon (:): Separates each key from its value

  • Comma (,): Separates different properties

  • Curly braces ({}): Define the object boundaries

Conceptually, you can visualize it like this:

Each key acts as a label that points to a specific value. This is fundamentally different from arrays, where we access items by their position (index). With objects, we access data by name.

Creating Objects: The Object Literal

The example above uses object literal syntax the most common and readable way to create objects in JavaScript. You will see this pattern in virtually every JavaScript codebase.

const course = {
  title: "Full Stack Web Development",
  instructor: "Hitesh Choudhary",
  duration: "12 weeks",
  isActive: true,
  studentCount: 45
};

Notice that values can be any data type: strings, numbers, booleans, or even other objects and arrays (which we'll explore later).

Why use const? Even though we can modify the contents of an object (add, remove, or change properties), the variable course itself always points to the same object in memory. Using const prevents accidental reassignment of the entire object.

Accessing Object Properties

Once you have an object, you need to retrieve its data. JavaScript provides two ways to access properties:

1. Dot Notation

The most common and readable approach:

console.log(course.title);        // "Full Stack Web Development"
console.log(course.duration);     // "12 weeks"
console.log(course.studentCount); // 45

Use a period (.) followed by the property name. This works when you know the exact property name at the time you're writing the code.

2. Bracket Notation

An alternative syntax using square brackets:

console.log(course["title"]);        // "Full Stack Web Development"
console.log(course["duration"]);     // "12 weeks"

When is bracket notation useful?

Imagine you are building a search feature where users can type which property they want to see

const userPreference = "instructor"; // This comes from user input
console.log(course[userPreference]); // "Hitesh Choudhary"

With dot notation, course.userPreference would look for a property literally named userPreference -> which doesn't exist. Bracket notation evaluates the expression inside the brackets first, then uses that result as the property name.

Bracket notation is also required when property names contain spaces or special characters (though this is rare in well-designed code)

const weirdObject = {
  "property with spaces": "value"
};

console.log(weirdObject["property with spaces"]); // Works
// console.log(weirdObject.property with spaces); // SyntaxError

What Happens When a Property Doesn't Exist?

If you try to access a property that hasn't been defined, JavaScript returns undefined , not an error:

console.log(course.price); // undefined

This is important to remember. JavaScript doesn't throw an error; it simply tells you I don't have a value for that key. This can lead to subtle bugs if you're not careful.

Updating Properties

Objects are mutable their contents can change after creation. To update an existing property, use the assignment operator

const project = {
  name: "Portfolio Website",
  status: "planning",
  completedTasks: 0
};

// Update existing property
project.status = "in development";
project.completedTasks = 5;

console.log(project.status);        // "in development"
console.log(project.completedTasks); // 5

What happens internally? JavaScript looks up the key status in the object, finds where it's stored in memory, and replaces the associated value with the new string. The object structure remains the same; only the value changes.

Adding New Properties

One of JavaScript's flexible features is that objects are dynamic , you can add properties at any time, even after the object is created.

const githubRepo = {
  name: "task-manager",
  language: "JavaScript"
};


githubRepo.stars = 128;
githubRepo.isPublic = true;
githubRepo.description = "A CLI task management tool";

console.log(githubRepo);
/*
{
    "name": "task-manager",
    "language": "JavaScript",
    "stars": 128,
    "isPublic": true,
    "description": "A CLI task management tool"
}
*/

This is particularly useful when you're gradually building up data , for example, fetching information from different sources or processing user input step by step.

Deleting Properties

Sometimes you need to remove a property entirely. JavaScript provides the delete operator:

const userProfile = {
  username: "purakhnath_jyani",
  email: "purakhnath@example.com",
  tempPassword: "xyz123" // Sensitive data we shouldn't keep
};

// Remove the temporary password
delete userProfile.tempPassword;

console.log(userProfile.tempPassword); // undefined
console.log(userProfile); 
// { username: "purakhnath_jyani", email: "purakhnath@example.com" }

Use delete sparingly. In most applications, it's better to set a property to null or undefined rather than removing it completely, as deletion can impact JavaScript's internal optimization of the object.

Looping Through Object Properties

When you need to work with every property in an object, use the for...in loop:

const movie = {
  title: "Inception",
  director: "Christopher Nolan",
  year: 2010,
  rating: 8.8
};

for (let key in movie) {
  console.log(key + ": " + movie[key]);
}
// Output:
// title: Inception
// director: Christopher Nolan
// year: 2010
// rating: 8.8

How it works step-by-step:

  1. The loop iterates over each enumerable property key in the object

  2. On each iteration, key holds the property name as a string ("title", then "director", etc.)

  3. movie[key] uses bracket notation to access the corresponding value

  4. The loop continues until all properties have been processed

Important: The order of properties in a for...in loop is not guaranteed (though modern engines usually maintain insertion order for simple objects). If you need reliable ordering, use an array instead.

Arrays vs Objects: Understanding the Difference

This is a crucial concept that confuses many beginners. Let's clarify the distinction:

Feature Array Object
Structure Ordered list Key-value pairs
Access By index number ([0], [1]) By property name (.name or ["name"])
Order Guaranteed order No guaranteed order
Use case Collection of similar items Describing a single entity
Example List of tasks, names, numbers User profile, product details, configuration

Practical Examples

Array - A to-do list where order matters:

const tasks = [
  "Review pull request",
  "Update documentation", 
  "Fix navigation bug",
  "Deploy to production"
];
// Access: tasks[0] → "Review pull request"

Object - A user profile with distinct attributes:

const currentUser = {
  id: 1628,
  username: "purakhnath_jyani",
  role: "developer",
  isAdmin: false,
  loginCount: 36
};
// Access: currentUser.role → "developer"

When to use which:

  • Use an array when you have a list of items that are all the same type of thing (a list of products, a list of messages, a list of scores)

  • Use an object when you are describing one thing with multiple characteristics (a product with name, price, and category; a message with sender, content, and timestamp)

Real-world scenario: An e-commerce site uses an array of objects:

const products = [
  { id: 1, name: "Wireless Mouse", price: 2390 },
  { id: 2, name: "Mechanical Keyboard", price: 8230 },
  { id: 3, name: "USB-C Hub", price: 4140 }
];

// Array (products) containing Objects (each product)

Practice Exercise

Now it's your turn. Create a student object and manipulate it:

Requirements:

  1. Create a student object with properties: name, age, and course

  2. Update the age property

  3. Add a new property city

  4. Delete the course property

  5. Print all remaining keys and values using a loop

Solution:

const student = {
  name: "Purakhnath",
  age: 20,
  course: "BCA"
};

student.age = 20;

student.city = "Bengaluru";

// Delete course
delete student.course;

for (let key in student) {
  console.log(key + ": " + student[key]);
}

// Output:
// name: Purakhnath
// age: 20
// city: Bengaluru

Section 2: A Deeper Look at JavaScript Objects

Now that you're comfortable with the basics, let's explore how objects work under the hood and the different ways to create them.

Different Ways to Create Objects

While object literals are most common, JavaScript offers several creation patterns:

1. Object Literal (Most Common)

const user = { name: "Hitesh Choudhary", role: "instructor" };

Use this for simple, one-off objects where you know the properties in advance.

2. Object Constructor

const user = new Object();
user.name = "Hitesh Choudhary";
user.role = "instructor";

Rarely used in modern code, but you might encounter it in older libraries. It creates an empty object that you populate manually.

3. Object.create()

const user = Object.create(null);
user.name = "Hitesh Choudhary";

Creates an object with no prototype (no inherited methods). Useful for dictionaries where you don't want accidental name collisions with built-in properties like toString.

4. Factory Functions

function createUser(name, role) {
  return {
    name: name,
    role: role,
    createdAt: new Date()
  };
}

const user1 = createUser("Hitesh Choudhary", "instructor");
const user2 = createUser("Purakhnath Jyani", "student");

Useful when you need to create multiple similar objects with the same structure. The function acts as a factory that assembles and returns configured objects.

How JavaScript Treats Objects Internally

Internally, JavaScript stores objects in structures optimized for fast property lookup. When you access student.name, JavaScript:

  1. Takes the key "name"

  2. Computes where that key should be stored (hashing)

  3. Retrieves the associated value from that location

This is why property access is fast regardless of how many properties an object has JavaScript doesn't search through properties linearly; it goes directly to the right location using the key.

The Dynamic Nature of Objects

JavaScript objects are exceptionally flexible. Unlike some languages where objects are rigidly defined, JavaScript allows:

const config = { theme: "dark" };

// Add anytime
config.fontSize = 14;
config.showSidebar = true;

// Update anytime  
config.theme = "light";

// Remove anytime
delete config.showSidebar;

// Check existence
console.log(config.language); // undefined (property doesn't exist)

This dynamism makes JavaScript powerful for rapid development, though it also means you need to be careful , typos in property names create new properties rather than throwing errors.

  • delete obj.prop → removes the property completely from the object.

  • obj.prop = null → keeps the property, but explicitly marks it as empty.

  • obj.prop = undefined → keeps the property, but marks it as “no value yet.”

  • Object.freeze(obj) → makes the object completely read-only (cannot add, delete, or update properties).

  • Object.seal(obj) → prevents adding or deleting properties, but allows updating existing ones (locks the shape of the object: no add, no delete, only updates).

  • Object.preventExtensions(obj) → prevents adding new properties, but allows updating or deleting existing ones (Just stops adding: you can still delete or update)

  • obj.hasOwnProperty(prop) → checks if a property belongs to the object itself (not inherited).

  • prop in obj → checks if a property exists in the object (including inherited properties).

Common Mistakes

1. Confusing Arrays and Objects

// Wrong: Using an array for structured data
const user = ["Purakhnath", 20, "BCA"]; 
// What does user[2] mean? Unclear.

// Right: Using an object
const user = { name: "Purakhnath", age: 20, course: "BCA" };
// user.course is self-documenting

2. Forgetting Bracket Notation for Dynamic Keys

const property = "name";
console.log(student.property); // undefined (looks for key "property")
console.log(student[property]); // "Purakhnath" (looks for key "name")

3. Expecting Objects to Have Length

const obj = { a: 1, b: 2 };
console.log(obj.length); // undefined (objects don't have length)

4. Modifying Objects Unintentionally

const original = { score: 100 };
const copy = original;
copy.score = 50;
console.log(original.score); // 50 (both variables point to same object)

Summary

Objects are one of JavaScript's most powerful tools, allowing us to represent structured, real-world data in code. Instead of juggling multiple scattered variables, objects group related information under meaningful labels, making your code cleaner and easier to manage.

Key takeaways:

  • Objects store data as key-value pairs using curly braces {}.

  • Access properties with dot notation (obj.key) or bracket notation (obj["key"]).

  • Objects are dynamic — you can add, update, or remove properties anytime.

  • Use for...in to iterate over object properties.
    (For more control and predictable ordering, modern JavaScript provides Object.keys(), Object.values(), and Object.entries(). These methods return arrays of keys, values, or key-value pairs, which you can loop through in a clear and flexible way using for...of, .forEach(), or other array methods. This approach is often preferred over for...in because it avoids inherited properties and gives a consistent, predictable order.)

  • Arrays are for ordered lists, while objects describe entities with properties.

  • JavaScript offers multiple object creation patterns, with object literals being the most common.

Mastering objects is essential because they form the foundation of everything from simple data structures to complex applications. Every DOM element, API response, or configuration setting you work with is ultimately an object.

In the next article, we’ll explore how objects interact with functions, including how methods work, how this binding affects behavior, and how developers use call(), apply(), and bind() to write more organized and flexible code.

More from this blog