Chuỗi JavaScript và chuyển đổi số


89

Làm cách nào để thực hiện những điều sau trong JavaScript?

  1. Nối "1", "2", "3" thành "123"

  2. Chuyển "123" thành 123

  3. Thêm 123 + 100 = 223

  4. Chuyển 223 thành "223"


42
Hầu hết tất cả các sách JavaScript tôi đã đọc đều đề cập đến những vấn đề này. Nhưng không sao đâu. Trả lời câu hỏi là tất cả về StackOverflow. @Shadi Almosri - SO có quy tắc "đừng xấu tính". Tôi không thấy có điểm coi thường những người đặt câu hỏi ở đây, vì đó là điểm của nơi này.
Nosredna

4
@Nosredna: Tôi hoàn toàn hiểu việc đặt câu hỏi, tôi không thích gì hơn là trả lời chúng, nhưng tôi nghĩ rằng việc thể hiện sự thật rằng bạn đã cố gắng là nghi thức tốt hơn, sau đó chỉ đơn giản là mong đợi một câu trả lời và cũng tốt hơn cho trải nghiệm học tập cá nhân. Chỉ là ý kiến ​​của tôi, không cố ý! :)
Shadi Almosri

1
@Shadi, vậy câu hỏi nên được đặt ra như thế nào? Với tuyên bố đã tìm kiếm câu trả lời rồi?
Nosredna

1
Nó khiến tôi cảm thấy khó chịu khi lần đầu tiên nhìn thấy nó, nhưng khi tôi đọc lại nó, tôi nghĩ là không, có vẻ như ai đó đang thử nghiệm JavaScript và nhận được kết quả không mong đợi và muốn hoàn thành nó. Điều đó nói rằng, tôi tự hỏi liệu stackoverflow.com/faq có thể bao gồm thứ gì đó giống như mã danh dự dành cho sinh viên hay không. Chúng tôi giống như một trường đại học toàn cầu ở đây, và tôi không nghĩ thật điên rồ khi cố gắng tìm ra một bộ quy tắc đạo đức có thể dành cho nơi này. Hoặc có thể nó là điên rồ. :-)
artlung

6
@Shadi, về mặt tích cực, câu hỏi và câu trả lời có trong StackOverflow, và hy vọng sẽ giúp ích cho những người khác. Tôi thấy mọi người luôn gặp khó khăn với những thứ này, đặc biệt là khi đến từ các ngôn ngữ như Java. Có một lý do khiến mọi người hỏi điều này lặp đi lặp lại - đó là vì họ NGHĨ rằng họ biết cách hoạt động của các biểu thức trong JavaScript, nhưng họ không. Họ đưa ra các giả định dựa trên kinh nghiệm bên ngoài JS. Đó là lý do tại sao rất hữu ích khi ngồi xuống thử một vài bài kiểm tra đơn giản với việc thêm chuỗi và số, cũng như thử cộng và trừ một bậc.
Nosredna

Câu trả lời:


120

Bạn muốn làm quen với parseInt()toString().

Và điều hữu ích trong bộ công cụ của bạn sẽ là xem xét một biến để tìm ra loại biến đó— typeof:

<script type="text/javascript">
    /**
     * print out the value and the type of the variable passed in
     */

    function printWithType(val) {
        document.write('<pre>');
        document.write(val);
        document.write(' ');
        document.writeln(typeof val);
        document.write('</pre>');
    }

    var a = "1", b = "2", c = "3", result;

    // Step (1) Concatenate "1", "2", "3" into "123"
    // - concatenation operator is just "+", as long
    //   as all the items are strings, this works
    result = a + b + c;
    printWithType(result); //123 string

    // - If they were not strings you could do
    result = a.toString() + b.toString() + c.toString();
    printWithType(result); // 123 string

    // Step (2) Convert "123" into 123
    result = parseInt(result,10);
    printWithType(result); // 123 number

    // Step (3) Add 123 + 100 = 223
    result = result + 100;
    printWithType(result); // 223 number

    // Step (4) Convert 223 into "223"
    result = result.toString(); //
    printWithType(result); // 223 string

    // If you concatenate a number with a 
    // blank string, you get a string    
    result = result + "";
    printWithType(result); //223 string
</script>

Bất kỳ lý do cụ thể nào bạn đặt điều này trong các thẻ script?
Julix

