gpt4 book ai didi

javascript - 在没有原型(prototype)的情况下创建的对象上使用 console.log 时出错 && 访问具有字符串属性的数组有效..如何?

转载 作者:行者123 更新时间:2023-11-29 23:11:02 26 4
gpt4 key购买 nike

我正在阅读 Eloquent JavaScript 第 3 版(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 = ["Alice's House-Bob's House", "Alice's House-Post Office", "Daria's House-Ernie's House", "Ernie's House-Grete's House", "Grete's House-Shop"];

const roadGraph = buildGraph(roads);

然后我尝试了 console.log(roadGraph);

它给了我这个错误:

类型错误:obj.toString 不是一个函数。 (在 'obj.toString()' 中,'obj.toString' 未定义)

然后当我替换

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

让图 = {};

console.log(roadGraph);

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

同时,如果我使用 let graph=[];当我使用 console.log(roadGraph);

时,它返回一个空数组

但是如果我 console.log(roadGraph.property); 它会正确显示 property

的值

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

  • 在此函数中创建没有原型(prototype)的对象的主要原因是什么。
  • 为什么我不能一次查看在没有原型(prototype)的情况下创建的对象的所有属性和值。
  • 它显示一个空数组,当我尝试查看值时,但如果我尝试访问数组中的值,使用“Stringed property”它会正确显示 < strong>字符串属性。 这是否意味着数组名称/属性可以是字符串??(因为有人告诉我只能使用索引[数字]访问数组)

最佳答案

What is the main reason for creating an Object with no prototypes in this function.

该对象创建时没有原型(prototype),因此它不会受到原型(prototype)添加的影响,并且是一个新的开始,可以按照程序员认为合适的方式进行定义。这不是真正必要的,但它确实使对象与传统对象更加分离。

Why can’t I look at all properties and values of the object created with no prototype at once.

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

It displays an empty array, when I try looking at the values, but then if I try accessing a value in the array, with a “Stringed property” it displays correctly the value of the Stringed Property. Does this means array names/properties can be strings?? (Because I was told arrays could only be accessed with indexes[numbers])

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

关于javascript - 在没有原型(prototype)的情况下创建的对象上使用 console.log 时出错 && 访问具有字符串属性的数组有效..如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com