使用控制台.log在对象上出错,在没有原型的情况下创建&&使用字符串属性访问数组有效。如何?



我正在阅读Eloquent JavaScript第三版(https://eloquentjavascript.net/),在第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].push(to);
}
}
for (let [from, to] of edges.map(r => r.split("-"))) {
addEdge(from, to);
addEdge(to, from);
}
return graph;
}

const-roads=["爱丽丝的房子鲍勃的房子","爱丽丝的家邮局","达里亚的房子厄尼的房子"厄尼的家格蕾特的房子","格蕾特房子商店"]所以我试着console.log(roadGraph);

它给了我一个错误:

TypeError: obj.toString is not a function. (In 'obj.toString()', 'obj.toString' is undefined)

然后当我更换时

let graph = Object.create(null);(buildGraph函数中的第2行(

let graph = {};

console.log(roadGraph);

它返回一个期望字符串数组的类似图形的对象。

同时如果我使用let graph=[];当我使用console.log(roadGraph);时,它返回一个空数组

但如果Iconst roadGraph = buildGraph(roads);0,它会正确显示property的值

我需要一位Javascript大师来解释为什么会发生这些事情。

  • 在这个函数中创建一个没有原型的对象的主要原因是什么
  • 为什么我不能同时查看在没有原型的情况下创建的对象的所有属性和值
  • 当我尝试查看值时,它会显示一个空数组,但如果我尝试访问数组中的值,并使用">StringedProperty",它会正确显示StringedProperty的值这是否意味着数组名称/属性可以是字符串(因为我被告知只能使用索引[numbers]访问数组(

在这个函数中创建一个没有原型的对象的主要原因是什么。

该对象是在没有原型的情况下创建的,因此它不会受到原型添加的影响,并且是程序员认为合适的定义的新开始。这并不是真正的必要,但它确实使对象与传统对象更加分离。

为什么我不能同时查看在没有原型的情况下创建的对象的所有属性和值。

这只是因为如果没有原型,对象将无法访问其他对象可以通过其原型链访问的Object.toString()方法。如果您要创建自己的toString函数,或者将现有的函数放在该对象上,那么该对象的属性将能够像其他对象一样转换为字符串。基本上,这是一个副作用或没有原型。它还展示了这到底意味着什么——没有一个传统的对象方法可以在没有变通方法的情况下工作。

当我尝试查看值时,它会显示一个空数组,但如果我尝试访问数组中的值,并使用"Stringed属性",它会正确显示Stringed属性的值。这是否意味着数组名称/属性可以是字符串??(因为我被告知只能使用索引[数字]访问数组(

数组实际上只是普通对象的变体。它们既可以具有字符串索引属性,也可以具有数字索引属性。然而,在大多数情况下不应该这样做,除非您知道自己在做什么,并且正在尝试向数组中添加一个方法。(数组方法,如Array.splice(),都是命名属性;这是在数组上使用命名属性的一个示例(。

最新更新