2011-12-30 17 views
5

Tôi đang sử dụng jQuery để thực hiện các cuộc gọi ajax - nhiều trong số đó đang hoạt động tốt, nhưng tôi vừa chạy vào một vấn đề lạ đang cố gửi một chuỗi đến máy chủ. Tôi đã thu hẹp mã xuống chỉ này:Đối tượng String JavaScript đang được chia thành một mảng trên jQuery.post

var x = new String('updateGroup'); 
var y = 'updateGroup'; 
$.post('page.aspx', { 
    f: x, 
    f2: y 
}, function(data) { 
}); 

Khi nó chạm vào máy chủ tuy nhiên, các biến theo yêu cầu như sau:

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 

nơi Request["f[0]"] chứa "u", vv

Can ai đó giải thích tại sao điều này xảy ra?

Trả lời

3

Nếu bạn vứt bỏ tất cả các chi tiết, những gì đang được thực hiện trong trường hợp của bạn là:

  • jQuery.post
  • trong đó kêu gọi jQuery.ajax trong nội bộ để làm ajax
  • gọi số jQuery.param nội bộ để tạo chuỗi truy vấn

Điểm có ích là new String không phải là một chuỗi nguyên thủy nhưng một chuỗi đối tượng, và sẽ qua các following check trong jQuery.ajax (typeof new String("foo") === "object", không "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 đang thực hiện as follows:

for (var prefix in a) { 
    buildParams(prefix, a[ prefix ], traditional, add); 
} 

Điều này có nghĩa là nó thực hiện một vòng lặp for in qua chuỗi, thực sự đặt mỗi ký tự một cách riêng biệt trong chuỗi truy vấn.

Bạn có thể kiểm tra hành vi này với testcase này:

var x = new String("abc"); 

for(var i in x) { 
    console.log(i, x[i]); 
} 

// 0 "a" 
// 1 "b" 
// 2 "c" 
1

Khi bạn sử dụng new String bạn tạo một đối tượng chuỗi chứ không phải là một chuỗi chính nó, nếu bạn chạy trong trình duyệt của bạn, bạn sẽ thấy họ là một đối tượng và một chuỗi trân trọng:

console.log(typeof new String("hello")); 
console.log(typeof "hello"); 

More thông tin ở đây (bao gồm lý do tại sao bạn có thể có một loạt các ký tự được đăng lên máy chủ): http://www.devguru.com/technologies/ecmascript/quickref/string.html

+0

Cảm ơn - có ý nghĩa. Tôi đã thêm một .toString và .valueOf và cả hai dường như làm việc xung quanh vấn đề. Có vẻ kỳ quặc với tôi rằng Jquery sẽ đối xử với các đối tượng chuỗi theo cách này - có vẻ phản trực giác với tôi. –

+0

Các đối tượng String là một chút của một di tích cổ xưa, nó có phương pháp như lớn, đậm, nhấp nháy, phông chữ, fontcolor vv cung cấp cho bạn một ý tưởng tốt về tuổi của nó ;-) – oodavid

1

JavaScript distinguishes between a literal string and an object of type String.
Tôi nghi ngờ rằng khi phương pháp bài đăng jQuery đang kiểm tra đối tượng dữ liệu bạn đã gửi, nó sẽ kiểm tra xem mỗi giá trị typeof có phải là string hay không. Nếu có, công việc của nó được thực hiện. Nếu nó tìm thấy một đối tượng (mà một String là) nó lặp qua nó - đó là lý do tại sao bạn đang nhận được một mảng các ký tự.

nếu bạn có một đối tượng String bạn có thể sử dụng String.valueOf() để có được những giá trị nguyên thủy

1

Bạn không bao giờ nên tạo một chuỗi như thế này trong javascript, nó được coi là một thực tế xấu:

var x = new String('updateGroup'); 

nhưng luôn luôn như này

var x = 'updateGroup'; 

vì trong trường hợp đầu tiên bạn tạo đối tượng và chỉ trong trường hợp thứ hai bạn tạo chuỗi.Cũng vậy với mảng, luôn luôn sử dụng

var array = []; 
+0

Một người đàn ông khôn ngoan đã từng nói: không làm cho trường hợp Biến số tầm thường :-) +1 – Flater

+0

Đối tượng chuỗi chính nó đến từ một lớp mã từ ví dụ này - mặc dù bây giờ tôi đang xem xét lại lớp đó để điều tra nơi nó đến từ tôi tự hỏi nếu nó thực sự cần phải là một chuỗi - nó được xây dựng từ .val() của một hộp đầu vào, nhưng tôi không thấy bất kỳ lý do nào cho nó theo cách này vì vậy sẽ xem xét việc thay đổi lớp đó thay vì tất cả những người sử dụng nó phải lo lắng về việc sử dụng giá trị của. –

Các vấn đề liên quan