javascript
examples
examples.js⚡javascript
/**
* ============================================
* 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 ===');