Dấu (+) trong Javascript nối thay vì cho tổng các biến


76

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 ?


javascript đầu tiên thêm giá trị của tôi vào chuỗi và sau đó là 1
jcubic

Câu trả lời:


77

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 :
    • ilà số, 1là 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".

Làm việc, thanx! nhưng bạn có thể cho tôi biết đâu là sự khác biệt?
ilyo

1
@IlyaD - Toán tử liên quan đến Quyền ưu tiên của toán tử là Phép cộng được xử lý từ trái sang phải. Vì vậy, nó đang làm một cái gì đó như:divID = ("question-" + i) + 1;
Shadow Wizard đang tiêm chủng

1
Việc dint này trong trường hợp của tôi ví dụ: "Câu hỏi" + (i + j) nó giả định cả hai biến như chuỗi, tốt hơn để đi với bên dưới giải pháp là "câu hỏi" + (i * 1 + j)
Lokesh

Tôi vừa ngạc nhiên khi thấy điều này không hoạt động: console.log ('Thêm Hàng Thành phố:' + (i + 1)); Ngay cả với phép toán trong ngoặc, nó sẽ nối chúng.
Rikaelus

Mô tả tuyệt vời về lý do tại sao điều này xảy ra.
apex,

33

Bạn cũng có thể sử dụng cái này

divID = "question-" + (i*1+1); 

để chắc chắn rằng nó iđược chuyển đổi thành số nguyên.


18

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;

6
Câu trả lời này rất sai. Vấn đề vẫn là nối và cộng là liên kết trái . Đó là: "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)
Zaq

1
Cú pháp cần phải có được:divID = "question-" + (parseInt(i) + 1)
Panini Luncher

3
Câu trả lời này hoàn toàn sai. Và parseIntkhông được gọi bằng một con số.
Oriol

Nếu bất cứ điều gì, cú pháp nên bao gồm 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ộ.
Sebastian Simon

Giải pháp duy nhất phù hợp với tôi, những thứ parens đó không hoạt động trong trường hợp của tôi.
mimi

9

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);

4
Các Numberlà không cần thiết, chỉ là dấu ngoặc.
Jamiec

Vâng, nhìn thấy các câu trả lời khác ở đây, tôi nhận ra rằng. Tôi không phải là guru js chắc chắn. Tôi nghĩ bạn phải thực hiện phép bổ sung bằng cách sử dụng Số, nhưng tôi nên biết. JS dường như có thể "tìm ra", đó là một trong những khía cạnh thực sự thú vị của ngôn ngữ. Cảm ơn đã nhận xét.
Tim Hobbs

Điều này là hoàn hảo cho nhu cầu của tôi. Thay vì một chuỗi ký tự, tôi có một biến mà tôi đã gán từ đầu vào văn bản. Tôi đang sử dụng Numberkhi 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.
DCShannon

4
divID = "question-" + parseInt(i+1,10);

kiểm tra nó ở đây , nó là một JSFiddle


6
Bạn không cần parseInt, chỉ cần nhìn xung quanh con số. jsfiddle.net/J8rvy
Jamiec

2
+1, vừa gặp rất nhiều rắc rối với số nguyên trong dự án của riêng tôi nên tôi đang sử dụng parseInt quá nhiều rồi hehe
rsplak

2
Không bao giờ gọi parseIntbằng một số, chỉ bằng một chuỗi. parseInt(1e100) === 1.
Oriol


0

sử dụng dấu ngoặc nhọn bao quanh các số sẽ được coi là phép cộng thay vì dấu nối.

divID = "question-" + (i+1)

0

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);

0

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);

1
Câu trả lời này không giải quyết được câu hỏi. Câu hỏi là về string + number + numbernơi number + numbernê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 + numbernói chung, ở đâu stringlà số và +luôn luôn phải thực hiện phép cộng.
Sebastian Simon

0

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.


Quên thêm dấu ngoặc. Hoạt động không có dấu ngoặc đơn trong một số trường hợp nhưng không phải tất cả.
Zinger

-1
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.


-1

Cần phải cẩn thận đó ilà 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:

  • Trong trường hợp số nguyên, var num = 0;
  • Trong trường hợp chuỗi, var str = "";

Ngay cả khi ibiế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 2thêm vào bằng 1cá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.


Cách các biến được khởi tạo là không liên quan ở đây. Dấu ngoặc đơn vẫn cần thiết; đó là toán tử nhóm buộc ưu tiên hoạt động cụ thể. Đừng làm i - 1 + 2; sử dụng Numberhàm thay thế, nếu ikhông phải là một số.
Sebastian Simon

-2

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à

  • Đầu vào HTML là các giá trị số dành cho các biến a và b, vì vậy giả sử đầu vào là 2 và 3.
  • Kết quả nối chuỗi sau đây được đưa ra: a + b hiển thị 23; + a + b hiển thị 23; (a) + (b) hiển thị 23;
  • Từ các gợi ý trên chúng tôi đã thử thành công: Số (a) + Số (b) hiển thị 5; parseInt (a) + parseInt (b) hiển thị 5.

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.


Câu trả lời này không giải quyết được câu hỏi. Câu hỏi là về string + number + numbernơi number + numbernê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 + numbernói chung, ở đâu stringlà số và +luôn luôn phải thực hiện phép cộng. <input type="number">valueAsNumber, vì vậy đây không phải là cụ thể về HTML. praseIntnê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.
Sebastian Simon

-2

Đơ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;

1
Không bao giờ gọi parseIntbằng một số, chỉ bằng một chuỗi. parseInt(1e100) === 1.
Oriol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.