If statement better understanding

Viewed 44

I was working on some backend node.js if condition when i realized i wasnt getting an error when i do this if (value.accepters !== undefined && value.accepters.length !== 0) while checking an object with a missing key but if i do value.accepters.length i get error, can anyone explain why for better understanding, thanks.

An example: a bit messy, please don't mind. enter image description here

Code Update

var value = {accepters: ["id1"], rejecters: [], blockedRoom: []}
// did some long code work here
value = {accepters: ["id1"], rejecters: []}
console.log("blockedRoom check 1:", value.blockedRoom !== undefined && value.blockedRoom.length !== 0) // No Error
console.log("blockedRoom check 2:", value.blockedRoom.length !== 0) // Error

var accepters = 0;
var rejecters = 0;
var amongAccepters = false;
var amongRejecters = false;
var amongBlockers = false;
// No Error
if (value.accepters !== undefined && value.accepters.length !== 0){
  accepters = value.accepters.length;
  const foundUserAmongAccepters = value.accepters.find(
    (v) => v.key === key
  );
  if (foundUserAmongAccepters !== undefined) {
    amongAccepters = true;
  }
}
if (value.rejecters !== undefined && value.rejecters.length !== 0) {
  rejecters = value.rejecters.length;
  const foundUserAmongRejecters = value.rejecters.find(
    (v) => v.key === key
  );
  if (foundUserAmongRejecters !== undefined) {
    amongRejecters = true;
  }
}
if (value.blockedRoom !== undefined && value.blockedRoom.length !== 0) {
  const foundUserAmongBlockers = value.blockedRoom.find((v) => v === key);
  if (foundUserAmongBlockers !== undefined) {
    amongBlockers = true;
  }
}
2 Answers

You set var l = { k: 1 }

And then you try to log m.length, that doesn't exist.

You then check if l.m is not undefined, and log. It's undefined, so you don't log.

You then do the same check, is l.m? It's not, so we should circuit the if check and we don't log.

Next, try to log l.m.length, we know l.m is undefined, so l.m.length is undefined. Error

Next you try to do an if check on something we already know fails, because l.m is undefined, l.m.length fails (undefined.length == error), so the === 0 never happens.

Same as last comment.

Finally, check if l.m is defined, it's not, short circuit to false.

Solution and better understandings from @Barmar

&& performs short-circuiting. So when you write expression1 && expression2, expression2 is not evaluated when expression1 is false. So you don't get an error in the second expression if the first one prevents it.

Related