2013-03-20 41 views

Trả lời

2

Sau khi tìm hiểu thêm, tôi tìm thấy điều này trong đặc tả ECMAScript. http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Khi chức năng parseInt được gọi, các bước sau đây được thực hiện:

  1. Hãy inputString được ToString (string).
  2. Cho S là chuỗi con mới được tạo của inputString bao gồm ký tự đầu tiên không phải là StrWhiteSpaceChar và tất cả ký tự sau ký tự đó. (Nói cách khác, loại bỏ không gian màu trắng hàng đầu .) Nếu inputString không chứa bất kỳ ký tự nào như vậy, hãy S là chuỗi rỗng.
  3. Để ký hiệu là 1.
  4. Nếu S không trống và ký tự đầu tiên của S là dấu trừ - hãy ký là 1.
  5. Nếu S không trống và ký tự đầu tiên của S là dấu cộng + hoặc dấu trừ -, sau đó xóa ký tự đầu tiên từ S.
  6. Cho R = ToInt32 (cơ số).
  7. Cho phép stripPrefix là đúng.
  8. Nếu R  0, thì © Ecma International 2011 105 a. Nếu R < 2 hoặc R> 36, sau đó trả về NaN. b. Nếu R  16, hãy để stripPrefix là sai.
  9. Khác, R = 0 a. Hãy để R = 10.
  10. Nếu stripPrefix là đúng, sau đó a. Nếu độ dài của S ít nhất là 2 và hai ký tự đầu tiên của S là ―0x‖ hoặc ―0X‖, sau đó xóa hai ký tự đầu tiên từ S và để R = 16.
  11. Nếu S chứa bất kỳ ký tự nào không phải là chữ số rix, sau đó cho Z là chuỗi con của S bao gồm tất cả các ký tự trước ký tự đầu tiên; nếu không, hãy cho Z là S.
  12. Nếu Z trống, trả về NaN.
  13. Cho phép mathInt là giá trị số nguyên toán học được biểu diễn bằng Z trong ký hiệu radix-R, sử dụng các ký tự A-Z và a-z cho các chữ số có giá trị từ 10 đến 35.(Tuy nhiên, nếu R là 10 và Z chứa hơn 20 chữ số có nghĩa, mọi chữ số quan trọng sau ngày 20 có thể được thay thế bằng 0 chữ số, tùy chọn triển khai và nếu R không phải là 2, 4, 8, 10, 16 hoặc 32, sau đó mathInt có thể là một xấp xỉ phụ thuộc triển khai thực hiện với giá trị số nguyên toán học được biểu diễn bằng Z trong ký hiệu radix-R.)
    1. Cho số là giá trị Số cho mathInt.
    2. Dấu hiệu trả về  số. CHÚ Ý parseInt có thể chỉ diễn giải phần đầu của chuỗi dưới dạng giá trị số nguyên; nó bỏ qua bất kỳ ký tự nào mà không thể được hiểu là một phần của ký hiệu của một số nguyên và không có dấu hiệu nào cho biết rằng bất kỳ ký tự nào như vậy đều bị bỏ qua .

Khi chức năng parseFloat được gọi, các bước sau đây được thực hiện:

  1. Hãy inputString được ToString (string).
  2. Hãy để trimmedString là chuỗi con của inputString bao gồm ký tự ngoài cùng bên trái không phải là StrWhiteSpaceChar và tất cả ký tự ở bên phải ký tự đó. (Nói cách khác, loại bỏ không gian màu trắng hàng đầu .) Nếu inputString không chứa bất kỳ ký tự nào như vậy, hãy để trimmedString là chuỗi rỗng.
  3. Nếu cả trimmedString lẫn bất kỳ tiền tố nào của trimmedString đều không thỏa mãn cú pháp của StrDecimalLiteral (xem 9.3.1), trả về NaN.
  4. Hãy để numberString là tiền tố dài nhất của trimmedString, có thể được cắt chính nó, đáp ứng cú pháp của StrDecimalLiteral.
  5. Trả lại giá trị Số cho MV của chuỗi số.

CHÚ THÍCH parseFloat chỉ có thể giải thích một phần hàng đầu của chuỗi dưới dạng giá trị Số; nó bỏ qua bất kỳ ký tự nào mà không thể diễn giải là như là một phần của ký hiệu chữ số thập phân và không có dấu hiệu nào cho biết rằng bất kỳ ký tự nào như vậy đều bị bỏ qua .

Trả về true nếu đối số kết hợp với NaN và ngược lại trả về false.

  1. Nếu ToNumber (số) là NaN, trả về true.
  2. Nếu không, hãy trả về false. CHÚ Ý Một cách đáng tin cậy cho mã ECMAScript để kiểm tra nếu một giá trị X là một NaN là biểu thức của biểu mẫu X! == X. Kết quả sẽ đúng nếu và chỉ khi X là một NaN.
+0

Lưu ý rằng đây là thuật toán để theo dõi, và mỗi trình duyệt/động cơ JS riêng biệt thực thi nó khi trình duyệt/người tạo động cơ thấy vừa với ngôn ngữ được chọn . – ajp15243

6

Họ là những chức năng có nguồn gốc, và có thể được mã hóa bằng ngôn ngữ cơ JS của bạn được viết bằng - bạn cần phải liên hệ với đó là nguồn.

Tuy nhiên, có thể bạn quan tâm hơn đến số EcmaScript specification mô tả cách các thuật toán hoạt động.

Và nếu bạn may mắn, đối với một số chức năng bạn thậm chí có thể tìm thấy một tương đương JS. Bạn sẽ tìm thấy chúng hầu hết trên các trang kiểm tra việc triển khai ES so với tiêu chuẩn.

+1

Yep this. Điều quan trọng cần lưu ý là các hàm đó không được triển khai trong JavaScript_. 'console.log (parseInt) // => function parseInt() {[native code]}' –

+1

@AlexWayne: Trên thực tế, một số trong số chúng * được * triển khai với JS: http://code.google.com/p/ v8/source/browse/trunk/src/v8natives.js – Bergi

+2

Tôi cho rằng "một số" hoặc "nhất" sẽ chính xác hơn :) –

0

Các chức năng này thực hiện cụ thể tùy thuộc vào trình duyệt và không được viết bằng JS (trừ khi ai đó quyết định viết một công cụ trình duyệt trong JS). Mã này không được bảo đảm giống nhau trên các môi trường, mặc dù chúng phải (theo lý thuyết) tuân theo đặc tả ECMAScript cho hành vi của chúng.

Các vấn đề liên quan