câu hỏi này rất khó để tóm tắt trong một tiêu đề câu hỏi
CẬP NHẬT Tôi đã tạo một JSFiddle xây dựng một chuỗi bị xáo trộn khỏi đầu vào của bạn dựa trên các chữ cái được trích xuất từ câu hỏi này: Bạn có thể truy cập nó ở đây , hoặc một ý chính sẽ dễ dàng hơn?
Gần đây tôi đã bắt gặp một chút JavaScript thú vị trong hồ sơ này trông giống như thế này:
javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]
Xin lỗi để phá hỏng sự bất ngờ nhưng khi đánh giá nó sẽ trả về điều này:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
Cách thức này hoạt động khi thoát ra, là tạo ra một loạt các tin nhắn và kéo các chữ cái ra khỏi chúng như vậy (sử dụng "tôi" làm ví dụ):
[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"
Các chuỗi khác được tạo bao gồm:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[]) -> "undefined"
Tôi đã quan tâm đến việc tìm một sự thay thế cho "n" và "[" và đã đưa ra điều này:
String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
Tôi cảm thấy theo tinh thần sử dụng 1 và 0, nhưng vi phạm một trong những khía cạnh thanh lịch hơn của mã gốc, đó là sự xuất hiện của việc không liên quan gì đến chuỗi. Có ai khác có ý tưởng làm thế nào để tạo một "v" phù hợp với mã bị xáo trộn ban đầu không?
Dưới đây là một số thông tin bổ sung được tìm thấy sau khi nhiều lập trình viên JavaScript tài năng đã xem xét sâu hơn về điều này
Firefox trả về "Tôi cô đơn" Vì dòng này:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
[1^11<<1]
cắt một ký tự cụ thể từ đây:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
Đánh giá này:
"function test() {
[native code]
}"
Có vẻ như chúng ta có thể có chữ "V" !!!
Chrome trả về "Tôi yêu bạn", bởi vì cùng một mã trả về điều này:
"function test() { [native code] }"
Trước khi câu hỏi được đóng lại để kết nối đáng ngờ với "một vấn đề lập trình thực sự", tôi nghĩ rằng tôi đã thêm một giải pháp tóm tắt được xây dựng trên @ Supr's , @ Cory's và @ alpha123's :
alert([[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+(
[]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+[([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(
!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[
])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[
])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[
])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11
+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<
1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1
)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>
1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]+([,][~1]+[]
)[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])
Với sự phức tạp của mã và thông điệp mà nó tạo ra, nó giống như công cụ JavaScript đang nói bạn cảm thấy đặc biệt như thế nào :)
function test() { [native code] }
đó, sau đó bạn có thể bình thường hóa nó và trích xuất chữ cái bạn muốn