JSLint nói rằng thiếu thông số cơ số radix


538

Tôi đã chạy JSLint trên mã JavaScript này và nó nói:

Sự cố ở dòng 32 ký tự 30: Thiếu tham số cơ số.

Đây là mã trong câu hỏi:

imageIndex = parseInt(id.substring(id.length - 1))-1;

Có chuyện gì ở đây vậy?

Câu trả lời:


967

Nó luôn luôn là một thực hành tốt để vượt qua cơ số với parseInt -

parseInt(string, radix)

Cho số thập phân -

parseInt(id.substring(id.length - 1), 10)

Nếu tham số cơ số bị bỏ qua, JavaScript sẽ thừa nhận như sau:

  • Nếu chuỗi bắt đầu bằng "0x", cơ số là 16 (thập lục phân)
  • Nếu chuỗi bắt đầu bằng "0", cơ số là 8 (bát phân). Tính năng này không được dùng nữa
  • Nếu chuỗi bắt đầu bằng bất kỳ giá trị nào khác, cơ số là 10 (thập phân)

( Tham khảo )


7
Từ âm thanh của nó, IS 10. mặc định, nếu nó không bắt đầu bằng 0x hoặc 0, thì nó mặc định là một cơ số 10. Nhưng cách tốt nhất là chỉ định một cơ số ngay cả khi đó là giá trị mặc định, giống như chỉ định định nghĩa của "this" cho hàm Array.map.
molson504x

81
điều đó thật vô lý ... bởi logic đó nên có một thông số thứ ba để thể hiện cơ số của chính đối số cơ số
Nishant

6
Đồng ý với những người bình luận khác. Tại sao nó tốt để cung cấp một giá trị cơ số khi mặc định là 10? Điều này bất chấp quy ước chung.
Richard Clayton

9
Thêm 10 làm cơ số để nhận thêm một lỗi lint ...Redundant radix parameter
Shanimal

2
@Nishant: Đối radixsố là một giá trị số, không phải là biểu diễn chuỗi của một giá trị số, do đó không có cơ số để chỉ định.
tokland

79

Để tránh cảnh báo này, thay vì sử dụng:

parseInt("999", 10);

Bạn có thể thay thế nó bằng cách:

Number("999");


Lưu ý rằng parseInt và Number có các hành vi khác nhau , nhưng trong một số trường hợp, người ta có thể thay thế người khác.


4
Ngoài ra còn có sự khác biệt hiệu suất lớn giữa parseIntNumber. Đây là một bài kiểm tra hiệu suất cũ .
Josh Unger

3
Chrome 77: Number()nhanh hơn 6 lần so vớiparseInt()
Zanon

1
Đây là giải pháp sạch mà hoạt động tốt.
thanos.a

43

Tôi không trả lời đúng câu hỏi, nhưng, tôi nghĩ thật rõ ràng tại sao chúng ta nên chỉ định cơ số .

Trên tài liệu MDN chúng ta có thể đọc rằng:

Nếu cơ số không được xác định hoặc 0 (hoặc vắng mặt), JavaScript sẽ thừa nhận như sau:

  • [...]
  • Nếu chuỗi đầu vào bắt đầu bằng "0", cơ số là tám (bát phân) hoặc 10 (thập phân). Chính xác mà cơ số được chọn là phụ thuộc vào việc thực hiện. ECMAScript 5 chỉ định rằng 10 (thập phân) được sử dụng, nhưng không phải tất cả các trình duyệt đều hỗ trợ điều này. Vì lý do này, luôn luôn chỉ định một cơ số khi sử dụng parseInt.
  • [...]

Nguồn: MDN parseInt ()


1
Có nhưng trình biên dịch Typecript sẽ chèn nó, vậy tại sao bạn phải bận tâm?
Spock

2
@Spock Vì TSLint phàn nàn rằng nó không có ở đó. Và xuống hố thỏ chúng ta đi ...
msanford

Vâng đúng .. đó là lý do tại sao tôi chỉ vô hiệu hóa quy tắc lint này. Vẫn không hiểu tại sao một tham số TÙY CHỌN lại vấp phải một khiếu nại .. ồ tốt
Spock

4
@Spock Luôn chỉ định tham số này để loại bỏ sự nhầm lẫn của người đọc và để đảm bảo hành vi có thể dự đoán được. Việc triển khai khác nhau tạo ra kết quả khác nhau khi cơ số không được chỉ định, thường mặc định giá trị là 10. Tham khảo
Andrew Lam

