我正在使用jQuery来执行ajax调用 - 其中许多工作正常,但我遇到了一个奇怪的问题,试图将字符串发送到服务器。我把代码缩小到了这个范围:
var x = new String('updateGroup');
var y = 'updateGroup';
$.post('page.aspx', {
f: x,
f2: y
}, function(data) {
});
但是当它到达服务器时,请求变量如下:
Request["f"] null string
Request["f2"] "updateGroup" string
Request.Form.AllKeys {string[12]} string[]
[0] "f[0]" string
[1] "f[1]" string
[2] "f[2]" string
[3] "f[3]" string
[4] "f[4]" string
[5] "f[5]" string
[6] "f[6]" string
[7] "f[7]" string
[8] "f[8]" string
[9] "f[9]" string
[10] "f[10]" string
[11] "f2" string
其中Request["f[0]"]
包含"u"
等。
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
如果你扔掉所有细节,你案件中正在执行的是:
jQuery.post
jQuery.ajax
来执行ajax jQuery.param
来构建查询字符串重点是new String
不是原始字符串而是字符串 object ,并且传递 jQuery.ajax
typeof new String("foo") === "object"
("string"
,而不是// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
s.data = jQuery.param( s.data, s.traditional );
}
):
jQuery.param
for ( var prefix in a ) {
buildParams( prefix, a[ prefix ], traditional, add );
}
正在执行following check:
for in
这意味着它对字符串执行var x = new String("abc");
for(var i in x) {
console.log(i, x[i]);
}
// 0 "a"
// 1 "b"
// 2 "c"
循环,这确实将每个字符分别放在查询字符串中。
您可以使用此测试用例检查此行为:
{{1}}
答案 1 :(得分:1)
当你使用 new String 时,你创建一个字符串对象而不是字符串本身,如果你在浏览器中运行它,你会看到它们是一个对象和一个字符串:
console.log(typeof new String("hello"));
console.log(typeof "hello");
此处提供更多信息(包括为什么您可以将一系列字符发布到服务器): http://www.devguru.com/technologies/ecmascript/quickref/string.html
答案 2 :(得分:1)
JavaScript distinguishes between a literal string and an object of type String。
我怀疑当jQuery post方法检查你发送的数据对象时,它会检查typeof
每个值是否为string
。如果是的话,它的工作就完成了。如果它找到一个Object(它是一个String),它会迭代它 - 这就是你获得一个字符数组的原因。
如果您有String对象,则可以使用String.valueOf()
来获取原始值
答案 3 :(得分:1)
你永远不应该在javascript中创建这样的字符串,这被认为是一种不好的做法:
var x = new String('updateGroup');
但总是喜欢这个
var x = 'updateGroup';
因为在第一种情况下你创建了一个对象,而在第二种情况下你创建了一个字符串。数组也一样,总是使用
var array = [];