cuốn sách gpt4 ai đã làm

javascript - Điều gì xảy ra với `let:let{let:[x=1]}=[alert(1)]`?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 20:40:53 26 4
mua khóa gpt4 Nike

我在看một cuộc nói chuyện về việc chiếm quyền điều khiển JSONChưa đầy 2 phút đã có sẵn JavaScript mà tôi chưa quen.

let:let{let:[x=1]}=[cảnh báo(1)]

Nó dường như hoạt động trên Edge và chỉ cảnh báo 1, nhưng tôi chưa bao giờ gặp phải hãy: hãy để ngữ pháp. Tôi tò mò, tôi nên đọc bài viết này như thế nào?

câu trả lời hay nhất

Video thực sự nói rằng nó sử dụng phá hủy bài tậplabels .

Mã này dường như không hoạt động trong các trình duyệt khác ngoài Edge; vì vậy để nó hoạt động trong các trình duyệt khác, nó cần phải trông như thế này:

hãy:{let{let:[x=1]}=[cảnh báo(1)]}

Tại sao? Chúng ta hãy nhìn vào bảng điều khiển Firefox:

Lỗi cú pháp: khai báo từ vựng không thể xuất hiện trong ngữ cảnh câu lệnh đơn

"Bối cảnh câu lệnh đơn" mà lỗi đề cập đến làcho phép:Phần mở đầu— hãy{let:[x=1]}=[cảnh báo(1)]. trong trường hợp này,cho phép 是一个 label. Không có từ khóa nào khác có vẻ hoạt động như thẻ:

var: while(false); // => Lỗi cú pháp: thiếu tên biến
for: while(false); // => Lỗi cú pháp: thiếu ( sau for

Tuy nhiên, một số trong số chúng hoạt động:

năng suất: while(false);
không đồng bộ: while(false);
đang chờ: while(false);

hiện hữuchế độ nghiêm ngặt然而,cho phépnăng suất cũng sẽ thất bại với Cú phápLỗi: [từ khóa] là một định danh dành riêng .

Bây giờ, phần còn lại của mã sử dụng tính cấu trúc:

cho phép {
hãy: [x = 1]
} = [
cảnh báo(1)
];

{ } TRONG cho phép Nó chỉ đại diện cho một thuộc tính đối tượng, điều này hoàn toàn ổn. Sau đây là JS hợp lệ:

hãy để đối tượng = {
hãy: 2,
biến: 1,
const: "xin chào",
trong khi: đúng,
ném: Lỗi
};

cảnh báo(1) được thực thi, vì vậy bạn sẽ thấy cảnh báo. Kết quả tính toán của nó là undefined, vậy bạn có:

hãy để {let: [x = 1]} = [không xác định];

Bây giờ nó cố gắng để có được [không xác định] của cho phép thuộc tính, bản thân nó là undefined. Hơn nữa, dòng này cố gắng lấy giá trị của thuộc tính và tiếp tục cấu trúc nó thành một mảng (vì vậy giá trị phải là một giá trị có thể lặp lại) có phần tử đầu tiên có tên biến là x , trong đó giá trị mặc định 1. bởi vì[không xác định].letĐúngundefined, không thể bị hủy cấu trúc, do đó mã sẽ báo lỗi:

Lỗi Loại: […].let không được xác định


Công việc Phá hủy có thể trông giống như một trong những dòng sau:

let {let: [x = 1]} = {let: [alert(1)]}; // x hiện là 1 (giá trị mặc định, vì phần tử đầu tiên ở phía bên phải không được xác định)
let {let: [x = 1]} = {let: [2]}; // x bây giờ là 2 (được xác định do vế phải)

Sẽ không có lỗi, lần đầu tiên sẽ1được giao chox, vì phần tử đầu tiên trong mảng bên phải làkhông xác định.


Một phần của sự nhầm lẫn có thể xuất phát từ việc phá hủy lồng nhau, chẳng hạn như hai đoạn mã sau:

hãy để {a: {b: {c}}} = {a: {b: {c: 3}}}
hãy để {a: {b: {c = 1}}} = {a: {b: {c: 3}}}

Ở đây, không có biến nào được tạoMộthoặcb,chỉ mộtc, tức là đằng sau没有Mã định danh được chuyển qua bên trái :. gót chân : Tên thuộc tính về cơ bản chỉ ra giá trị được gán cho"Thuộc tính này được tìm thấy ở đúng giá trị".

Về javascript - điều gì đã xảy ra với `let:let{let:[x=1]}=[alert(1)]`? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/49604335/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress