接上一次的帖子http://topic.csdn.net/u/20090407/14/07d7b3dd-7c7a-4eb8-8365-220dacaf2c4e.html在遍历JSON的属性成员的时候,对于{}对象 和 数组[], 得到的都是VT_DISPATCH也就是说,JS和VBS不同, JS的数组Array也是一个原型对象,不是SAFEARRAY
它的属性名称就是数组的index. 比如 0:"22",1:"dsa",2:"XX"那么,我在得到这个DISPATCH后,如何判断它在JS中是一个 {}的普通对象, 还是一个[]的Array对象?我目前的做法很笨, 如果发现属性名称是阿拉伯数字 AND 它由get_length属性 就认为是数组
由没有什么方法 相当与JS中的 XXX instanceof Array 之类的实现??
它的属性名称就是数组的index. 比如 0:"22",1:"dsa",2:"XX"那么,我在得到这个DISPATCH后,如何判断它在JS中是一个 {}的普通对象, 还是一个[]的Array对象?我目前的做法很笨, 如果发现属性名称是阿拉伯数字 AND 它由get_length属性 就认为是数组
由没有什么方法 相当与JS中的 XXX instanceof Array 之类的实现??
解决方案 »
- 如何为单文档多视图中某一个视图添加控件???
- 月底了,请各位及时结贴。
- 10万级的数据用什么数据结构比较好?carrary?vector?有没有他们性能比较的详细资料?
- 怎样手动用代码实现 调整ComboBox的下拉总高度
- 在view画几个圆形图像,想通过鼠标将各个圆形连接起来,效果就如同visio的效果,怎么实现?
- 大家都来讨论一下大学本科的学习!
- 遍历一个XML文档,文档容量较大,需要提取其中有关元素信息。请问DOM,SOM,SAX哪中最好?
- 我是认真的:有没有可能实现这样的程序?各高手只用回答有,还是没有。
- 怎么实现简单的安装拷贝程序?
- 一个简易计算器无法实现cstring转换为double?
- 编写界面程序,用什么 语言编写程序比较好?
- 不懂VC的人提问,关于TCP的数据包分析的,大家请进。
obj.protocol == Array.protocol
或者
obj.constructor == Array
获取的这些属性全部都是IDispatch*
可能会有一些问题(要试验一下才知道),不光array支持枚举,普通的object也支持枚举,用for...in语句就能看出来,只不过这个语句的内部实现可能会有区别。
for ( variable in [object | array] ) statements;
对于数组,它枚举的是数组元素;对于对象,它枚举的是对象属性。
BOOL bIsArray = FALSE; {
UINT nArgErr(0);
EXCEPINFO stExInfo;
VARIANT varResult;
DISPPARAMS stDispParams = { NULL, NULL, 0, 0 };
HRESULT hr = pDispEx->Invoke( DISPID_NEWENUM
, IID_NULL
, LOCALE_SYSTEM_DEFAULT
, DISPATCH_METHOD | DISPATCH_PROPERTYGET
, &stDispParams
, &varResult
, &stExInfo
, &nArgErr
);
if( SUCCEEDED(hr) )
{
if( varResult.vt == VT_UNKNOWN )
{
CComQIPtr<IEnumVARIANT> pEnum(varResult.punkVal);
bIsArray = pEnum != NULL;
}
VariantClear(&varResult);
}
}
普通的{}确实能够通过 for in进行枚举, 不过我按照 蒋晟 的说法试验了一下, 对于{}对象, 是获取不到 NEWENUM 接口的
var pParam = {};
pParam.AA= sPhone;
pParam.GG = [1, 2, 3];
pParam.TT = {Name:"1"};