JSLint พูดว่า "หายไปพารามิเตอร์ radix"


538

ฉันรัน JSLint บนโค้ด JavaScript นี้และมันบอกว่า:

ปัญหาที่บรรทัด 32 อักขระ 30: ไม่มีพารามิเตอร์ radix

นี่คือรหัสคำถาม:

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

เกิดอะไรขึ้นที่นี่?

คำตอบ:


967

มันเป็นแนวปฏิบัติที่ดีในการส่งผ่าน radix ด้วย parseInt -

parseInt(string, radix)

สำหรับทศนิยม -

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

หากละเว้นพารามิเตอร์ radix JavaScript จะถือว่าสิ่งต่อไปนี้:

  • หากสตริงขึ้นต้นด้วย "0x" radix คือ 16 (เลขฐานสิบหก)
  • หากสตริงเริ่มต้นด้วย "0" radix คือ 8 (ฐานแปด) คุณสมบัตินี้เลิกใช้แล้ว
  • หากสตริงขึ้นต้นด้วยค่าอื่น ๆ เลขฐานคือ 10 (ฐานสิบ)

( อ้างอิง )


7
จากเสียงของมันค่าเริ่มต้นคือ 10 ถ้ามันไม่ได้เริ่มต้นด้วย 0x หรือ 0 มันจะมีค่าเริ่มต้นเป็น Radix ที่ 10 แต่วิธีที่ดีที่สุดคือการระบุ Radix แม้ว่ามันจะเป็นค่าเริ่มต้นก็ตาม การระบุคำจำกัดความของ "this" ไปยังฟังก์ชัน array.map
molson504x

81
นั่นเป็นเหตุผลที่ไม่สมควร ... โดยตรรกะนั้นควรจะมีหนึ่งในสามพารามิเตอร์เพื่อเป็นตัวแทน Radix ของการโต้แย้ง radix ตัวเอง
Nishant

6
เห็นด้วยกับผู้แสดงความคิดเห็นอื่น ๆ ทำไมจึงดีที่จะให้ค่า radix เมื่อค่าเริ่มต้นคือ 10 สิ่งนี้ท้าทายการประชุมสามัญ
Richard Clayton

9
เพิ่ม 10 เป็น radix เพื่อให้ได้ข้อผิดพลาด lint อีกครั้ง ...Redundant radix parameter
Shanimal

2
@Nishant: radixอาร์กิวเมนต์เป็นค่าตัวเลขไม่ใช่การแสดงสตริงของค่าตัวเลขดังนั้นจึงไม่มีเลขฐานที่ระบุ
tokland

79

เพื่อหลีกเลี่ยงคำเตือนนี้แทนที่จะใช้:

parseInt("999", 10);

คุณสามารถแทนที่โดย:

Number("999");


โปรดทราบว่าการแยกวิเคราะห์และหมายเลขมีพฤติกรรมที่แตกต่างกันแต่ในบางกรณีหนึ่งสามารถแทนที่อื่น ๆ


4
นอกจากนี้ยังมีความแตกต่างของผลการดำเนินงานใหญ่ระหว่างและparseInt Numberนี่คือการทดสอบประสิทธิภาพเก่า
Josh Unger

3
Chrome 77: Number()เร็วกว่า 6x 6 เท่าparseInt()
Zanon

1
นี่คือวิธีแก้ปัญหาที่สะอาดซึ่งใช้งานได้ดี
thanos.a

43

ฉันตอบคำถามไม่ถูกต้อง แต่ฉันคิดว่ามันสมเหตุสมผลที่จะอธิบายว่าทำไมเราควรระบุเลขฐานสิบ

ในเอกสาร MDN เราสามารถอ่านได้ว่า:

หาก radix ไม่ได้ถูกกำหนดหรือ 0 (หรือขาด) JavaScript จะถือว่าสิ่งต่อไปนี้:

  • [ ... ]
  • หากสตริงอินพุตเริ่มต้นด้วย "0" radix คือแปด (ฐานแปด) หรือ 10 (ทศนิยม) การเลือก Radix ใดขึ้นอยู่กับการนำไปใช้งาน ECMAScript 5 ระบุว่ามีการใช้ 10 (ทศนิยม) แต่เบราว์เซอร์บางตัวยังไม่รองรับ ด้วยเหตุผลนี้ให้ระบุ radix เสมอเมื่อใช้ parseInt
  • [ ... ]

ที่มา: MDN parseInt ()


1
ใช่ แต่คอมไพเลอร์ typescript จะแทรกไว้ดังนั้นทำไมคุณต้องรำคาญ?
สป็อค

2
@ สป็อคเพราะ TSLint บ่นว่ามันไม่ได้มี และลงไปที่โพรงกระต่ายเราไป ...
msanford

ใช่แล้ว .. นั่นเป็นเหตุผลที่ฉันเพิ่งปิดการใช้งานกฎผ้าสำลี ยังไม่เข้าใจว่าทำไมพารามิเตอร์ทางเลือกจึงส่งเรื่องร้องเรียนไปได้ .. โอเค
สป็อค

4
@Spock ระบุพารามิเตอร์นี้เสมอเพื่อกำจัดความสับสนของผู้อ่านและรับประกันพฤติกรรมที่คาดการณ์ได้ การใช้งานที่แตกต่างกันจะให้ผลลัพธ์ที่แตกต่างกันเมื่อไม่ได้ระบุ Radix โดยปกติแล้วจะเป็นการกำหนดค่าเริ่มต้นที่ 10 การอ้างอิง
Andrew Lam