@Julix Đối với những người mới bắt đầu vào năm 2009, hãy xem một tệp html để tìm hiểu khái niệm cơ bản. Nếu tôi trả lời câu hỏi này mới hôm nay, tôi có thể làm khác, nhưng có lẽ không.
artlung

53

Bước (1) Nối "1", "2", "3" thành "123"

 "1" + "2" + "3"

hoặc là

 ["1", "2", "3"].join("")

Các tham gia phương pháp concatenates các mục của một mảng thành một chuỗi, đưa delimiter định giữa các mục. Trong trường hợp này, "dấu phân cách" là một chuỗi rỗng ( "").


Bước (2) Chuyển "123" thành 123

 parseInt("123")

Trước ECMAScript 5 , cần phải chuyển cơ số cho cơ số 10:parseInt("123", 10)


Bước (3) Thêm 123 + 100 = 223

 123 + 100


Bước (4) Chuyển 223 thành "223"

 (223).toString() 


Chuyển đổi tất cả

 (parseInt("1" + "2" + "3") + 100).toString()

hoặc là

 (parseInt(["1", "2", "3"].join("")) + 100).toString()

4
Đẹp, ví dụ rõ ràng. Ngoài ra, kudo cho hình thức tốt - bạn phải luôn chỉ định cơ số cho parseInthàm .
hotshot309

Bao gồm cả cơ số làm tôi bối rối và tôi chuyển sang một câu trả lời khác, nơi nó được giải thích. Được chỉnh sửa trong một giải thích nhanh chóng để đúng vào điểm nhầm lẫn.
ArtOfWarfare

@ArtOfWarfare Cảm ơn, chỉnh sửa tốt. Cơ số là cần thiết tại thời điểm câu trả lời này. Ngày nay, tôi có thể lập luận để loại bỏ nó. Tính đến ES5, mà tất cả các trình duyệt “hiện đại” và hỗ trợ Node.js, parseInt (<a chuỗi với chỉ 0-9>) luôn luôn sử dụng cơ sở 10
Patrick McElhaney

thực tế thú vị .. trong JavaScript gốc của Netscape (khoảng năm 1995) cơ số mặc định cho parseInt là 8 (trừ khi chuỗi chứa và 8 hoặc 9)
Justin Ohms

26
r = ("1"+"2"+"3")           // step1 | build string ==> "123"
r = +r                      // step2 | to number    ==> 123
r = r+100                   // step3 | +100         ==> 223
r = ""+r                    // step4 | to string    ==> "223"

//in one line
r = ""+(+("1"+"2"+"3")+100);

Cảm ơn vì chuỗi nhanh -> chuyển đổi số
mcont

Nếu bạn kiểm tra nó có phải là một số hay không thì hãy sử dụng parseInt (). Ví dụ: parseInt ("") là NaN, nhưng + "" là 0!
greene

15

Những câu hỏi này luôn xuất hiện do hệ thống đánh máy của JavaScript. Mọi người nghĩ rằng họ đang nhận được một số khi họ nhận được chuỗi một số.

Dưới đây là một số điều bạn có thể thấy lợi dụng cách JavaScript xử lý chuỗi và số. Cá nhân, tôi ước JavaScript đã sử dụng một số ký hiệu khác ngoài + để nối chuỗi.

Bước (1) Nối "1", "2", "3" thành "123"

result = "1" + "2" + "3";

Bước (2) Chuyển "123" thành 123

result = +"123";

Bước (3) Thêm 123 + 100 = 223

result = 123 + 100;

Bước (4) Chuyển 223 thành "223"

result = "" + 223;

Nếu bạn biết TẠI SAO những điều này hoạt động, bạn sẽ ít gặp rắc rối với các biểu thức JavaScript.


3
Tôi thực sự nghĩ rằng đây là một thực hành cực kỳ tồi tệ vì nó khá mờ nhạt khi waht đang diễn ra. Biết rằng một số hoạt động nhất định ảnh hưởng đến một phép truyền ngầm là một mẹo nhỏ và là một mẹo hay cần biết, nhưng nó hoàn toàn không thể đọc được. Giao tiếp là tất cả.
annakata

1
Tôi nghĩ điều quan trọng là phải biết những điều này CHÍNH XÁC để bạn biết điều gì đang xảy ra khi bạn đọc mã. Nhiều JavaScript là ngắn gọn vì nó được truyền dưới dạng nguồn và mã nhỏ có thể đồng nghĩa với việc giảm chi phí máy chủ.
Nosredna

