javascript

examples

examples.js
/**
 * ============================================
 * 3.3 Logical Operators - Examples
 * ============================================
 */

// ============================================
// 1. AND OPERATOR (&&)
// ============================================

console.log('=== AND Operator (&&) ===');

// Boolean AND
console.log('true && true:', true && true); // true
console.log('true && false:', true && false); // false
console.log('false && true:', false && true); // false
console.log('false && false:', false && false); // false

// With non-boolean values
console.log('\n--- Non-Boolean AND ---');
console.log("'hello' && 'world':", 'hello' && 'world'); // "world"
console.log("0 && 'world':", 0 && 'world'); // 0
console.log("'hello' && 0:", 'hello' && 0); // 0
console.log("null && 'hello':", null && 'hello'); // null

// Multiple operands
console.log('\n--- Multiple Operands ---');
console.log('1 && 2 && 3:', 1 && 2 && 3); // 3
console.log('1 && 0 && 3:', 1 && 0 && 3); // 0
console.log("'' && 'a' && 'b':", '' && 'a' && 'b'); // ""

// ============================================
// 2. OR OPERATOR (||)
// ============================================

console.log('\n=== OR Operator (||) ===');

// Boolean OR
console.log('true || true:', true || true); // true
console.log('true || false:', true || false); // true
console.log('false || true:', false || true); // true
console.log('false || false:', false || false); // false

// With non-boolean values
console.log('\n--- Non-Boolean OR ---');
console.log("'hello' || 'world':", 'hello' || 'world'); // "hello"
console.log("0 || 'world':", 0 || 'world'); // "world"
console.log("'' || 0 || null:", '' || 0 || null); // null
console.log("null || undefined || 'default':", null || undefined || 'default'); // "default"

// Default value pattern
console.log('\n--- Default Values ---');
let name1 = undefined;
let name2 = '';
let name3 = 'John';

console.log("name1 || 'Guest':", name1 || 'Guest'); // "Guest"
console.log("name2 || 'Guest':", name2 || 'Guest'); // "Guest" (⚠️ empty string is falsy)
console.log("name3 || 'Guest':", name3 || 'Guest'); // "John"

// ============================================
// 3. NOT OPERATOR (!)
// ============================================

console.log('\n=== NOT Operator (!) ===');

// Boolean NOT
console.log('!true:', !true); // false
console.log('!false:', !false); // true

// With non-boolean values
console.log('\n--- Non-Boolean NOT ---');
console.log('!0:', !0); // true
console.log("!'':", !''); // true
console.log('!null:', !null); // true
console.log('!undefined:', !undefined); // true
console.log('!1:', !1); // false
console.log("!'hello':", !'hello'); // false
console.log('![]:', ![]); // false (array is truthy!)
console.log('!{}:', !{}); // false (object is truthy!)

// Double NOT (!!)
console.log('\n--- Double NOT (!!) ---');
console.log("!!'hello':", !!'hello'); // true
console.log('!!1:', !!1); // true
console.log('!!{}:', !!{}); // true
console.log("!!'':", !!''); // false
console.log('!!0:', !!0); // false
console.log('!!null:', !!null); // false

// ============================================
// 4. SHORT-CIRCUIT EVALUATION
// ============================================

console.log('\n=== Short-Circuit Evaluation ===');

function logAndReturn(value) {
  console.log('Function called with:', value);
  return value;
}

// AND short-circuit
console.log('\n--- AND Short-Circuit ---');
console.log('false && logAndReturn(true):');
console.log(false && logAndReturn(true)); // false, function NOT called

console.log("\ntrue && logAndReturn('value'):");
console.log(true && logAndReturn('value')); // function called, returns "value"

// OR short-circuit
console.log('\n--- OR Short-Circuit ---');
console.log('true || logAndReturn(true):');
console.log(true || logAndReturn(true)); // true, function NOT called

console.log("\nfalse || logAndReturn('value'):");
console.log(false || logAndReturn('value')); // function called, returns "value"

// ============================================
// 5. TRUTHY AND FALSY VALUES
// ============================================

console.log('\n=== Truthy and Falsy Values ===');

// All falsy values
const falsyValues = [false, 0, -0, 0n, '', null, undefined, NaN];
console.log('Falsy values:');
falsyValues.forEach((v) => {
  console.log(`  ${String(v).padEnd(10)} → ${!!v}`);
});

// Surprising truthy values
console.log('\nSurprising truthy values:');
const surprisingTruthy = ['0', 'false', [], {}, function () {}];
surprisingTruthy.forEach((v) => {
  console.log(`  ${String(v).padEnd(15)} → ${!!v}`);
});

// ============================================
// 6. LOGICAL ASSIGNMENT OPERATORS
// ============================================

console.log('\n=== Logical Assignment Operators ===');

// AND assignment (&&=)
console.log('--- AND Assignment (&&=) ---');
let a1 = 1;
a1 &&= 5;
console.log('1 &&= 5 →', a1); // 5

let a2 = 0;
a2 &&= 5;
console.log('0 &&= 5 →', a2); // 0

// OR assignment (||=)
console.log('\n--- OR Assignment (||=) ---');
let b1 = 0;
b1 ||= 10;
console.log('0 ||= 10 →', b1); // 10

let b2 = 5;
b2 ||= 10;
console.log('5 ||= 10 →', b2); // 5

// Nullish assignment (??=)
console.log('\n--- Nullish Assignment (??=) ---');
let c1 = null;
c1 ??= 'default';
console.log("null ??= 'default' →", c1); // "default"

let c2 = 0;
c2 ??= 10;
console.log('0 ??= 10 →', c2); // 0