27

คุณสามารถปิดกฎนี้หากคุณต้องการข้ามการทดสอบ

แทรก:

radix: false

ภายใต้rulesคุณสมบัติ "" ในtslint.jsonไฟล์

ไม่แนะนำให้ทำเช่นนั้นหากคุณไม่เข้าใจข้อยกเว้นนี้


1
ฉันจะใช้นี้ตั้งแต่รหัสวิ่งได้ดีโดยไม่ต้อง Radix
วิลเลียม

22

การเพิ่มสิ่งต่อไปนี้ที่ด้านบนของไฟล์ JS ของคุณจะบอกให้ JSHint ระงับคำเตือน radix:

/*jshint -W065 */

ดูเพิ่มเติมที่: http://jshint.com/docs/#options


2
ตัวเลือก jshint นี้ตรงกับอะไร? ฉันใช้ SublimeLint เพื่อรัน jshint ในโปรแกรมแก้ไขของฉันและใช้ตัวเลือกแฮช: คู่ค่าสำหรับการตั้งค่าดังนั้นฉันไม่คิดว่าฉันจะสามารถใช้คำแนะนำ "-W065" ของคุณได้
Dihedral

5
คุณสามารถใช้"-W065": trueเช่นใน.jshintrcไฟล์
alexfernandez

29
-1 โปรดอย่าทำเช่นนี้เพียงเพิ่มเลขฐานที่คุณต้องการแยกวิเคราะห์
Juan Mendes

ยิ่งพิมพ์ภาษาอย่างรุนแรงยิ่งมีโอกาสมากขึ้นในการปรับแต่งคอมไพเลอร์ซึ่งเป็นสาเหตุที่ทำให้เกิดการเตือน
HoldOffHunger

3
ใน JS สมัยใหม่ IMO เพิ่ม radix จริงทำให้ชัดเจนยิ่งขึ้นสิ่งที่ฟังก์ชั่นการทำ มันอยู่ในตำแหน่งที่คุณอาจคาดหวังว่าจะเป็นค่าเริ่มต้นถ้าคุณไม่รู้ลายเซ็นของฟังก์ชัน มันไม่มีเหตุผลที่คุณจะต้องระบุ radix
Charles Offenbacher

5

ฉันแก้ไขมันด้วยการใช้ + foo เพื่อแปลงสตริง

โปรดทราบว่ามันไม่ดีสำหรับการอ่าน (การแก้ไขสกปรก)

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

3

นอกจากนี้คุณยังสามารถเพิ่มบรรทัดนี้เหนือบรรทัด parseInt ของคุณ:

// eslint-disable-next-line

นี่จะปิดการตรวจสอบ eslint สำหรับบรรทัดถัดไป ใช้สิ่งนี้หากคุณต้องการข้ามเพียงหนึ่งหรือสองบรรทัด


2

เพียงแค่ใส่สตริงว่างในสถานที่ radix เพราะ parseInt () ใช้เวลาสองข้อโต้แย้ง:

parseInt (สตริง radix);

string ค่าที่จะวิเคราะห์ หากอาร์กิวเมนต์สตริงไม่ใช่สตริงดังนั้นจะถูกแปลงเป็นสตริง (ใช้การดำเนินการนามธรรม ToString) ช่องว่างนำหน้าในอาร์กิวเมนต์สตริงจะถูกละเว้น

radix จำนวนเต็มระหว่าง 2 ถึง 36 ที่แสดงถึงฐาน (ฐานในระบบตัวเลขทางคณิตศาสตร์) ของสตริงที่กล่าวถึงข้างต้น ระบุ 10 สำหรับระบบเลขฐานสิบที่มนุษย์ใช้กันทั่วไป ระบุพารามิเตอร์นี้เสมอเพื่อกำจัดความสับสนของผู้อ่านและเพื่อรับประกันพฤติกรรมที่คาดการณ์ได้ การนำไปใช้งานที่ต่างกันจะให้ผลลัพธ์ที่แตกต่างกันเมื่อไม่ได้ระบุ radix โดยปกติแล้วจะทำการกำหนดค่าเป็น 10

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


2

เพียงเพิ่มกฎที่กำหนดเองของคุณใน. eslintrc ซึ่งมีลักษณะเช่นนั้น "radix": "off" และคุณจะไม่มีคำเตือนเกี่ยวกับอุปกรณ์เสริมความจำ eslint นี้ นี่คือส่วนที่เหลือของ Eslint


1

ก่อนหน้า ECMAScript 5 parseInt () จะตรวจสอบตัวอักษรฐานแปดอัตโนมัติซึ่งทำให้เกิดปัญหาเนื่องจากนักพัฒนาหลายคนคิดว่า 0 ที่นำหน้าจะถูกละเว้น

ดังนั้นแทนที่จะ:

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

ทำเช่นนี้:

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

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

var num = parseFloat(someValue); 

การอ้างอิง


0

แทนที่จะเรียกใช้substringฟังก์ชันที่คุณสามารถใช้ได้.slice()

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

ที่นี่ -1 ในชิ้นระบุว่าจะเริ่มชิ้นจากดัชนีล่าสุด

ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.