CTN 02. Hoisting và Rest parameters
Hello! I'm Zu.Doan
Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript. Mình tham khảo các bài tập từ link này.
Bài 1. Xác định kết quả
(function js(x) {
const y = (j) => j * x;
console.log(y(s()));
function s() {
return j();
}
function j() {
return x ** x;
}
})(3);
Lời giải:
(function js(x) {
const y = (j) => j * x; // j = x^x => j * x = x^(x+1)
console.log(y(s())); // In ra kết quả trả về của hàm y(x^x)
function s() {
return j(); // Trả về kết quả của hàm j() => trả về x^x
}
function j() {
return x ** x; // Trả về x^x
}
})(3); // x = 3 => kết quả = 3^4 = 81
Kiến thức liên quan:
- Hoisting sẽ ưu tiên theo thứ tự
declare function>variabledo đó ta có thể thấy là các fnj(), s()được viết ở phía dướiconst ynhưng chương trình vẫn nhận biết được và giá trị trả về của các fn đó.
Bài 2
const x = function (...x) {
let k = (typeof x).length;
let y = () => "freetut".length;
let z = { y: y };
return k - z.y();
};
console.log(Boolean(x()));
Lời giải:
const x = function (...x) {
let k = (typeof x).length;
let y = () => "freetut".length;
let z = { y: y };
return k - z.y();
};
console.log(Boolean(x()));
// gọi hàm x()
// function (...x){} => x = []; // Rest parameters: x là biến bên trong hàm x()
// typeof x = 'object' : lưu ý ở đây là Array là một dạng Object trong JS
// k = (typeof x).length = 'object'.length = 6
// y = () => "freetut".length; <=> y = () => 7
// z = {y: y} <=> z = {y: () => 7} => z.y() = 7
// k - z.y() = 6 - 7 = -1
// Boolean(x()) <=> Boolean(-1) => true
// lưu ý: Boolean(a) = false khi a = 0/''/null/undefined/false & = true cho tất cả trường hợp còn lại
Kiến thức liên quan:
- Rest parameters (...x) - là một trong 2 cách sử dụng của
three dotstrong javascript. (sử dụng trong tham số khai báo của hàm - để tập hợp các phần tử còn lại vào trong một array) - Một cách khác để sử dụng
three dotslàspread operator(sử dụng trong việc để mở rộng một array/object thành một danh sách)
