我对JavaScript比较陌生,我可以帮助理解这里发生了什么。对于那些知情人士来说,这可能是一个简单的问题。我根据请求的输出方式为对象的属性获取不同的值。
(这里提供的背景信息可能比需要的更多,但为了完整性而包括在内。)
我正在尝试使用three.js ColladaLoader.js将一个Collada dae(XML)文件读入Firefox,以显示基于分析数据着色的几何体。该平台是Windows 7。
ColladaLoader.js包含一个"输入"类型的对象。我有一个"输入"的实例对象称为" tinput"。
为了尝试理解导入我的分析数据的最佳方式(参见:https://collada.org/mediawiki/index.php/Extension),我在ColladaLoader.js'中放置了以下行。 Polygons.prototype.parse函数。
console.log('>tinput:', tinput, ' >tinput.source:', tinput.source, ' >tinput["source"]:', tinput["source"]);
在这一行中,我请求Firefox控制台显示"输入"对象,然后对象"源"财产使用两种不同的方法。这导致:
">tinput:" Object { semantic: "VERTEX", offset: 0, source: "XX", set: -1 } " >tinput.source:" "VV" " >tinput["source"]:" "VV"
请注意"来源"的价值当我打印整个对象以及打印"源"时,属性是不同的。财产直接。
" source"的正确值在dae文件中找到的是" VV" :(注意:ColladaLoader.js剥掉英镑符号)。 XML标记是:
<input source="#VV" semantic="VERTEX" offset="0"/>
注意:文件中还有另一个dae XML条目,如下所示:
<input source="#XX" semantic="POSITION"/>
但它不是被解析的行,尽管看起来JavaScript正在捡起&#34; XX&#34;从这里开始。
我想看看对象中是否还有其他任何东西这样做,所以我写道:
for( iii in tinput ) {
console.log(' iii = ', iii, ' tinput[iii] = ', tinput[iii]);
}
导致:
" iii = " "semantic" " tinput[iii] = " "VERTEX" ColladaLoader.js:3210
" iii = " "offset" " tinput[iii] = " 0 ColladaLoader.js:3210
" iii = " "source" " tinput[iii] = " "VV" ColladaLoader.js:3210
" iii = " "set" " tinput[iii] = " -1 ColladaLoader.js:3210
" iii = " "parse" " tinput[iii] = " function () ColladaLoader.js:3210
这表明只有&#34;来源&#34;属性根据其显示方式产生不同的值。
我也尝试过:
console.log('>tinput.valueOf():', tinput.valueOf());
产生了:
">tinput.valueOf():" Object { semantic: "VERTEX", offset: 0, source: "XX", set: -1 }
和
console.log(' >tinput.source.valueOf():', tinput.source.valueOf(), '>tinput["source"].valueOf():', tinput["source"].valueOf());
产生了:
" >tinput.source.valueOf():" "VV" " >tinput["source"].valueOf():" "VV"
仍然表现出同样的差异。
我也尝试过:
console.log('tinput = ', JSON.stringify(tinput, null, 2) );
导致:
"tinput = " "{
"semantic": "VERTEX",
"offset": 0,
"source": "VV",
"set": -1
}"
表示&#34; source&#34;的正确值。 (&#34; VV&#34)。
dae XML文件的这一部分在下面给出了问题,其中长数据字段被截断:
<source id="XX">
<float_array count="16554" id="verts-points-array">26.47993 0.1520446 11.91956 26.42765 0.1342111 11.91947 (...) </float_array>
<technique_common>
<accessor count="5518" source="#verts-points-array" stride="3">
<param type="float" name="X"/>
<param type="float" name="Y"/>
<param type="float" name="Z"/>
</accessor>
</technique_common>
</source>
<source id="analysis_data_source" name="per_vertex_results_data">
<float_array count="16554" id="analysis-data-array">26.47993 0.1520446 11.91956 26.42765 0.1342111 11.91947 (...) </float_array>
<technique_common>
<accessor count="5518" source="#analysis-data-array" stride="3">
<param type="float" name="P" semantic="PRESSURE" />
<param type="float" name="T" semantic="TEMPERATURE"/>
<param type="float" name="VM" semantic="VON_MISES_STRESS"/>
</accessor>
</technique_common>
</source>
<vertices id="VV">
<input source="#XX" semantic="POSITION"/>
<input source="#analysis_data_source" semantic="RESULTS"/>
</vertices>
<triangles count="2758" material="materialref">
<input source="#VV" semantic="VERTEX" offset="0"/>
<p>150 141 163 151 150 164 152 151 165 153 152 (...) </p>
</triangles>
当出现差异时正在解析的行是&#34;输入&#34;标记在&#34;三角形内#34;标签。 (XML文件验证正常。)
有人可以帮我理解这里发生了什么吗?为什么我会得到不同的值,具体取决于我如何访问&#34;来源&#34;参数? (它可能与所有Collada / XML内容无关,但我认为我应该包括它以防万一。)
感谢。
编辑:
我重新阅读了这篇文章,我想我已经解决了这个问题:
短篇版本:
假设:
console.log('tinput =', tinput);
console.log('tinput.source =', tinput.source);
Yeilds:
"tinput =" Object { semantic: "VERTEX", offset: 0, source: "XX", set: -1 }
"tinput.source =" "VV"
为什么&#34;来源&#34;物业价值不一样?
很抱歉在长篇文章上浪费你的时间。
答案 0 :(得分:1)
我的无知再次显现出来。看起来问题源于我不了解console.log如何工作。当您尝试使用它来显示对象的属性值时,似乎console.log有一些愚蠢的行为。 console.log不会显示执行console.log行时存在的对象属性的值。虽然输出中的位置将与console.log调用的位置一致,但报告的值将是脚本执行结束时对象中存在的值。以下是更完整的说明:console.log object at current state
感谢。