let c3 = '';
c3 ??= 'default';
console.log("'' ??= 'default' →", c3); // ""

// ============================================
// 7. NULLISH COALESCING (??)
// ============================================

console.log('\n=== Nullish Coalescing (??) ===');

// Compare || vs ??
console.log('--- || vs ?? ---');
console.log("0 || 'default':", 0 || 'default'); // "default"
console.log("0 ?? 'default':", 0 ?? 'default'); // 0

console.log("'' || 'default':", '' || 'default'); // "default"
console.log("'' ?? 'default':", '' ?? 'default'); // ""

console.log("false || 'default':", false || 'default'); // "default"
console.log("false ?? 'default':", false ?? 'default'); // false

console.log("null || 'default':", null || 'default'); // "default"
console.log("null ?? 'default':", null ?? 'default'); // "default"

console.log("undefined || 'default':", undefined || 'default'); // "default"
console.log("undefined ?? 'default':", undefined ?? 'default'); // "default"

// Practical example
console.log('\n--- Practical Example ---');
let settings = {
  volume: 0, // Valid: muted
  brightness: null, // Not set
  contrast: undefined,
};

console.log('Using ||:');
console.log('  volume:', settings.volume || 50); // 50 (wrong!)
console.log('  brightness:', settings.brightness || 50); // 50

console.log('\nUsing ??:');
console.log('  volume:', settings.volume ?? 50); // 0 (correct!)
console.log('  brightness:', settings.brightness ?? 50); // 50

// ============================================
// 8. COMBINING LOGICAL OPERATORS
// ============================================

console.log('\n=== Combining Operators ===');

// Precedence: ! > && > ||
console.log('!true || false:', !true || false); // false
console.log('!true && false:', !true && false); // false

console.log('\ntrue || false && false:', true || (false && false)); // true
console.log('(true || false) && false:', (true || false) && false); // false

// Complex example
let x = true,
  y = false,
  z = true;
console.log('\nx=true, y=false, z=true');
console.log('x || y && z:', x || (y && z)); // true
console.log('(x || y) && z:', (x || y) && z); // true
console.log('x && y || z:', (x && y) || z); // true

// ============================================
// 9. COMMON PATTERNS
// ============================================

console.log('\n=== Common Patterns ===');

// Default parameter
function greet(name) {
  name = name || 'Guest';
  return 'Hello, ' + name;
}
console.log('greet():', greet());
console.log("greet('John'):", greet('John'));

// Guard clause
function getNestedValue(obj) {
  return obj && obj.level1 && obj.level1.level2 && obj.level1.level2.value;
}
let nested = { level1: { level2: { value: 'found!' } } };
console.log('\nGuard clause:', getNestedValue(nested));
console.log('Guard clause (null):', getNestedValue(null));

// Optional chaining (modern alternative)
console.log('Optional chaining:', nested?.level1?.level2?.value);

// Conditional execution
console.log('\n--- Conditional Execution ---');
let isAdmin = true;
let isActive = true;
isAdmin && console.log('  Admin message logged');
isActive && isAdmin && console.log('  Active admin message logged');

// Toggle boolean
let flag = true;
flag = !flag;
console.log('\nToggle:', flag); // false
flag = !flag;
console.log('Toggle again:', flag); // true

// Existence check
function processValue(value) {
  if (!value) {
    console.log('  Value is falsy:', value);
    return;
  }
  console.log('  Processing:', value);
}
console.log('\n--- Existence Check ---');
processValue(null);
processValue('');
processValue('data');

// Fallback chain
console.log('\n--- Fallback Chain ---');
let primary = null;
let secondary = undefined;
let tertiary = 'fallback';
let result = primary || secondary || tertiary;
console.log('Fallback result:', result);

// ============================================
// 10. PRACTICAL EXAMPLES
// ============================================

console.log('\n=== Practical Examples ===');

// User validation
function isValidUser(user) {
  return !!(user && user.name && user.email);
}
console.log(
  'Valid user:',
  isValidUser({ name: 'John', email: 'john@example.com' })
);
console.log('Invalid user:', isValidUser({ name: 'John' }));
console.log('Null user:', isValidUser(null));

// Configuration with defaults
function createConfig(options) {
  return {
    timeout: options?.timeout ?? 5000,
    retries: options?.retries ?? 3,
    debug: options?.debug ?? false,
  };
}
console.log('\nConfig (empty):', createConfig({}));
console.log(
  'Config (with values):',
  createConfig({ timeout: 1000, debug: true })
);
console.log('Config (zeros):', createConfig({ timeout: 0, retries: 0 }));

// Permission check
function canEdit(user, document) {
  let isOwner = user?.id === document?.ownerId;
  let isAdmin = user?.role === 'admin';
  let isPublic = !document?.private;

  return isOwner || isAdmin || isPublic;
}

let user = { id: 1, role: 'user' };
let doc1 = { ownerId: 1, private: true };
let doc2 = { ownerId: 2, private: false };
let doc3 = { ownerId: 2, private: true };

console.log('\n--- Permission Check ---');
console.log('Own document:', canEdit(user, doc1)); // true (owner)
console.log('Public document:', canEdit(user, doc2)); // true (public)
console.log('Others private:', canEdit(user, doc3)); // false

// Array processing
console.log('\n--- Array Processing ---');
function getFirstItem(arr) {
  return arr && arr.length && arr[0];
}
console.log('First item:', getFirstItem([1, 2, 3]));
console.log('Empty array:', getFirstItem([]));
console.log('Null:', getFirstItem(null));

console.log('\n=== Examples Complete ===');
Examples - JavaScript Tutorial | DeepML