Điều này nghe có vẻ tầm thường và trên thực tế, nó không quan trọng với ECMAscript 6 giới thiệu một hàm
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
2 mới cho mục đích chính xác này. Tuy nhiên, trước ECMAScript 6, điều này phức tạp hơn một chút, vì không cung cấp phương thức tương đương với phương thức function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
2Vấn đề là, trong đặc tả ECMAScript, các số nguyên chỉ tồn tại về mặt khái niệm; . e. , các giá trị số luôn được lưu trữ dưới dạng giá trị dấu phẩy động
Với ý nghĩ đó, giải pháp tiền ECMAScript-6 đơn giản và rõ ràng nhất [cũng đủ mạnh để trả về
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
4 ngay cả khi một giá trị không phải là số như chuỗi hoặc function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0 được truyền cho hàm] sẽ là cách sử dụng sau đây của function isInteger[x] { return [x ^ 0] === x; }
Giải pháp sau đây cũng sẽ hoạt động, mặc dù không thanh lịch như giải pháp trên
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
Hàm sau [hoặc với
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
1 hoặc function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
2 thay cho function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3] cũng có vẻ hữu ích, nhưng kết quả không hoàn toàn giống với hai hàm trênfunction isInteger[x] { return Math.round[x] === x; }
Sự khác biệt là, các giải pháp dựa trên
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
4 này trả về function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
5 cho function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
6 và function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
7, trong khi các giải pháp khác [và đặc biệt là function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
2 của ES6] trả về function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
4Một giải pháp không chính xác khá phổ biến khác là như sau
function isInteger[x] { return [x ^ 0] === x; }
1Mặc dù cách tiếp cận dựa trên
function isInteger[x] { return Math.round[x] === x; }
0 này sẽ hoạt động tốt với nhiều giá trị của function isInteger[x] { return Math.round[x] === x; }
1, nhưng khi function isInteger[x] { return Math.round[x] === x; }
1 trở nên khá lớn, nó sẽ không hoạt động bình thường. Vấn đề là function isInteger[x] { return Math.round[x] === x; }
3 buộc tham số đầu tiên của nó thành một chuỗi trước khi phân tích các chữ số. Do đó, khi số trở nên đủ lớn, biểu diễn chuỗi của nó sẽ được trình bày ở dạng hàm mũ [e. g. , function isInteger[x] { return Math.round[x] === x; }
4]. Theo đó, sau đó, function isInteger[x] { return Math.round[x] === x; }
3 sẽ cố gắng phân tích cú pháp function isInteger[x] { return Math.round[x] === x; }
4, nhưng sẽ ngừng phân tích cú pháp khi đến ký tự function isInteger[x] { return Math.round[x] === x; }
7 và do đó sẽ trả về giá trị là function isInteger[x] { return Math.round[x] === x; }
8. Quan sát JavaScript là ngôn ngữ lập trình đồng bộ đơn luồng. Nhưng nó thực sự có nghĩa là gì?
Điều đó thực sự có nghĩa là gì khi chúng ta nói JavaScript là một luồng đơn?
Điều đó có nghĩa là luồng chính nơi mã JavaScript được chạy, chạy trên một dòng tại một thời điểm và không có khả năng chạy mã song song
Thí dụ
Javascript
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
7____28function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
9function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
1 function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
2function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3____34function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3____270____271function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
72function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
73function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3____275function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
75function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
78function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
80function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
7____282____29đầu ra
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
1Cấp phát bộ nhớ trong JavaScript
1] Bộ nhớ đống. Dữ liệu được lưu trữ ngẫu nhiên và bộ nhớ được phân bổ
2] Ngăn xếp bộ nhớ. Bộ nhớ được cấp phát dưới dạng ngăn xếp. Chủ yếu được sử dụng cho các chức năng
ngăn xếp cuộc gọi chức năng. Ngăn xếp chức năng là một chức năng theo dõi tất cả các chức năng khác được thực thi trong thời gian chạy. Bạn đã bao giờ thấy dấu vết ngăn xếp được in khi bạn gặp lỗi trong JavaScript chưa. Đó không là gì ngoài một ảnh chụp nhanh ngăn xếp chức năng tại thời điểm xảy ra lỗi
Thí dụ
Javascript
function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
1 function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
85function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3____27____288function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
89function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
75function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
1 function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
93function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3____295function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
75function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
1 function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
99function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
3____301function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
75function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
0function isInteger[x] { return [typeof x === 'number'] && [x % 1 === 0]; }
04Thứ tự tại đó các chức năng được thực thi i. e bị bật ra khỏi ngăn xếp sau khi mục đích của hàm kết thúc như minh họa bên dưới
vòng lặp sự kiện. Vòng lặp sự kiện là thứ kéo nội dung ra khỏi hàng đợi và đặt nó vào ngăn xếp thực thi chức năng bất cứ khi nào ngăn xếp chức năng trống
Vòng lặp sự kiện là bí mật mà JavaScript mang lại cho chúng ta ảo giác là đa luồng mặc dù nó là một luồng. Ảo ảnh dưới đây thể hiện hoạt động tốt của vòng lặp sự kiện
Ở đây, chức năng gọi lại trong hàng đợi sự kiện chưa chạy và đang đợi thời gian vào ngăn xếp khi SetTimeOut[] đang được thực thi và API Web đang chờ đợi được đề cập. Khi ngăn xếp chức năng trống, chức năng sẽ được tải vào ngăn xếp như hình bên dưới
Đó là nơi vòng lặp sự kiện xuất hiện, nó lấy sự kiện đầu tiên từ Hàng đợi sự kiện và đặt nó vào ngăn xếp i. e trong trường hợp này là chức năng gọi lại. Từ đây, hàm này thực hiện gọi các hàm khác bên trong nó, nếu có