所以,这可能是一个非常愚蠢的问题,但我显然在这里遗漏了一些东西。
请考虑以下代码:
var selectedItems = [];
selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
//fyi, selectedItems[selectedItems.length] = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"; produced the same result.
最后selectedItems
内容如下所示:
Name Value Type
------------- -------------------------------------- ------
selectedItems {...} Object
- [0] "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3" String
- length 1 Long
但是如果我只是尝试在同一个字符串上调用split(),就像这样:
selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")
现在我假设的数组的内容看起来像这样(缺少长度):
Name Value Type
------------- -------------------------------------- ------
selectedItems {...} Object
- [0] "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3" String
知道有什么区别吗?这里到底发生了什么? 提前谢谢。
已更新: 我有一种感觉,实际上两个结果值在结构上有所不同,因为(atlas)当我尝试将它传递给服务器端的WebMethod时,ajax会在具有length属性的那个上窒息(没有实际的错误消息,但我知道呼叫失败)。我不确定。
更新#2 我注意到以这种方式设置targetLocationIdList,导致Quick Watch窗口中没有显示“length”属性:
var params =
{
jobId : args.get_JobId(),
targetLocationIdList : retVal.split(',')
};
但是此结果包含快速监视窗口中显示的“长度”属性:
var retValArr = [];
retValArr = retVal.split(',');
var params =
{
jobId : args.get_JobId(),
targetLocationIdList : retValArr
};
答案 0 :(得分:3)
在编程上没有任何区别。如果您在chrome开发人员窗口和firebug中运行示例,它看起来像第二个
Name Value
Type
------------- -------------------------------------- ------
selectedItems {...} Object
- [0] "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3" String
长度是隐含属性
修改强>
var retVal = 'test';
var params =
{
jobId : 1,
targetLocationIdList : retVal.split(',')
};
console.log(params.targetLocationIdList.length) // prints 1
上面的代码在IE8,Firefox,Chrome(在他们的开发工具或firebug中)打印1,所以认为这必须是Visual Studio或Atlas以显示对象的方式的问题。
答案 1 :(得分:2)
这可能是调试器中的错误吗? (或者这是否会导致浏览器出现问题?)
答案 2 :(得分:2)
在第一个实例中,您将selectedItems声明为数组,然后分配给它。
在第二个实例中,您直接从split方法分配它。
我只能假设VS将数组声明作为显示长度属性的提示。
答案 3 :(得分:1)
看起来你在微软的Javascript实现中发现了一个缺陷。 Visual Studio和IE很可能共享相同的实现,这就是为什么你只是在这两个程序中遇到错误,而不是在Firefox或Chrome中。
在EMCAScript标准中:http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
15.5.4.14 String.prototype.split(分隔符,限制)
返回一个Array对象,其中存储了将此对象转换为字符串的结果的子字符串。
在Array Object的定义中:
15.4数组对象
...每个Array对象都有一个length属性,其值始终是非负整数 小于2 32 。
答案 4 :(得分:0)
您使用的是哪种浏览器,并且您确定没有length
属性吗?我刚刚做了
var arr = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")
在我的Firebug控制台中,arr
的{{1}}属性确实等于1,正如预期的那样。
答案 5 :(得分:0)
你怎么知道电话失败了?确保以调试模式运行,或使用失败的处理程序通知原因。
答案 6 :(得分:0)
这是一个非常简单的测试:
var selectedItems = [];
selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
alert(selectedItems);
selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",");
alert("boo");
alert(selectedItems.length);
嘘声之后,我们检查是否还有一个长度。
答案:是的。 换句话说,这是Visual Studio的错误,仅此而已。