Eloquent JavaScript 3rd Edition(https://eloquentjavascript.net/)を読んでいて、第7章で、MarjinHaverbekeがこの関数を使用してグラフデータ構造を作成しました。
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);
そしてそれは私にこのエラーを与えました:
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);
しかし、私console.log(roadGraph.property);
が正しく表示すると、property
これらのことが起こる理由を説明するために、Javascriptの第一人者が必要です。
この関数でプロトタイプのないオブジェクトを作成する主な理由は何ですか。
オブジェクトはプロトタイプなしで作成されたため、プロトタイプへの追加による影響を受けず、プログラマーが適切と考えるように定義するための新たなスタートとなりました。それは本当に必要ではありませんが、それはオブジェクトを従来のものからより分離させます。
プロトタイプなしで作成されたオブジェクトのすべてのプロパティと値を一度に確認できないのはなぜですか。
これは、プロトタイプがないとObject.toString()
、他のオブジェクトがプロトタイプチェーンを介してアクセスできるメソッドにオブジェクトがアクセスできないためです。独自のtoString
関数を作成する場合、または既存の関数を取得してこのオブジェクトに配置する場合、オブジェクトのプロパティは他のオブジェクトと同じように文字列に変換できます。基本的に、これは副作用であるか、プロトタイプがありません。また、それが実際に何を意味するのかを示しています。従来のオブジェクトメソッドはいずれも、回避策なしではこのメソッドで機能しません。
値を確認しようとすると空の配列が表示されますが、「Stringedプロパティ」を使用して配列内の値にアクセスしようとすると、Stringedプロパティの値が正しく表示されます。これは、配列名/プロパティが文字列になる可能性があることを意味しますか?(配列にはindexes [numbers]でしかアクセスできないと言われたため)
配列は、実際には通常のオブジェクトの単なるバリエーションです。それらは、文字列インデックス付きプロパティと数値インデックス付きプロパティを持つことができます。ただし、これは、自分が何をしているのかを理解していて、たとえばしようとしているのでない限り、ほとんどの場合実行すべきではありません。配列にメソッドを追加します。(のような配列メソッドArray.splice()
は名前付きプロパティです。これは、配列に名前付きプロパティがあると便利な理由の例です)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加