6
Mặc dù vậy, bạn sẽ đạt được điều này thông qua các công cụ nén, ở dạng này, nó tối ưu hóa với chi phí bảo trì rất thực tế.
annakata

6
Tuy nhiên, biết những điều này sẽ giúp ngăn chặn câu hỏi ngay từ đầu, đó là sự thiếu kiến ​​thức về cách JavaScript xử lý các chuỗi và số. Đó là một vấn đề trí tuệ tò mò. Điều gì xảy ra khi tôi thêm một số vào một chuỗi? Cộng một bậc hoạt động như thế nào? Nếu bạn không biết câu trả lời, bạn không thực sự biết JavaScript, và những câu hỏi kiểu này sẽ xuất hiện.
Nosredna

11

Bạn có thể làm như thế này:

// step 1 
var one = "1" + "2" + "3"; // string value "123"

// step 2
var two = parseInt(one); // integer value 123

// step 3
var three = 123 + 100; // integer value 223

// step 4
var four = three.toString(); // string value "223"

16
Phương pháp hay nhất là thêm tham số cơ số vào hàm parseInt (). vì vậy, parseInt (một, 10) đảm bảo rằng bất cứ thứ gì bạn ném vào nó sẽ không bị hiểu nhầm.
artlung

3
Đã đồng ý. Nếu không, các giá trị bắt đầu bằng 0sẽ được xem là số bát phân (cơ số 8) .
hotshot309

1
Bất ngờ hơn nữa, các giá trị bắt đầu bằng 0và sau đó chứa 8hoặc 9sẽ không thành công, dẫn đến kết quả trả về là 0. Ví dụ: parseInt('034') = 28parseInt('09') = 0.
Robert Martin

9

Để chuyển một chuỗi thành một số, hãy trừ đi 0. Để chuyển một số thành chuỗi, hãy thêm "" (chuỗi trống).

5 + 1 sẽ cho bạn 6

(5 + "") + 1 sẽ cho bạn "51"

("5" - 0) + 1 sẽ cho bạn 6


1
Việc dựa vào các thủ thuật dựa trên những ngôn ngữ kỳ quặc như thế này có thể dẫn đến sự mù mờ thực sự. ví dụ: "5" -0 thực sự cho kết quả là số 5, nhưng "5" +0 cho kết quả là chuỗi "50". (Vâng, tôi biết đó là nhiều năm sau đó và nó có thể là một chút buồn Tôi thậm chí còn đọc bài viết này.)
Nick Rice

6

parseInt được định dạng sai như scanf:

parseInt ("12 con khỉ", 10) là một số có giá trị '12'
+ "12 con khỉ" là một số có giá trị 'NaN'
Số ("12 con khỉ") là một số có giá trị 'NaN'


1

Dưới đây là một ví dụ rất khó chịu về cách JavaScript có thể khiến bạn gặp rắc rối:

Nếu bạn chỉ cố gắng sử dụng parseInt()để chuyển đổi thành số và sau đó thêm một số khác vào kết quả, nó sẽ nối hai chuỗi.

Tuy nhiên, bạn có thể giải quyết vấn đề bằng cách đặt biểu thức tổng trong dấu ngoặc đơn như trong ví dụ dưới đây.

Kết quả: Tổng số tuổi của họ là: 98; Tổng tuổi của họ KHÔNG phải là: 5048

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}

var myFather = new Person("John", "Doe", "50", "blue");
var myMother = new Person("Sally", "Rally", 48, "green");

document.getElementById("demo").innerHTML = "Their age sum is: "+
 (parseInt(myFather.age)+myMother.age)+"; Their age sum is NOT: " +
 parseInt(myFather.age)+myMother.age; 
</script>

</body>
</html>


0

Đơn giản nhất là khi bạn muốn biến một số nguyên thành một chuỗi

var a,b, c;
a = 1;
b = a.toString(); // This will give you string

Bây giờ, từ biến b có kiểu chuỗi, chúng ta có thể lấy số nguyên

c = b *1; //This will give you integer value of number :-)

Nếu bạn muốn kiểm tra ở trên là một số. Nếu bạn không chắc b có chứa số nguyên hay không thì bạn có thể sử dụng

if(isNaN(c*1)) {
  //NOt a number
}
else //number

0

Chúng ta có thể làm điều này bằng cách sử dụng toán tử cộng một bậc để chuyển chúng thành số trước tiên và chỉ cần thêm. xem bên dưới:-

var a = "4";
var b = "7";
var sum = +a + +b; 
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.