Could someone please help with the difference between dot notation and bracket notation? They seem to produce different results

Tell us what’s happening:
So, with the given code, I have used dot notation for if (contacts[i].firstName === name) { and this has worked just fine. It returns the firstName property and resolves accordingly.

However, I have also used dot notation for return contacts[i].prop; but this returns undefined.

I have tested this out, and return contacts[i][prop]; returns the correct property value.

Evidently, I don’t really understand the difference between the two notations very well. Could someone help out?

  **Your code so far**

// Setup
const contacts = [
{
  firstName: "Akira",
  lastName: "Laine",
  number: "0543236543",
  likes: ["Pizza", "Coding", "Brownie Points"],
},
{
  firstName: "Harry",
  lastName: "Potter",
  number: "0994372684",
  likes: ["Hogwarts", "Magic", "Hagrid"],
},
{
  firstName: "Sherlock",
  lastName: "Holmes",
  number: "0487345643",
  likes: ["Intriguing Cases", "Violin"],
},
{
  firstName: "Kristian",
  lastName: "Vos",
  number: "unknown",
  likes: ["JavaScript", "Gaming", "Foxes"],
},
];

function lookUpProfile(name, prop) {
for (let i = 0; i < contacts.length; i++) {
  if (contacts[i].firstName === name) {
    if (prop in contacts[i]) {
      return contacts[i].prop;
    } else {
      return "No such property";
    }
  }
}
return "No such contact"
}

lookUpProfile("Akira", "likes");
  **Your browser information:**

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36

Challenge: Profile Lookup

Link to the challenge:

Dot notation can only be used with the exact, literal name of the property you want. If you have a variable holding the property name, then you must use bracket notation.

2 Likes

Ah, this makes sense. So If I don’t know the name of the property before-hand then it has to be bracket notation?

Is the opposite true as well? As in, you cannot use an exact name for bracket notation?

Yup

Not quite. These two are the same

 myObject["myProperty"] == myObject.myProperty
1 Like

Ah, so you have to use a string then?

As in:
myObject[myProperty] != myObject.myProperty

Bingo. Bracket notation takes a string or a variable holding a string.

1 Like

Makes sense, thank you!

1 Like

The contents of the square brackets get interpreted as code. You can do things like receipts[date + productType] or birthdays[age + 1]. That’s why strings need to be in quotes: the contents of the brackets get parsed into a string.

2 Likes

Always try to find the logic behind things that you are having difficulties with and it will make things so much easier once you’ve found it. Try to understand why it is the way it is . It helps a lot trust me on this.
Wish you the best. :slightly_smiling_face:

Unless myProperty == “myProperty”
:grinning: