Javascript 在没有原型创建的对象上使用console.log时出错&&;使用字符串属性访问阵列已成功。。怎样?
我正在阅读雄辩的JavaScript第3版(),在第7章中,Marjin Haverbeke使用这个函数创建了一个图形数据结构Javascript 在没有原型创建的对象上使用console.log时出错&&;使用字符串属性访问阵列已成功。。怎样?,javascript,data-structures,graph,null,javascript-objects,Javascript,Data Structures,Graph,Null,Javascript Objects,我正在阅读雄辩的JavaScript第3版(),在第7章中,Marjin Haverbeke使用这个函数创建了一个图形数据结构 function buildGraph(edges) { let graph = Object.create(null); function addEdge(from, to) { if (graph[from] == null) { graph[from] = [to]; } else { graph[from].pus
function buildGraph(edges) {
let graph = Object.create(null);
function addEdge(from, to) {
if (graph[from] == null) {
graph[from] = [to];
} else {
graph[from].push(to);
}
}
for (let [from, to] of edges.map(r => r.split("-"))) {
addEdge(from, to);
addEdge(to, from);
}
return graph;
}
康斯特路=[“爱丽丝之家鲍勃之家”、“爱丽丝之家邮局”、“达里亚之家厄尼之家”、“厄尼之家格雷特之家”、“格雷特之家商店”];
const roadGraph=buildGraph(道路)代码>
于是我试着
console.log(道路图)代码>
它给了我这个错误:
TypeError:obj.toString不是函数。(在“obj.toString()”中,“obj.toString”未定义)
然后当我替换
let graph=Object.create(null)代码>(在buildGraph
函数中的第2行)
与
let-graph={}代码>
和console.log(路图)代码>
它返回预期字符串数组的类似图形的对象
同时,如果我使用let graph=[]代码>
当我使用console.log(roadGraph)时,它返回一个空数组代码>
但是如果我console.log(roadGraph.property)代码>它正确显示属性的值
我需要一个Javascript专家来解释为什么会发生这些事情
- 创建此函数中没有原型的对象的主要原因是什么
- 为什么我不能一次查看在没有原型的情况下创建的对象的所有属性和值
- 当我尝试查看值时,它会显示一个空数组,但如果我尝试访问数组中的值,并使用“string属性”,它会正确显示string属性的值。这是否意味着数组名称/属性可以是字符串??(因为我被告知只能使用索引[数字]访问数组)
创建此函数中没有原型的对象的主要原因是什么
function buildGraph(edges) {
let graph = Object.create(null);
function addEdge(from, to) {
if (graph[from] == null) {
graph[from] = [to];
} else {
graph[from].push(to);
}
}
for (let [from, to] of edges.map(r => r.split("-"))) {
addEdge(from, to);
addEdge(to, from);
}
return graph;
}
该对象是在没有原型的情况下创建的,这样它就不会受到原型添加的影响,并且是程序员认为合适的定义的一个新的开始。这不是真的必要,但它确实使对象与传统对象更加分离
为什么我不能一次查看在没有原型的情况下创建的对象的所有属性和值
这仅仅是因为没有原型,对象将无法访问其他对象通过其原型链可以访问的object.toString()
方法。如果要创建自己的toString
函数,或者将现有函数放在该对象上,那么该对象的属性将能够像任何其他对象一样转换为字符串。基本上,这是一个副作用或没有原型。它还显示了它的真正含义——没有解决办法,传统的对象方法都无法处理这个问题
当我尝试查看值时,它会显示一个空数组,但如果我尝试访问数组中的值,它会使用“Stringed属性”正确显示Stringed属性的值。这是否意味着数组名称/属性可以是字符串??(因为我被告知只能使用索引[数字]访问数组)
数组实际上只是普通对象的变体。它们可以具有字符串索引属性和数字索引属性。但是,在大多数情况下不应该这样做,除非您知道自己在做什么,并且正在尝试向数组中添加一个方法。(数组方法,如Array.splice()
,都是命名属性;这就是为什么在数组中使用命名属性会很有用的一个示例)。在使用问题中的代码时,我无法重现错误。使用Chrome。您的代码在Firefox上运行良好。Roadgraph不是一个具有字符串属性的数组,它是一个对象。简言之如果要创建dict/hash,则对象。create(null)
保证不能通过对象实例的原型将属性添加到对象实例中。数组是一个对象,JavaScript中的所有内容都是可变的,因此const arr=[];arr.someKey='some value'
将起作用,但您不应该这样做。变量graph
是一个对象,因为您将使用字符串作为键设置值,JavaScript没有关联数组,只有索引。我认为您可以使用