-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path053-default-parameters-rest.js
More file actions
149 lines (118 loc) · 3.39 KB
/
053-default-parameters-rest.js
File metadata and controls
149 lines (118 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// 1: DEFAULT PARAMETERS
// function greet(name, message) {
// const userName = name || 'Guest';
// const greetMessage = message || 'Welcome!';
// console.log(greetMessage + ' ' + userName);
// }
function greet(name = 'Guest', message = 'Welcome!') {
console.log(message + ' ' + name);
}
greet('John', 'Hello'); // Hello John
greet('Sarah'); // Welcome! Sarah
greet(); // Welcome! Guest
// 2: DEFAULT PARAMETERS WITH EXPRESSIONS
// Using expressions
function createUser(name = 'Anonymous', id = Math.random()) {
return { name, id };
}
console.log(createUser());
// { name: 'Anonymous', id: 0.12345... }
// Reference earlier parameters
function buildMessage(name, greeting = `Hello, ${name}!`) {
console.log(greeting);
}
buildMessage('Sarah'); // Hello, Sarah!
buildMessage('John', 'Welcome'); // Welcome
// Call functions as defaults
function getDefaultPrice() {
return 99.99;
}
function createProduct(name, price = getDefaultPrice()) {
return { name, price };
}
console.log(createProduct('Laptop'));
// { name: 'Laptop', price: 99.99 }
// 3: REST PARAMETERS - THE BASICS
// Old way - using arguments object
function oldSum() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(5, 10, 15, 20)); // 50
// Finding maximum
function findMax(...numbers) {
return Math.max(...numbers);
}
console.log(findMax(45, 23, 89, 12, 67)); // 89
// Filtering values
function sumPositive(...numbers) {
return numbers
.filter(num => num > 0)
.reduce((total, num) => total + num, 0);
}
console.log(sumPositive(5, -3, 8, -1, 12)); // 25
// 4: MIXING REGULAR AND REST PARAMETERS
function introduce(greeting, ...names) {
console.log(greeting);
names.forEach(name => console.log(`- ${name}`));
}
introduce('Team members:', 'Alice', 'Bob', 'Charlie');
// Team members:
// - Alice
// - Bob
// - Charlie
function calculateTotal(discount, ...prices) {
const subtotal = prices.reduce((sum, price) => sum + price, 0);
return subtotal - discount;
}
console.log(calculateTotal(10, 50, 30, 20)); // 90
// 5: COMBINING DEFAULT AND REST PARAMETERS
function createMessage(greeting = 'Hello', ...names) {
if (names.length === 0) {
return `${greeting}, everyone!`;
}
return `${greeting}, ${names.join(', ')}!`;
}
console.log(createMessage());
// Hello, everyone!
console.log(createMessage('Welcome', 'Alice', 'Bob'));
// Welcome, Alice, Bob!
// Practical example
function addToCart(userId, discount = 0, ...items) {
const total = items.reduce((sum, item) => sum + item.price, 0);
const finalPrice = total - (total * discount / 100);
return {
userId,
items: items.length,
total: finalPrice
};
}
const cart = addToCart(
'user456',
10,
{ name: 'Laptop', price: 1000 },
{ name: 'Mouse', price: 50 }
);
console.log(cart);
// { userId: 'user456', items: 2, total: 945 }
// 6: KEY DIFFERENCES - REST VS ARGUMENTS
// arguments object (old way)
function oldWay() {
console.log(Array.isArray(arguments)); // false
// Need to convert to use array methods
const arr = Array.from(arguments);
console.log(arr.map(x => x * 2));
}
// Rest parameters (ES6 way)
function newWay(...args) {
console.log(Array.isArray(args)); // true
console.log(args.map(x => x * 2)); // Works directly!
}
newWay(1, 2, 3); // [2, 4, 6]