2016-10-03 13 views
6

Gần đây tôi phát hiện ra rằng cú pháp này hoạt động trong JavaScript (Chrome 53):tên phần tử mảng được sử dụng trong định nghĩa hàm

function foo([param1]) { // Function argument is declared as array and param1 is used as variable? What is the name of this syntax? 
    console.log(param1); 
} 

foo(['TestParameter1']); // Case 1 - works. Output: TestParameter1 
foo('TestParameter1'); // Case 2 - works??? Why? Output: TestParameter1 
foo(123);    // Case 3 - does not work - VM860:1 Uncaught TypeError: undefined is not a function(…) 

Result => TestParameter1 // this is the result 

tôi thấy param1 có thể được sử dụng như là biến tham chiếu đến mục với chỉ số 0 trong số đầu tiên (được khai báo là mảng).

Câu hỏi của tôi là:

1) Cú pháp này được đặt tên như thế nào (phần [param1] cho phép bạn sử dụng param1 làm biến)?

2) Tại sao "Case 2" hoạt động? Có bất kỳ chuyển đổi tự động nào không?

+0

cách 'item1' được xác định? – Redu

+0

@Redu nó được định nghĩa như trong ví dụ: function foo ([param1]) {} –

+2

[Destructuring] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment). – Xufox

Trả lời

3

Như @Xufox đã chỉ ra, điều này hoạt động vì destructuring (array destructuring, cụ thể hơn). Ví dụ thứ hai của bạn hoạt động vì một số string is an array-like object, vì vậy bạn nhận được T, là param1[0]. Các số không phải là mảng (hoặc thậm chí là mảng), vì vậy công cụ không thể hủy cấu trúc đối số.

Nếu bạn ép buộc số của bạn thành một chuỗi nó sẽ làm việc:

foo((123).toString()); 
2

Điều này dường như được destructuring như @Xufox một cách chính xác chỉ ra.

thông số chức năng có thể trong thực tế có destructuring:

  1. đi https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
  2. Tìm kiếm văn bản này: Kéo các lĩnh vực từ các đối tượng thông qua như là tham số chức năng
  3. Bây giờ trên cho thấy một ví dụ về loại khác phá hoại, ví dụ được đưa ra bên dưới:

    function userId({id}) { 
        return id; 
    } 
    
    var user = { 
        id: 42, 
        displayName: "jdoe" 
    }; 
    
    console.log("userId: " + userId(user)); // "userId: 42" 
    

tuy nhiên, tôi cho rằng nó áp dụng cho điều này là tốt:

function foo([param1]) { 
    console.log(param1); 
} 

Chênh lệch giữa số nguyên và chuỗi trong hành vi này:

console.log('123'); //works, outputs 1, '123' = ['1', '2', '3'] of chars 
console.log(['123']); //works, outputs 123 
console.log([123]); //works, outputs 123 
console.log(123); //error 

Trong ví dụ trên, vì chuỗi là gì, nhưng một loạt các ký tự , nó hoàn toàn tốt đẹp mà nó hoạt động thực sự.

0

Chính xác như được nói bởi những người tuyệt vời ở trên. Dưới đây là cách máy tính đọc:

foo ('testParamater1') = foo (['testParamater1']);

nhưng ...

foo (123) = foo ([[1,2,3]);

Thật không may cho trường hợp sử dụng cụ thể của bạn, không giống nhau. Lấy làm tiếc!

Các vấn đề liên quan