Những sai lầm khi sử dụng toán tử /. Khi sử dụng toán tử /, nguyên nhân kết quả không như mong muốn đó là do chưa áp dụng được những lưu ý trước khi sử dụng toán tử. Xét ví dụ sau cho ra kết quả sai: // vd1: float a = 3/4; printf ("%f", a); //a = 0 // vd2: int b = 2; a = 1 / b; printf
A. Đồng bộ và bất đồng bộ trong javascript là gì. 1. Xử lý đồng bộ (Synchronous) Synchronous (đồng bộ / tuần tự) tức là code chương trình sẽ chạy tuần tự từ trên xuống dưới. Khi nào lệnh trên hoàn thành thì lệnh dưới mới được chạy. Đây là cách viết code rất
Các kiểu dữ liệu C++ - Kiểu cơ bản. Kiểu dữ liệu đầu tiên được nhắc đến trong các dữ liệu C++ không thể không kể đến kiểu dữ liệu cơ bản. Đây là kiểu dữ liệu số học, do đó chúng gồm số nguyên và số thực. Số nguyên: Ghi nhớ được nhiều dạng số liệu
Biến và các kiểu dữ liệu trong Dart. OK, như vậy là trong Bài 1.Cấu trúc một chương trình Flutter/Dart, các bạn đã biết sơ qua về cấu trúc và cách chạy (biên dịch) một chương trình viết bằng Dart/Flutter.. Tuy nhiên, một chương trình tin học thông thường gồm rất nhiều câu lệnh xử lý trên dữ liệu (dữ liệu do
Thiết kế ghế gỗ ván ép phủ veneer đẹp tự nhiên, thanh lịch; Những mẫu ghế gỗ uốn cong phủ laminate kiểu dáng linh hoạt, hiện đại; Chiêm ngưỡng mẫu lưng ghế gỗ ván ép uốn cong đẹp tinh tế, sắc nét; Cách biến tấu đa dạng trên cùng mẫu lưng ghế gỗ ván ép uốn cong
Một tình huống trong Java trước phiên bản 5: Bạn tạo ra một đối tượng ArrayList với mục đích chỉ chứa các phần tử có kiểu String, tuy nhiên tại nơi nào đó trong chương trình bạn thêm vào danh sách này một phần tử không phải String (Việc này hoàn toàn có thể), khi bạn lấy ra các phần tử đó và ép kiểu về
0WOo. Có hai loại ép kiểu trong JavaScript. Ép kiểu ngầm định Implicit Conversion Ép kiểu tường minh Explicit Conversion Ví dụ alert sẽ tự động chuyển bất kỳ kiểu dữ liệu nào về string để hiển thị chún Domain Liên kết Bài viết liên quan ép kiểu trong javascript JavaScript Ép kiểu Các kiểu dữ liệu cơ bản trong JavaScript. ... JavaScript Kiểu dữ liệu số. JavaScript Toán tử. JavaScript Symbol. JavaScript Ép kiểu. Mảng trong Javascript. ... JavaScript Mảng đa chiều. Kiểm soát Xem thêm Chi Tiết
Variable TypesCác kiểu giá trị trong JavaScriptNhững giá trị được coi là falsetrue or not true?Loose ComparisonsMột số quy tắcMột số chú ýThe Answers Có người vẫn nói vui rằng JavaScript là “The World’s Most Misunderstood Programming Language”, bởi có rất nhiều lập trình viên Web vẫn đang làm việc, thậm chí là làm việc rất nhiều, và rất tốt với JavaScript nhưng lại không thể hiểu rõ căn bản của nó. JavaScript quả thật tuy là gần gũi, quen thuộc thật đấy nhưng đôi khi lại rất xa lạ với chúng ta ở vài mặt nào đó. Bài viết này xin được giới thiệu về một trong những mặt có phần “xa lạ” đó của JavaScript. Trước tiên, mình xin có một vài câu đố nhỏ cho các bạn. Câu hỏi rất đơn giản thôi “Các phép toán dưới đây trả về true hay false“. Bạn có thể kiểm tra câu trả lời một cách dễ dàng bằng cách mở console của trình duyệt lên và gõ câu lệnh vào đó, hoặc xem ở cuối bài viết này. false == false // It will return true. Too easy, right ? D // But how about the following ? TRUE or FALSE ? // Các phép so sánh sau trả về true hay false null == undefined null == false undefined == false NaN == NaN NaN == false NaN == true 63 == false 63 == true 0 == false "63" == true "63" == false "0" == true "0" == false !"0" == !false "" == false [] == "" [] == false [] == "0" [] == 0 [] == ![] "0" == !"0" 0 == {} [1] b a == b a = b Code language JavaScript javascript Nếu bạn có thể trả lời đúng hết, và hiểu được bản chất tại sao nó lại như vậy thì có lẽ bạn cũng đã nắm rõ hết được những gì mà bài viết này đề sẽ cập đến rồi. Còn ngược lại, hãy dành chút thời gian để đọc và tìm hiểu về những điều sẽ được giới thiệu dưới đây, và bạn sẽ tự tìm được lời giải thích cho từng đáp án. Let’s start! honho Variable Types Để trả lời được những câu hỏi trên thì trước hết ta cần phải tìm hiểu và nắm rõ được về những kiểu giá trị có trong Javascipt. Các kiểu giá trị trong JavaScript Trong Javascript phiên bản phiên bản mới nhất tính đến thời điểm thực hiện bài viết này 5/2015, có những kiểu giá trị sau booleannullundefinedstringnumberobject Ngoài ra còn một kiểu giá trị nữa, sẽ được đưa vào phiên bản tiếp theo của Javascript ES6, đó là symbol Tất các các kiểu dữ liệu khác Object được gọi là giá trị “nguyên thủy”, Primitive. Một số điều cần lưu ý Kiểu Boolean gồm 2 giá trị là true và Null chỉ gồm duy nhất một giá trị là Undefined chỉ gồm duy nhất một giá trị là undefined. Như đã biết thì để so sánh “bằng” trong Javascript, ta có thể dùng == và ===. ===, Strict Comparison hay Strict Equal, sẽ so sánh cả kiểu giá trị của 2 bên. Nếu 2 bên có kiểu giá trị khác nhau thì phép toán sẽ trả về giá trị false. Phép toán === là rất minh bạch và dễ sử dụng, ít gây hiểu nhầm hay khó khăn gì cho lập trình viên. Còn phép so sánh ==, Loose Comparison hay Loose Equal, thì sẽ tìm cách đưa một trong 2 bên về cùng kiểu giá trị với bên kia rồi thực hiện phép so sánh. Có rất nhiều cách để ép một giá trị từ kiểu này về kiểu kia, một trong những cách đơn giản nhất là sử dụng các hàm có sẵn của Javascript là Boolean, String, Number, Object … Boolean1 // true Stringnull // "null" Number" // Number"1string" // NaN String[1, 2, "string"] // "1,2,string" Code language JavaScript javascript Những giá trị được coi là false Đó là những giá trị khi được ép về kiểu Boolean sẽ cho giá trị là false. Bao gồm falseundefinednull0 Gồm cả +0 và -0NaN Not A Number"" Empty String Vậy những giá trị nào khi ép về kiểu Boolean sẽ cho giá trị là true ? Câu trả lời rất đơn giản những giá trị không nằm trong list các giá trị đã kể ở phía trên tức là ngoài false, undefined, null, 0, NaN và "" ra. true or not true? Trong các phép toán điều kiện như if, else, when … , nếu không sử dụng các toán tử so sánh, mà chỉ có biến số hay giá trị ở trong đó thì nó sẽ được ép về kiểu boolean, ví dụ if null { // It will not reach here } else if 0 { // It will not reach here } else if "" { // It will not reach here } else if 1 { // REACH here } Code language JavaScript javascript Đến đây, hãy nhìn lại list các câu hỏi được đưa ra ở đầu bài một chút. Ta có phép toán "0" == true chẳng hạn. Hãy so sánh 2 trường hợp sau nhé if "0" { // It WILL reach here } if "0" == true { // It will NOT reach here } Code language PHP php Vâng, một cái bẫy mà Javascript đã giăng ra dành cho các lập trình viên mà không phải ai cũng biết, và có thể đã mắc phải mà không hề hay. "0" cho giá trị Boolean là true, nhưng lại trả về false trong phép so sánh == với true. Vậy đâu là nguyên nhân, hãy tìm hiểu các quy tắc trong phép so sánh ở phần dưới đây. Loose Comparisons Một số quy tắc Khi thực hiện so sánh bằng phép toán ==, trong trường hợp 2 vế có giá trị thuộc những kiểu khác nhau thì sẽ có một số các quy tắc sau được áp dụng. Việc suy nghĩ cả 2 vế đều được ép về kiểu Boolean và so sánh 2 giá trị Boolean là một sai lầm. null chỉ == chính nó hoặc undefined và ngược lại. Từ quy tắc này ta thấy được phép toán null == false hay undefined == false sẽ trả về false!Khi so sánh một String với một Number thì giá trị String sẽ bị ép về kiểu Number để so so sánh một giá trị thuộc kiểu Boolean với một giá trị thuộc kiểu khác thì giá trị thuộc kiểu Boolean sẽ được ép về kiểu Number để so trị true sẽ được ép thành 1, giá trị false sẽ được ép thành lại với ví dụ là phép toán "0" == true. Đầu tiên true sẽ được chuyển thành 1, phép toán trở thành "0" == đến String "0" được ép về kiểu Number thành 0 để ta có được phép toán 0 == 1. Rõ ràng nó sẽ trả về "0" có giá trị Boolean là true, nhưng phép toán "0" == true sẽ trả về so sánh một biến có kiểu Object với một biến không phải là Object tức một giá trị thuộc nhóm Primitive boolean, number, string, null, undefined thì giá trị của Object sẽ là giá trị trả về của hàm valueOf, nếu nó là lại, nếu hàm valueOf không được định nghĩa, hoặc nó trả về giá trị không phải là Primitive, thì giá trị của Object sẽ là giá trị trả về từ hàm hàm toString cũng trả về một giá trị không phải là Primitive thì sẽ xảy ra lỗi TypeError [63] == "63" // true [3, 10] == "3,10" // true var num = { valueOf function { return 1; }, toString function { return "2"; } }; num == "1" // true num == 2 // false var num = { valueOf function { return [1]; }, toString function { return 2; } }; num == "1" // false num == 2 // true var num = { valueOf function { return [1]; }, toString function { return [2]; } }; num == "1" // TypeError Cannot convert object to primitive value Code language JavaScript javascript Hai biến cùng thuộc loại Object chỉ bằng nhau nếu chúng cùng trỏ đến một Object. [1] == [1] // false {a 1} == {a 1} // false var x = [1]; var y = [1]; x == y // false var x = y = [1]; x == y // true var x = {a 1}; var y = x; x == y // true Code language JavaScript javascript Một số chú ý NaN không bằng chính nó. Phép toán NaN == NaN hay NaN === NaN đều trả về false. NaN được thiết kế để mọi phép so sánh ==, >, =, = thực sự là một cái bẫy nữa. Như trong tiếng Việt thì ta sẽ gọi đó là phép toán lớn hơn hoặc bằng, tuy nhiên thực tế Javascript lại không dịch như vậy, nó hiểu >= là phép toán không nhỏ phép toán a >= b không phải tương đương với a > b a == b, mà nó tương đương với !a b // false a == b // false a = b // trueCode language JavaScript javascript Nguồn Các bạn có thể tham khảo các bài viết hay về JavaScript tại đây. Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.
Định nghĩa hàm push trong JavaScriptCú pháp hàm push trong JavaScript Gán giá trị cho mảngLàm thế nào để thêm một mảng vào mảng khác?Sử dụng hàm push với ObjectKết luận Trong bài viết này, chúng ta sẽ tìm hiểu về hàm push trong JavaScript. Nếu như ở các ngôn ngữ lập trình khác, việc thêm phần tử vào cuối mảng diễn ra một cách thủ công từ việc bạn phải tăng số lượng phần tử trong mảng rồi đi gán giá trị cho phần tử đó. Nhưng với JavaScript thì linh hoạt hơn, bạn sẽ không phải mất nhiều công đoạn cho việc này. >> Xem ngay Tài liệu Java Core giúp bạn “Nâng Cấp” kỹ năng lập trình Hàm push trong JavaScript được sử dụng để thêm một hoặc nhiều phần tử vào trong mảng. Phần tử được thêm sẽ nằm ở vị trí cuối mảng. Khác với hàm push, hàm unshift sẽ thêm một hoặc nhiều phần tử vào trong mảng nhưng phần tử được thêm sẽ nằm ở vị trí đầu mảng. Cú pháp hàm push trong JavaScript Cú pháp item2, item3,..., itemNCode language CSS css Trong đó Tham sốMô tảarrayMảng cần thêm phần tửitem1, item2, item3,…, itemNPhần tử cần được thêm Ví dụ Thêm 1 phần tử vào vị trí cuối cùng của mảng let arr = [0, 1, 2, 3]; // [0, 1, 2, 3, 4]Code language JavaScript javascript Trong ví dụ trên, câu lệnh thêm phần tử 4 vào vị trí cuối cùng trong mảng. Hàm push chấp nhận số lượng đối số không giới hạn và bạn có thể thêm bấy nhiêu phần tử tùy thích vào cuối mảng. let arr = [0, 1, 2, 3]; 5, 6, 7, 8, 9; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]Code language JavaScript javascript Hàm push trả về độ dài mới của mảng. let arr = [0, 1, 2, 3]; let newLength = // 5Code language JavaScript javascript Gán giá trị cho mảng Gán mảng hiện tại là kết quả của hàm push. Đây là một lỗi rất cơ bản mà nhiều bạn mắc phải. let arr = [0, 1, 2, 3]; arr = // 5Code language JavaScript javascript Để tránh lỗi này, bạn cần nhớ rằng push sẽ trả về độ dài mới của mảng. Nếu bạn gán giá trị cho mảng với giá trị là kết quả của hàm push thì có nghĩa là bạn đang ghi đè giá trị mảng bằng độ dài mới của mảng. Trong ví dụ trên, mảng arr được ghi đè bằng giá trị 5 độ dài mới của mảng. Làm thế nào để thêm một mảng vào mảng khác? Nếu bạn muốn thêm các phần tử của một mảng vào cuối mảng khác, bạn cũng có thể lựa chọn hàm push để sử dụng. let arr1 = [0, 1, 2, 3]; let arr2 = [4, 5, 6, 7]; let arr3 = // [0, 1, 2, 3, 4, 5, 6, 7]Code language JavaScript javascript Hàm push sẽ thêm tất cả các đối số nên từ khi ES6 ra mắt, chúng ta có thể sử dụng Spread Operator trong trường hợp này. let arr1 = [0, 1, 2, 3]; let arr2 = [4, 5, 6, 7]; // [0, 1, 2, 3, 4, 5, 6, 7]Code language JavaScript javascript Spread Operator trong JavaScript Sử dụng hàm push với Object Có những đối tượng tương tự như mảng như đối tượng arguments – đối tượng cho phép truy cập vào tất cả các đối số của một hàm, nhưng nó không có tất cả các hàm mà mảng có. Để có thể sử dụng hàm push hoặc các hàm khác, trước tiên chúng phải được ép kiểu thành mảng. function myFunc { let args = [...arguments]; returns args; } 1, 2, 3; // [0, 1, 2, 3, 4]Code language JavaScript javascript Nếu bạn không ép kiểu đối tượng arguments thành một mảng, thông báo lỗi sẽ được hiển thị trong console. TypeError is not a functionCode language JavaScript javascript Ép kiểu trong JavaScript Kết luận Hàm push trong JavaScript sẽ thêm một hoặc nhiều phần tử vào trong mảng và trả về độ dài mới của mảng đó. Hãy ghi nhớ cách sử dụng của hàm này vì nếu bạn vẫn còn làm việc với JavaScript thì bạn sẽ sử dụng nó thường xuyên đấy. Cảm ơn bạn đã đọc! Các bạn có thể tham khảo các bài viết hay về JavaScript tại đây. Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm. CẨM NANG LẬP TRÌNH CĂN BẢN CHO NGƯỜI MỚI BẮT ĐẦU
Những điều kỳ lạ có thể xảy ra trong JavaScript [Chỉnh sửa 2/5/2018] Bài đăng này hiện đã có bằng tiếng Nga . Vỗ tay cho Serj Bulavyk vì những nỗ lực của anh ấy. Ép buộc kiểu là quá trình chuyển đổi giá trị từ kiểu này sang kiểu khác chẳng hạn như chuỗi thành số, đối tượng thành boolean, Bất kỳ kiểu nào, dù là nguyên thủy hay một đối tượng, đều là một chủ thể hợp lệ để ép kiểu. Để nhớ lại, các nguyên thủy là number, string, boolean, null, undefined + Symbol được thêm vào trong ES6. Để làm ví dụ về ép buộc kiểu trong thực tế, hãy xem Bảng So sánh JavaScript , bảng này cho thấy cách ==hoạt động của toán tử bình đẳng lỏng lẻo đối với các kiểu avà bkhác nhau. Ma trận này trông đáng sợ do sự ép buộc kiểu ngầm mà ==toán tử thực hiện, và khó có thể nhớ tất cả các kết hợp đó. Và bạn không cần phải làm điều đó - chỉ cần tìm hiểu các nguyên tắc cưỡng chế cơ bản. Bài viết này đi sâu vào cách thức hoạt động của tính năng cưỡng chế kiểu trong JavaScript và sẽ cung cấp cho bạn kiến thức cần thiết, vì vậy bạn có thể tự tin giải thích những biểu thức sau đây tính toán gì. Đến cuối bài viết, tôi sẽ hiển thị câu trả lời và giải thích chúng. true + false 12 / "6" "number" + 15 + 3 15 + 3 + "number" [1] > null "foo" + + "bar" 'true' == true false == 'false' null == '' !!"false" == !!"true" [x’] == x’ [] + null + 1 [1,2,3] == [1,2,3] {}+[]+{}+[1] !+[]+[]+![] new Date0 - 0 new Date0 + 0 Nhân tiện, đôi khi bạn có thể phải đối mặt với những câu hỏi như vậy trong cuộc phỏng vấn cho vị trí nhà phát triển JavaScript. Vì vậy, hãy tiếp tục đọc 😄 Ép buộc ngầm so với rõ ràng Cưỡng chế kiểu có thể rõ ràng và ngầm hiểu. Khi một nhà phát triển thể hiện ý định chuyển đổi giữa các kiểu bằng cách viết mã thích hợp, chẳng hạn như Numbervalue, nó được gọi là ép kiểu rõ ràng hoặc ép kiểu. Vì JavaScript là một ngôn ngữ được định kiểu yếu nên các giá trị cũng có thể được chuyển đổi tự động giữa các kiểu khác nhau và nó được gọi là kiểu ép buộc ngầm định . Nó thường xảy ra khi bạn áp dụng khai thác các giá trị của các loại khác nhau, như 1 == null, 2/’5', null + new Date, hoặc nó có thể được kích hoạt bởi bối cảnh xung quanh, giống như với if value {…}, nơi valueđược ép buộc để boolean. Một toán tử không kích hoạt cưỡng chế kiểu ngầm định là ===, được gọi là toán tử bình đẳng nghiêm ngặt. Mặt khác, toán tử bình đẳng lỏng ==thực hiện cả phép so sánh và kiểu cưỡng chế nếu cần. Ép buộc kiểu ngầm là một thanh kiếm hai cạnh đó là nguồn gốc lớn của sự thất vọng và khiếm khuyết, nhưng cũng là một cơ chế hữu ích cho phép chúng ta viết ít mã hơn mà không làm mất khả năng đọc. Ba loại chuyển đổi Quy tắc đầu tiên cần biết là chỉ có ba loại chuyển đổi trong JavaScript xâu chuỗi đến boolean đến số Hãy bắt đầu với nguyên thủy trước. Chuyển đổi chuỗi Để chuyển đổi rõ ràng các giá trị thành một chuỗi, hãy áp dụng Stringhàm. Sự ép buộc ngầm được kích hoạt bởi +toán tử nhị phân , khi bất kỳ toán hạng nào là một chuỗi String123 // explicit 123 + '' // implicit String123 // '123' String // ' Stringnull // 'null' Stringundefined // 'undefined' Stringtrue // 'true' Stringfalse // 'false' StringSymbol'my symbol' // 'Symbolmy symbol' '' + Symbol'my symbol' // TypeError is thrown Để chuyển đổi rõ ràng một giá trị thành một boolean, hãy áp dụng Booleanhàm. Chuyển đổi ngầm định xảy ra trong ngữ cảnh lôgic hoặc được kích hoạt bởi các toán tử lôgic && !. Boolean2 // explicit if 2 { ... } // implicit due to logical context !!2 // implicit due to logical operator 2 'hello' // implicit due to logical operator // returns number 123, instead of returning true // 'hello' and 123 are still coerced to boolean internally to calculate the expression let x = 'hello' && 123; // x === 123 Boolean'' // false Boolean0 // false Boolean-0 // false BooleanNaN // false Booleannull // false Booleanundefined // false Booleanfalse // false Boolean{} // true Boolean[] // true BooleanSymbol // true !!Symbol // true Booleanfunction {} // true Đối với một chuyển đổi rõ ràng, chỉ cần áp dụng Numberhàm, giống như bạn đã làm với Booleanvà String. Chuyển đổi ngầm rất phức tạp vì nó được kích hoạt trong nhiều trường hợp hơn toán tử so sánh >, = toán tử bitwise & ^ ~ toán tử số học - + * / %. Lưu ý rằng nhị phân +không kích hoạt chuyển đổi số, khi bất kỳ toán hạng nào là một chuỗi. toán +tử một ngôi toán tử bình đẳng lỏng lẻo ==bao gồm !=. Lưu ý rằng ==không kích hoạt chuyển đổi số khi cả hai toán hạng đều là chuỗi. Number'123' // explicit +'123' // implicit 123 != '456' // implicit 4 > '5' // implicit 5/null // implicit true 0 // implicit Numbernull // 0 Numberundefined // NaN Numbertrue // 1 Numberfalse // 0 Number" 12 " // 12 Number" // Number"\n" // 0 Number" 12s " // NaN Number123 // 123 Các ký hiệu không thể được chuyển đổi thành một số không rõ ràng cũng như ngầm định. Hơn nữa, TypeErrorđược ném, thay vì âm thầm chuyển đổi thành NaN, giống như nó xảy ra cho undefined. Xem thêm về Quy tắc chuyển đổi ký hiệu trên MDN . NumberSymbol'my symbol' // TypeError is thrown +Symbol'123' // TypeError is thrown Khi áp dụng ==cho nullhoặc undefined, chuyển đổi số không xảy ra. nullchỉ bằng nullhoặc undefined, và không bằng bất kỳ thứ gì khác. null == 0 // false, null is not converted to 0 null == null // true undefined == undefined // true null == undefined // true if value !== value { dealing with NaN here" } Khi nói đến các đối tượng và động cơ gặp phải biểu thức như [1] + [2,3], trước tiên nó cần chuyển đổi một đối tượng thành giá trị nguyên thủy, sau đó được chuyển đổi thành kiểu cuối cùng. Và vẫn chỉ có ba loại chuyển đổi số, chuỗi và boolean. Trường hợp đơn giản nhất là chuyển đổi boolean mọi giá trị không phải nguyên thủy luôn bị ép buộc true, bất kể đối tượng hoặc mảng có trống hay không. Các đối tượng được chuyển đổi thành nguyên thủy thông qua [[ToPrimitive]]phương thức bên trong , phương thức này chịu trách nhiệm chuyển đổi cả dạng số và chuỗi. Đây là một triển khai giả của [[ToPrimitive]]phương pháp [[ToPrimitive]]được chuyển với một giá trị đầu vào và kiểu chuyển đổi ưu tiên Numberhoặc String. preferredTypeLà tùy chọn. Cả chuyển đổi số và chuỗi đều sử dụng hai phương thức của đối tượng đầu vào valueOfvà toString. Cả hai phương pháp được khai báo trên do đó sẵn cho bất kỳ loại có nguồn gốc, chẳng hạn như Date, Arrayvv Nói chung, thuật toán như sau Nếu đầu vào đã là nguyên thủy, không làm gì cả và trả về. 3. Gọi nếu kết quả là nguyên thủy, trả về nó. 4. Nếu không không kết quả nguyên thủy, hãy ném TypeError. Cuộc gọi đầu tiên của chuyển đổi số valueOf3 với dự phòng là toString2. Chuyển đổi chuỗi thực hiện ngược lại toString2 theo sau là valueOf3. Hầu hết các kiểu dựng sẵn không có valueOfhoặc có đối tượng valueOftrả về thischính nó, vì vậy nó bị bỏ qua vì nó không phải là một nguyên thủy. Đó là lý do tại sao chuyển đổi số và chuỗi có thể hoạt động giống nhau - cả hai đều kết thúc cuộc gọi toString. Các toán tử khác nhau có thể kích hoạt chuyển đổi số hoặc chuỗi với sự trợ giúp của preferredTypetham số. Nhưng có hai trường hợp ngoại lệ bình đẳng lỏng lẻo ==và +toán tử nhị phân kích hoạt chế độ chuyển đổi mặc định preferredTypekhông được chỉ định hoặc bằng default. Trong trường hợp này, hầu hết các kiểu tích hợp đều giả định chuyển đổi số làm mặc định, ngoại trừ Datechuyển đổi chuỗi. Dưới đây là một ví dụ về Datehành vi chuyển đổi Bạn có thể ghi đè mặc định toStringvà valueOfcác phương thức để nối vào logic chuyển đổi đối tượng thành nguyên thủy. Lưu ý cách obj + ’trả về 101’dưới dạng một chuỗi. +toán tử kích hoạt chế độ chuyển đổi mặc định và như đã nói trước đây Objectgiả định chuyển đổi số làm mặc định, do đó sử dụng valueOfphương pháp này trước tiên thay vì toString. Phương thức ES6 Trong ES5, bạn có thể kết nối vào logic chuyển đổi đối tượng thành nguyên thủy bằng cách ghi đè toStringvà valueOfcác phương thức. Trong ES6, bạn có thể đi xa hơn và thay thế hoàn toàn [[ToPrimitive]]quy trình nội bộ bằng cách triển khai [ thức trên một đối tượng. Ví dụ Được trang bị lý thuyết, bây giờ hãy quay lại các ví dụ của chúng tôi true + false // 1 12 / "6" // 2 "number" + 15 + 3 // 'number153' 15 + 3 + "number" // '18number' [1] > null // true "foo" + + "bar" // 'fooNaN' 'true' == true // false false == 'false' // false null == '' // false !!"false" == !!"true" // true ['x'] == 'x' // true [] + null + 1 // 'null1' [1,2,3] == [1,2,3] // false {}+[]+{}+[1] // '0[object Object]1' !+[]+[]+![] // 'truefalse' new Date0 - 0 // 0 new Date0 + 0 // 'Thu Jan 01 1970 020000EET0' +Toán tử nhị phân kích hoạt chuyển đổi số cho truevàfalse true + false ==> 1 + 0 ==> 1 12 / '6' ==> 12 / 6 ==>> 2 “number” + 15 + 3 ==> "number15" + 3 ==> "number153" 15 + 3 + "number" ==> 18 + "number" ==> "18number" [1] > null ==> '1' > 0 ==> 1 > 0 ==> true "foo" + + "bar" ==> "foo" + +"bar" ==> "foo" + NaN ==> "fooNaN" 'true' == true ==> NaN == 1 ==> false false == 'false' ==> 0 == NaN ==> false null == '' ==> false !!"false" == !!"true" ==> true == true ==> true ['x'] == 'x' ==> 'x' == 'x' ==> true Trên biểu thức bước thứ hai '' + null + 1được đánh giá. [] + null + 1 ==> '' + null + 1 ==> 'null' + 1 ==> 'null1' 0 "0" && {} ==> 0 "0" && {} ==> false true && true // internally ==> "0" && {} ==> true && true // internally ==> {} [1,2,3] == [1,2,3] ==> false {}+[]+{}+[1] ==> +[]+{}+[1] ==> 0 + {} + [1] ==> 0 + '[object Object]' + [1] ==> '0[object Object]' + [1] ==> '0[object Object]' + '1' ==> '0[object Object]1' !+[]+[]+![] ==> !+[] + [] + ![] ==> !0 + [] + false ==> true + [] + false ==> true + '' + false ==> 'truefalse' new Date0 - 0 ==> 0 - 0 ==> 0 new Date0 + 0 ==> 'Thu Jan 01 1970 020000 GMT+0200 EET' + 0 ==> 'Thu Jan 01 1970 020000 GMT+0200 EET0' Tôi thực sự muốn giới thiệu cuốn sách xuất sắc “ Hiểu về ES6 ” do Nicholas C. Zakas viết . Đó là một nguồn tài liệu học tập ES6 tuyệt vời, không quá cao cấp và không đào sâu vào nội bộ quá nhiều. Và đây là một cuốn sách hay chỉ dành cho ES5 - SpeakingJS được viết bởi Axel Rauschmayer . Tiếng Nga Современный учебник Javascript - Đặc biệt là những hai trang trên kiểu ép buộc. Bảng so sánh JavaScript - wtfjs - một blog mã nhỏ về ngôn ngữ mà chúng ta yêu thích mặc dù khiến chúng ta rất ghét -
ép kiểu trong javascript