簡體   English   中英

Javascript通過引用或按值分配數組元素

[英]Javascript assign array elements by reference or by value

有沒有辦法通過引用而不是通過值顯式設置數組元素?

例如,此方法通過值設置數組元素:

方法1

var pushes = [2,1]
for(var i=0; i<pushes.length; i++)
{
   vm.allEmployeesOnJob[i] = vm.allEmployees[pushes[i]];                  
}

並且此方法通過引用設置數組元素:

方法2

var pushes = [2,1]
vm.allEmployeesOnJob = [
                vm.allEmployees[2],
                vm.allEmployees[1]                
              ];

我的用例:

我正在使用angular-bootstrap-duallistbox,為了正確初始化兩個列表框,“ ng-model”數組必須通過引用引用“ ng-options”數組元素。 這是由於我已閱讀的說明中的“ select” DOM元素的行為所致。 我知道第二個是通過引用設置的原因是因為列表框使用該方法可以正確更新,而使用第一個方法則不能正確更新。

有什么區別?

有沒有一種方法可以通過編程將數組元素以編程方式設置為另一個數組的元素?

編輯:

vm.allEmployees是一組雇員對象。

vm.allEmployees的內容:

[      {  
      "employeeId":1,
      "firstName":"Bill",
      "lastName":"Test",
      "email":null,
      "phoneNumber":null,
      "street":"1234 Sesame",
      "city":"New York City",
      "state":"New York",
      "zip":"34555",
      "activeFlag":true,
      "homeLocationId":2,
      "homeLocation":{  
         "locationId":2,
         "customerId":2,
      },
      "displayName":"Bill Test - Newaygo"    },    
 {  
      "employeeId":2,
      "firstName":"Bob",
      "lastName":"Test",
      "email":null,
      "phoneNumber":null,
      "street":"1234 Sesame",
      "city":"New York City",
      "state":"New York",
      "zip":"34555",
      "activeFlag":true,
      "homeLocationId":2,
      "homeLocation":{  
         "locationId":2,
         "customerId":2,
      },
      "displayName":"Bob Test -  Newaygo"    },    
 {  
      "employeeId":4,
      "firstName":"John",
      "lastName":"Doe",
      "email":"testemployee@qas.com",
      "street":"1234 Sesame St",
      "city":"New York City",
      "state":"New York",
      "zip":"34555",
      "activeFlag":true,
      "homeLocationId":2,
      "homeLocation":{  
         "locationId":2,
         "customerId":2,
      },
      "displayName":"John Doe -  Newaygo"    },    
 {  
      "employeeId":5,
      "firstName":"Bill",
      "lastName":"Peterson",
      "email":"bpeterson@test.com",
      "street":"1234 test",
      "city":"test city",
      "state":"Maine",
      "zip":"298379283",
      "activeFlag":false,
      "homeLocationId":2,
      "homeLocation":{  
         "locationId":2,
         "customerId":2,
      },
      "displayName":"Bill Peterson -  Newaygo"    },    
 {  
      "employeeId":6,
      "firstName":"Jim",
      "lastName":"Super",
      "email":"jsuper@qas.com",
      "phoneNumber":"459-456-4455",
      "street":"1234 Sesame St",
      "city":"New York City",
      "state":"New York",
      "zip":"34555",
      "activeFlag":true,
      "homeLocationId":2,
      "homeLocation":{  
         "locationId":2,
         "customerId":2,
      },
      "displayName":"Jim Super -  Newaygo"    } ]

在JavaScript中,對象是通過引用引用的,而所有其他值(無論它們是否在數組中)都是通過值引用的。 您可以將值存儲在對象中,如果需要獲得此行為,則可以引用/傳遞該值。

您下面的兩種方法都可以使用對象,並且具有“按引用”引用。 這兩個摘要驗證:

方法1

 var vm = {}; // Here, the contents of the array are ojbects (by reference) vm.allEmployees = [ { "employeeId":1, "firstName":"Bill", "lastName":"Test", "email":null, "phoneNumber":null, "street":"1234 Sesame", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Bill Test - Newaygo" }, { "employeeId":2, "firstName":"Bob", "lastName":"Test", "email":null, "phoneNumber":null, "street":"1234 Sesame", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Bob Test - Newaygo" }, { "employeeId":4, "firstName":"John", "lastName":"Doe", "email":"testemployee@qas.com", "street":"1234 Sesame St", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"John Doe - Newaygo" }, { "employeeId":5, "firstName":"Bill", "lastName":"Peterson", "email":"bpeterson@test.com", "street":"1234 test", "city":"test city", "state":"Maine", "zip":"298379283", "activeFlag":false, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Bill Peterson - Newaygo" }, { "employeeId":6, "firstName":"Jim", "lastName":"Super", "email":"jsuper@qas.com", "phoneNumber":"459-456-4455", "street":"1234 Sesame St", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Jim Super - Newaygo" } ] vm.allEmployeesOnJob = []; var pushes = [2,1] for(var i=0; i<pushes.length; i++) { vm.allEmployeesOnJob[i] = vm.allEmployees[pushes[i]]; } // The references are by reference: console.log("Are objects in allEmployeesOnJob the same references as allEmployees: " + (vm.allEmployeesOnJob[0] === vm.allEmployees[2] && vm.allEmployeesOnJob[1] === vm.allEmployees[1])); // More evidence: vm.allEmployees[2].employeeId= 999; console.log("allEmployees[2].employeeId= 999. allEmployeesOnJob[0].employeeId is now: " + vm.allEmployeesOnJob[0].employeeId); 

方法2

 var vm = {}; vm.allEmployees = [ { "employeeId":1, "firstName":"Bill", "lastName":"Test", "email":null, "phoneNumber":null, "street":"1234 Sesame", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Bill Test - Newaygo" }, { "employeeId":2, "firstName":"Bob", "lastName":"Test", "email":null, "phoneNumber":null, "street":"1234 Sesame", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Bob Test - Newaygo" }, { "employeeId":4, "firstName":"John", "lastName":"Doe", "email":"testemployee@qas.com", "street":"1234 Sesame St", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"John Doe - Newaygo" }, { "employeeId":5, "firstName":"Bill", "lastName":"Peterson", "email":"bpeterson@test.com", "street":"1234 test", "city":"test city", "state":"Maine", "zip":"298379283", "activeFlag":false, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Bill Peterson - Newaygo" }, { "employeeId":6, "firstName":"Jim", "lastName":"Super", "email":"jsuper@qas.com", "phoneNumber":"459-456-4455", "street":"1234 Sesame St", "city":"New York City", "state":"New York", "zip":"34555", "activeFlag":true, "homeLocationId":2, "homeLocation":{ "locationId":2, "customerId":2, }, "displayName":"Jim Super - Newaygo" } ] var pushes = [2,1] vm.allEmployeesOnJob = [ vm.allEmployees[2], vm.allEmployees[1] ]; console.log("Are objects the same (by ref)? " + (vm.allEmployeesOnJob[0] === vm.allEmployees[2] && vm.allEmployeesOnJob[1] === vm.allEmployees[1])); // Further evidence: vm.allEmployees[2].employeeId = 999; console.log("allEmployees[2].employeeId was changed to 999. What is allEmployeesOnJob[0].employeeId now? " + vm.allEmployeesOnJob[0].employeeId); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM