为什么函数调用时无法正确传递参数?

问题描述:

var collection = { 
    "5439": { 
     "album": "ABBA Gold" 
    } 
}; 
function updateRecords(id, prop, value) { 
    if(prop !== "tracks" && value !== ""){ 
    collection[id].prop=value; 
    } 
    return collection; 
} 
updateRecords(5439, "artist", "ABBA"); 

为什么结果是Object { album="ABBA Gold", prop="ABBA"}而不是Object { album="ABBA Gold",artist="ABBA"}
当解析collection[id].prop=value;,道具的价值是艺术家,id的值是5439,所以collection[id].prop=value;应解析成collection[5439].artist="ABBA";,为什么不呢?为什么函数调用时无法正确传递参数?

+1

在这里阅读答案:http://stackoverflow.com/questions/4968406/JavaScript的财产ACCES s-dot-notation-vs-brackets – epascarello

使用Bracket notation

object属性名称可以是任何有效的JavaScript字符串或任何可以转换为字符串的字符串,包括空字符串。但是,只能使用方括号表示法访问任何不是有效JavaScript标识符的属性名称(例如,具有空格或连字符的属性名称,或以数字开头的属性名称)。 当要动态确定属性名称时,此符号也非常有用(直到运行时才确定属性名称)。

collection[id][prop] = value; 

代替,

collection[id].prop=value; 
+0

为什么'artist'不能将prop的值传递到集合[id] .prop中,使其成为'collection [id]。“artist”'? –

+0

@it_is_a_literature:这正是支架符号所做的:动态属性名称。你已经用这种方式来使用'id'。同样的事情适用于'prop'。 – Thilo

+5

因为在世界上是如何解析应该知道你的意思是一个变量而不是字符串?这就是点和括号表示法的工作原理。 – epascarello

更改的行collection[id].prop=value;

collection[id][prop]=value;

var collection = { 
    "5439": { 
    "album": "ABBA Gold" 
    } 
}; 

function updateRecords(id, prop, value) { 
    if (prop !== "tracks" && value !== "") { 
    collection[id][prop] = value; 
    } 
    return collection; 
} 
updateRecords(5439, "artist", "ABBA");