Javascript对象属性值根据其显示方式而有所不同

时间:2014-12-08 17:11:50

标签: javascript xml firefox collada

我对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;物业价值不一样?

很抱歉在长篇文章上浪费你的时间。

1 个答案:

答案 0 :(得分:1)

我的无知再次显现出来。看起来问题源于我不了解console.log如何工作。当您尝试使用它来显示对象的属性值时,似乎console.log有一些愚蠢的行为。 console.log不会显示执行console.log行时存在的对象属性的值。虽然输出中的位置将与console.log调用的位置一致,但报告的值将是脚本执行结束时对象中存在的值。以下是更完整的说明:console.log object at current state

感谢。