การตัดสินที่สั้นที่สุดในอดีตนั้นเกิดขึ้นจากคุณสมบัติที่ IE ไม่รองรับแท็บแนวตั้ง
การคัดลอกรหัสมีดังนี้:
var ie =!+"/v1";
จำเป็นต้องมีเพียง 7bytes! ดูบทความนี้ "32 ไบต์, EHR ... 9, EHR ... 7 !!! เพื่อทราบว่าเบราว์เซอร์ของคุณคือ" บอกเล่าเรื่องราวของชาวต่างชาติที่ลดการตัดสินของ IE จาก 32 ไบต์เป็น 7 ไบต์! แต่บันทึกนี้ถูกทำลายโดยรัสเซียเมื่อวันที่ 8 มกราคมปีนี้ ตอนนี้ใช้เวลาเพียง 6 ไบต์! มันใช้ความแตกต่างระหว่าง IE และเบราว์เซอร์มาตรฐานในการประมวลผลอาร์เรย์ สำหรับเบราว์เซอร์มาตรฐานหากอักขระสุดท้ายในอาร์เรย์เป็นเครื่องหมายจุลภาคเครื่องยนต์ JS จะลบออกโดยอัตโนมัติ
การคัดลอกรหัสมีดังนี้:
var ie =!-[1,];
รหัสนี้เรียกว่ารหัสการตัดสินที่สั้นที่สุดในโลกก่อน IE9 แม้ว่ารหัสจะสั้น แต่ก็มีความรู้พื้นฐาน JavaScript มากมาย ในตัวอย่างนี้เมื่อมีการดำเนินการรหัสวิธี TOSTRING () ของอาร์เรย์จะถูกเรียกก่อน ดำเนินการ [1,]. ToString () ใน IE6, 7, 8 จะได้รับ "1," จากนั้นการแสดงออกจะกลายเป็น!-"1" จากนั้นลองแปลง "1" เป็นประเภทตัวเลขเพื่อให้ได้ NAN จากนั้นใช้น่านลบเพื่อให้ได้ค่าที่ยังคงอยู่ ในที่สุดก็ดำเนินการ! น่านกลับมาจริง ต่อไปนี้คือการตรวจสอบความรู้ JavaScript ที่เกี่ยวข้องในรหัสโดยการย่อยสลายคำสั่งนี้:
1. ความแตกต่างของการแยกวิเคราะห์ตัวอักษรของเบราว์เซอร์
[1,] หมายความว่าอาร์เรย์ถูกกำหนดโดยใช้ตัวอักษรอาร์เรย์ของ JavaScript ใน IE6, 7, 8 มีสององค์ประกอบของอาร์เรย์และค่าในอาร์เรย์คือ 1 ไม่ได้กำหนด ในเบราว์เซอร์มาตรฐานที่ไม่ได้กำหนดหลังจากองค์ประกอบแรกจะถูกละเว้นและอาร์เรย์มีเพียงองค์ประกอบเดียว 1
2. วิธี ToString () ของอาร์เรย์
เมื่อเรียกใช้วิธีการ ToString () ของวัตถุอาร์เรย์เมธอด toString () จะถูกเรียกใช้ในแต่ละองค์ประกอบในอาร์เรย์ หากค่าขององค์ประกอบเป็นโมฆะหรือไม่ได้กำหนดสตริงที่ว่างเปล่าจะถูกส่งคืนและค่าของแต่ละรายการจะถูกสะกดลงในสตริงคั่นด้วยเครื่องหมายจุลภาค ","
3. ตัวลบหนึ่งต่อ
เมื่อใช้ตัวดำเนินการลบด้วย unary หากหมายเลขการทำงานเป็นประเภทตัวเลขมันจะลบล้างหมายเลขการทำงานโดยตรง มิฉะนั้นคุณจะพยายามแปลงหมายเลขการทำงานเป็นประเภทตัวเลขก่อน กระบวนการแปลงเทียบเท่ากับการดำเนินการฟังก์ชันตัวเลขจากนั้นลบผลลัพธ์
4. การไม่ใช้ตรรกะแบบลอจิคัล
ส่งคืนจริงถ้าตัวถูกดำเนินการเป็นน่าน, โมฆะหรือไม่ได้กำหนดเมื่อดำเนินการแบบไม่ใช้ตรรกะ
JavaScript สามารถเขียนได้เช่นนี้:
การคัดลอกรหัสมีดังนี้:
var ie =!-[1,];
การแจ้งเตือน (เช่น);
หากเราตัดสินจากมุมมองที่ไม่ใช่ของ IE เราสามารถประหยัดได้เพียงเล็กน้อยเพราะเมื่อเราเข้ากันได้ส่วนใหญ่เวลาคือการก่อสร้างที่ไม่ใช่แบบไม่เริ่มต้น var notie = -[1,];
การคัดลอกรหัสมีดังนี้:
ถ้า (-[[1,]) {
การแจ้งเตือน ("นี่ไม่ใช่เบราว์เซอร์!");
}อื่น{
การแจ้งเตือน ("นี่คือเบราว์เซอร์!");
-
จากความรู้ข้างต้นเราสามารถได้รับรหัส var ie =!-[1,]; จริง ๆ แล้วเทียบเท่ากับ var ie =! (-number ([1,]. toString ())); ค่าใน IE6/7/8 เป็นจริง
เพราะ IE6/7/8 จะไม่เพิกเฉยต่อข้อผิดพลาด [1,]. ToString () นั่นคือสิ่งที่คุณได้รับคือ "1,"; และ -number ([1,]. ToString ()) คือ -number ("1,") ผลลัพธ์คือ Nan; จากนั้น! (-จำนวน ([1,]. ToString ())) คือ! (NAN) เป็นจริง หลักฐานของทุกอย่างคือ IE6/7/8 มีข้อผิดพลาด [1,]. toString () => "1," ในขณะที่เบราว์เซอร์อื่น ๆ (ซึ่งควรเป็นส่วนใหญ่ของพวกเขา ~~) คือ [1,]. toString () => "1"
เมื่อเร็ว ๆ นี้ฉันพบว่าเพื่อนใช้สิ่งนี้เพื่อแจ้งให้ผู้ใช้อัพเกรดเบราว์เซอร์ของพวกเขา
<script>!-[1,] && Alert ('คุณกำลังใช้เบราว์เซอร์เวอร์ชัน IE6-8 ขอแนะนำให้ใช้ Chrome, Firefox, IE9+ เพื่อเรียกดูด้วย/n/n!'); </script>