27

Bạn có thể tắt quy tắc này nếu bạn muốn bỏ qua bài kiểm tra đó.

Chèn:

radix: false

Theo thuộc tính " rules" trong tslint.jsontệp.

Bạn không nên làm điều đó nếu bạn không hiểu ngoại lệ này.


1
Tôi sẽ sử dụng điều này vì mã chỉ chạy tốt mà không cần cơ số
William

22

Thêm phần sau vào đầu tệp JS của bạn sẽ báo cho JSHint để thay thế cảnh báo cơ số:

/*jshint -W065 */

Xem thêm: http://jshint.com/docs/#options


2
Tùy chọn jshint này không tương ứng với? Tôi đang sử dụng SublimeLint để chạy jshint trong trình chỉnh sửa của mình và nó chỉ mất một hàm tùy chọn: các cặp giá trị cho cài đặt của nó, vì vậy tôi không nghĩ rằng tôi có thể áp dụng đề xuất "-W065" của bạn.
Dih thờ

5
Bạn có thể sử dụng "-W065": true, ví dụ trong một .jshintrctập tin.
alexfernandez

29
-1 Xin đừng làm điều này, chỉ cần thêm cơ số bạn muốn phân tích
Juan Mendes

Một ngôn ngữ được gõ mạnh hơn, càng có nhiều cơ hội để tối ưu hóa trình biên dịch, đó là lý do tại sao nó được đưa ra cảnh báo.
Hold OfferHunger

3
trong JS hiện đại, IMO thêm cơ số thực sự làm cho nó không rõ ràng hơn về chức năng đang làm gì. Đó là ở vị trí bạn có thể mong đợi mặc định sẽ đi nếu bạn không biết chữ ký hàm. Không có nghĩa là bạn phải chỉ định một cơ số.
Charles Offenbacher

5

Tôi đã giải quyết nó chỉ bằng cách sử dụng + foo, để chuyển đổi chuỗi.

Hãy nhớ rằng nó không tuyệt vời cho khả năng đọc (sửa chữa bẩn).

console.log( +'1' )
// 1 (int)

3

Bạn cũng có thể chỉ cần thêm dòng này ngay phía trên dòng parseInt của bạn:

// eslint-disable-next-line

Điều này sẽ vô hiệu hóa kiểm tra eslint cho dòng tiếp theo. Sử dụng điều này nếu bạn chỉ cần bỏ qua một hoặc hai dòng.


2

Chỉ cần đặt một chuỗi rỗng vào vị trí cơ số, bởi vì parseInt () có hai đối số:

parseInt (chuỗi, cơ số);

chuỗi Giá trị để phân tích cú pháp. Nếu đối số chuỗi không phải là một chuỗi, thì nó được chuyển đổi thành một chuỗi (sử dụng thao tác trừu tượng ToString). Khoảng trắng hàng đầu trong đối số chuỗi được bỏ qua.

cơ số Một số nguyên từ 2 đến 36 đại diện cho cơ số (cơ sở trong các hệ thống số toán học) của chuỗi đã đề cập ở trên. Chỉ định 10 cho hệ thống số thập phân thường được sử dụng bởi con người. Luôn chỉ định tham số này để loại bỏ sự nhầm lẫn của người đọc và để đảm bảo hành vi có thể dự đoán được. Việc triển khai khác nhau tạo ra kết quả khác nhau khi cơ số không được chỉ định, thường mặc định giá trị là 10.

imageIndex = parseInt (id.sub chuỗi (id.length - 1)) - 1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;


2

Chỉ cần thêm quy tắc tùy chỉnh của bạn trong .eslintrc trông giống như vậy "radix": "off" và bạn sẽ không bị cảnh báo mất trí nhớ này. Đây là cho kẻ nói dối eslint.


1

Trước ECMAScript 5, parseInt () cũng tự động phát hiện các chữ bát phân, gây ra vấn đề vì nhiều nhà phát triển giả định số 0 đứng đầu sẽ bị bỏ qua.

Vì vậy, thay vì:

var num = parseInt("071");      // 57

Làm cái này:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

Tài liệu tham khảo


0

Thay vì gọi substringhàm bạn có thể sử dụng.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

Ở đây, -1 trong lát chỉ ra rằng để bắt đầu lát từ chỉ mục cuối cùng.

Cảm ơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.