Tại sao khi tôi sử dụng cái này: (giả sử i = 1
)
divID = "question-" + i+1;
Tôi nhận được câu hỏi-11 chứ không phải câu hỏi-2 ?
Câu trả lời:
Sử dụng cái này thay thế:
var divID = "question-" + (i+1)
Đó là một vấn đề khá phổ biến và không chỉ xảy ra trong JavaScript. Ý tưởng là +
có thể đại diện cho cả nối và cộng.
Vì toán tử + sẽ được xử lý từ trái sang phải nên các quyết định trong mã của bạn trông giống như sau:
"question-" + i
: vì "question-"
là một chuỗi, chúng tôi sẽ thực hiện nối, dẫn đến"question-1"
"question-1" + 1
: vì "queston-1"
là một chuỗi, chúng tôi sẽ thực hiện nối, kết quả là "question-11"
.Với "question-" + (i+1)
nó khác:
(i+1)
dấu nằm trong ngoặc đơn, nên giá trị của nó phải được tính trước khi +
có thể áp dụng giá trị đầu tiên :
i
là số, 1
là số, vì vậy chúng tôi sẽ thực hiện phép cộng, dẫn đến2
"question-" + 2
: vì "question-"
là một chuỗi, chúng tôi sẽ thực hiện nối, kết quả là "question-2"
.divID = ("question-" + i) + 1;
Chỉ sử dụng:
divID = "question-" + parseInt(i) + 1;
Khi "n" đến từ trường đầu vào html hoặc được khai báo dưới dạng chuỗi, bạn cần sử dụng chuyển đổi rõ ràng.
var n = "1"; //type is string
var frstCol = 5;
lstCol = frstCol + parseInt(n);
Nếu "n" là số nguyên, không cần chuyển đổi.
n = 1; //type is int
var frstCol = 5, lstCol = frstCol + n;
"question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1
. Xem câu trả lời của Joachim để biết thêm chi tiết. Ngoài ra, (+i)
ngắn gọn hơnparseInt(i)
divID = "question-" + (parseInt(i) + 1)
parseInt
không được gọi bằng một con số.
parseInt(i, 10)
. Tôi không hiểu làm thế nào câu trả lời này, mà vẫn hoàn toàn sai cho đến ngày nay , đã nhận được 21 lượt ủng hộ.
Vì bạn đang nối các số vào một chuỗi, nên toàn bộ điều được coi là một chuỗi. Khi bạn muốn thêm các số lại với nhau, bạn cần phải thực hiện riêng và gán nó cho một var và sử dụng var đó, như sau:
i = i + 1;
divID = "question-" + i;
Hoặc bạn cần chỉ định phép cộng số như sau:
divID = "question-" + Number(i+1);
BIÊN TẬP
Tôi lẽ ra đã thêm điều này từ lâu, nhưng dựa trên các nhận xét, điều này cũng hoạt động:
divID = "question-" + (i+1);
Number
là không cần thiết, chỉ là dấu ngoặc.
Number
khi biến được gán ban đầu và sau đó nó không khiến những thứ khác được truyền thành chuỗi.
divID = "question-" + parseInt(i+1,10);
kiểm tra nó ở đây , nó là một JSFiddle
parseInt
, chỉ cần nhìn xung quanh con số. jsfiddle.net/J8rvy
parseInt
bằng một số, chỉ bằng một chuỗi. parseInt(1e100) === 1
.
Thêm dấu ngoặc
divID = "question-" + (i+1);
Lý do bạn nhận được đó là thứ tự ưu tiên của các toán tử và thực tế là nó +
được sử dụng để nối các chuỗi cũng như thực hiện phép cộng số.
Trong trường hợp của bạn, việc nối "question-" và i
đang xảy ra đầu tiên cho chuỗi "question = 1". Sau đó, một chuỗi khác nối với "1" cho "câu hỏi-11".
Bạn chỉ cần cung cấp cho người thông dịch một gợi ý về thứ tự chính xác mà bạn muốn.
divID = "question-" + (i+1);
Câu trả lời của Joachim Sauer sẽ hoạt động trong các tình huống như thế này. Nhưng có một số trường hợp việc thêm dấu ngoặc đơn sẽ không hữu ích.
Ví dụ: Bạn đang chuyển “tổng giá trị của một phần tử đầu vào và một số nguyên” làm đối số cho một hàm.
arg1 = $("#elemId").val(); // value is treated as string
arg2 = 1;
someFuntion(arg1 + arg2); // and so the values are merged here
someFuntion((arg1 + arg2)); // and here
Bạn có thể làm cho nó hoạt động bằng cách sử dụng Number()
arg1 = Number($("#elemId").val());
arg2 = 1;
someFuntion(arg1 + arg2);
hoặc là
arg1 = $("#elemId").val();
arg2 = 1;
someFuntion(Number(arg1) + arg2);
string + number + number
nơi number + number
nên thực hiện phép cộng trước khi nối nó với string
. Nó không phải là string + number
nói chung, ở đâu string
là số và +
luôn luôn phải thực hiện phép cộng.
Một thay thế khác có thể được sử dụng:
divID = "question-" + (i - -1);
Trừ một phủ định cũng giống như cộng và một trừ không thể được sử dụng để nối
Chỉnh sửa: Quên rằng dấu ngoặc vẫn cần thiết vì mã được đọc từ trái sang phải.
var divID = "question-" + (parseInt(i)+1);
Sử dụng +
toán tử này hoạt động vì concat
đó là lý do tại sao nó hiển thị 11.
Cần phải cẩn thận đó i
là kiểu biến số nguyên. Trong javaScript, chúng tôi không chỉ định kiểu dữ liệu trong khi khai báo các biến, nhưng việc khởi tạo của chúng tôi có thể đảm bảo rằng biến của chúng tôi thuộc một kiểu dữ liệu cụ thể.
Đó là một thực hành tốt để khởi tạo các biến khai báo:
var num = 0;
var str = "";
Ngay cả khi i
biến của bạn là số nguyên, +
toán tử có thể thực hiện nối thay vì cộng.
Trong trường hợp vấn đề của bạn, bạn đã cho rằng i = 1
, để có được 2
thêm vào bằng 1
cách thử sử dụng (i-1+2)
. Việc sử dụng ()
dấu ngoặc đơn sẽ không cần thiết.
-
(toán tử trừ) không thể bị hiểu nhầm và bạn sẽ không nhận được / các kết quả không mong muốn.
i - 1 + 2
; sử dụng Number
hàm thay thế, nếu i
không phải là một số.
Một nơi mà đề xuất dấu ngoặc không thành công là nếu giả sử cả hai số đều là biến đầu vào HTML. Giả sử a và b là các biến và một người nhận các giá trị của chúng như sau (Tôi không phải là chuyên gia HTML nhưng con trai tôi đã gặp phải vấn đề này và không có giải pháp dấu ngoặc đơn, tức là
Cảm ơn sự giúp đỡ chỉ là một FYI - rất khó hiểu và tôi là bố của anh ấy đã la lên 'đó là lỗi của Blogger.com' - không, đó là một tính năng của đầu vào HTML mặc định kết hợp với toán tử 'bổ sung', khi chúng xảy ra cùng nhau, giải thích căn trái mặc định của tất cả và bất kỳ biến đầu vào nào là của một chuỗi và do đó toán tử cộng hoạt động tự nhiên trong vai trò kép / song song của nó bây giờ như một toán tử nối vì như bạn đã giải thích ở trên, nó là loại giao thức giải thích căn trái trong Java và tập lệnh Java sau đó. Thực tế rất thú vị. Các bạn đã đưa ra giải pháp, tôi đang bổ sung chi tiết cho những người khác gặp phải vấn đề này.
string + number + number
nơi number + number
nên thực hiện phép cộng trước khi nối nó với string
. Nó không phải là string + number
nói chung, ở đâu string
là số và +
luôn luôn phải thực hiện phép cộng. <input type="number">
có valueAsNumber
, vì vậy đây không phải là cụ thể về HTML. praseInt
nên được gọi với đối số cơ số; Number
được ưa thích. +
không phải là toán tử bổ sung khi nó không thực hiện thêm.
Đơn giản như dễ dàng ... mọi kiểu đầu vào nếu không được định nghĩa trong HTML đều được coi là chuỗi. Vì điều này mà toán tử Plus "+" được nối.
Sử dụng parseInt (i) hơn giá trị của "i" sẽ được chuyển thành Số nguyên.
Toán tử than "+" sẽ hoạt động giống như phép cộng.
Trong trường hợp của bạn, hãy làm như sau: -
divID = "question-" + parseInt(i)+1;
parseInt
bằng một số, chỉ bằng một chuỗi. parseInt(1e100) === 1
.