Đối với một số lý do cho (var i trong Math) {console.log (i)} không hiển thị các mong đợi tan, cos, atan2, E, PI trong Javascript.Tại sao (var i trong Math) không lặp qua Math. * Trong Javascript?
Trả lời
Vì Math
là đối tượng tích hợp có thuộc tính được gắn cờ không thể đếm được. Nhiều đối tượng dựng sẵn có hành vi này, đó là lý do tại sao lặp qua một mảng với for..in
sẽ không cung cấp cho bạn các vấn đề cho đến khi Array.prototype
được mở rộng với các hàm người dùng, luôn được liệt kê theo mặc định.
Cho đến gần đây không thể đếm được là thuộc tính nội bộ không thể truy cập bằng mã Javascript thông thường. Tuy nhiên EMCAScript 5 chỉ định khả năng thiết lập tính khả dụng và khả năng ghi (thử thay đổi giá trị Math.PI
) của bất kỳ thuộc tính đối tượng nào thông qua Object.defineProperty().
Nó cũng cung cấp Object.getOwnPropertyNames() như một cách để có được danh sách tất cả các thuộc tính của đối tượng bất kể tính khả dụng của chúng.
Object.getOwnPropertyNames(Math);
//returns
["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]
Viễn như tôi biết các trình duyệt duy nhất hiện hỗ trợ các chức năng này là Chrome và Safari. Firefox nên hỗ trợ nó ở phiên bản 4. IE9 Tôi không chắc chắn về, nhưng Microsoft đã tuyên bố rằng họ có ý định hỗ trợ tiêu chuẩn EMCAScript 5 cuối cùng.
Tôi không tin rằng có bất kỳ cách nào để mô phỏng chức năng này trong phiên dịch Javascript mà không cần hỗ trợ rõ ràng.
Giống như hầu hết các đối tượng có sẵn trong JavaScript, thuộc tính và phương thức của đối tượng Math
được xác định trong thông số ECMAScript (phần 15.8.1) vì không được đếm thông qua thuộc tính (không thể tiếp cận với tập lệnh) DontEnum
. Trong ECMAScript 5, bạn có thể đánh dấu các thuộc tính và phương thức của các đối tượng của riêng bạn cũng không phải là số cũng:
var o = {};
Object.defineProperty(o, "p", {
enumerable: false,
value: 1
});
Object.defineProperty(o, "q", {
enumerable: true,
value: 2
});
for (var i in o) {
console.log(i + "=>" + o[i]);
}
// q=>2
Các thuộc tính này không thể đếm được.
Từ the MDC documentation on for..in:
A cho ... trong vòng lặp không lặp đối với tài sản gắn liền.
Trong các triển khai JavaScript mới hơn, bạn có thể tạo thuộc tính không thể đếm được của riêng mình. Hãy xem propertyIsEnumerable() và Object.defineProperty().
- 1. Dynamic -ffast-math
- 2. SASS Math Calculation
- 3. Parse Math Expression
- 4. Đẩy mạnh tính toán Math trong Java
- 5. currying Math Các nhà khai thác tại Scala
- 6. 4 Phần tử Vector (3D Math)
- 7. C/C++ Math Order of Operation
- 8. Cambria Math lề trên và dưới lớn
- 9. phát IL để gọi một hàm Math
- 10. Bàn điều khiển Windows% DATE% Math
- 11. Exponential Fit với apache commons math
- 12. Độ lệch chuẩn với Apache Commons Math
- 13. Tại sao 'int i = i;' hợp pháp?
- 14. Lặp qua 'Hashmap' trong JavaScript
- 15. JavaScript Object - Gọi mà không cần tạo nó (như đối tượng Math)
- 16. Math Looping giữa Min và Max Sử dụng Mod?
- 17. Python Math - TypeError: đối tượng 'NoneType' không thể ghi được
- 18. Tại sao sử dụng var {VariableName} = require ('') trong javascript?
- 19. Tại sao i ++++++++ i hợp lệ trong python?
- 20. Tại sao Math.sqrt (i * i) .floor == i?
- 21. Tại sao i = i + 1 nhanh hơn i + +?
- 22. Tại sao đối tượng loại suy luận var chứ không phải XmlNode trong vòng lặp XmlNodeList?
- 23. Fast Vector Math in .NET - Các tùy chọn là gì?
- 24. Sử dụng FloatMath hoặc Math và một diễn viên?
- 25. Làm thế nào để sử dụng Java Math Commons CurveFitter?
- 26. Intel MKL so với Thư viện AMD Math Core
- 27. MySQL Math - Có thể tính toán mối tương quan trong truy vấn không?
- 28. Trình phân tích cú pháp Boolean và Math
- 29. Máy tính xách tay IPython Sympy Math Rendering
- 30. JavaScript nếu var tồn tại
Tôi tự hỏi tại sao ... – You