Chính xác thì kiểu ép buộc trong Javascript là gì?
Ví dụ, về việc sử dụng ==thay vì ===?
Chính xác thì kiểu ép buộc trong Javascript là gì?
Ví dụ, về việc sử dụng ==thay vì ===?
Câu trả lời:
Ép buộc kiểu nghĩa là khi các toán hạng của một toán tử là các kiểu khác nhau, một trong số chúng sẽ được chuyển đổi thành giá trị "tương đương" của kiểu toán hạng kia. Ví dụ, nếu bạn làm:
boolean == integer
các toán hạng boolean sẽ được chuyển đổi sang một số nguyên: falsetrở thành 0, truetrở thành 1. Sau đó hai giá trị được so sánh.
Tuy nhiên, nếu bạn sử dụng toán tử so sánh không chuyển đổi ===, thì không có chuyển đổi nào xảy ra. Khi các toán hạng có kiểu khác nhau, toán tử này trả về falsevà chỉ so sánh các giá trị khi chúng cùng kiểu.
===khi tôi muốn so sánh xem một giá trị có bằng một giá trị khác không?
> , <?
Hãy bắt đầu với phần giới thiệu ngắn về hệ thống loại mà tôi nghĩ sẽ giúp bạn hiểu được ý tưởng chung của việc ép buộc loại.
Hệ thống kiểu của một ngôn ngữ xác định các quy tắc cho chúng ta biết loại dữ liệu nào tồn tại trong ngôn ngữ đó và cách chúng có thể được kết hợp bằng cách sử dụng các toán tử khác nhau. Ví dụ: một quy tắc như vậy có thể chỉ định rằng toán tử cộng (+) chỉ hoạt động trên các số. Những quy tắc này tồn tại chủ yếu để ngăn bạn tự bắn vào chân mình. Nhưng điều gì sẽ xảy ra khi lập trình viên phá vỡ quy tắc đó trong chương trình? Không có gì ngăn cản lập trình viên nhập {} + {}hoặc “hello” + 5trong một chương trình ngay cả khi ngôn ngữ không cho rằng những biểu thức đó có ý nghĩa gì.
Điều gì xảy ra cuối cùng trong những tình huống đó phụ thuộc vào mức độ nghiêm ngặt của ngôn ngữ đối với các quy tắc loại của nó.
Hệ thống loại ngôn ngữ thường giữ một trong hai quan điểm về việc bạn vi phạm các quy tắc của nó:
Các ngôn ngữ có hệ thống kiểu chữ chiếm vị trí đầu tiên về quy tắc của nó được gọi thông tục là ngôn ngữ “được đánh máy mạnh”. Họ nghiêm ngặt về việc không để bạn phá vỡ các quy tắc của nó. Những ngôn ngữ sử dụng cách tiếp cận thứ hai (chẳng hạn như JavaScript) được gọi là ngôn ngữ “được gõ yếu” hoặc “được gõ lỏng lẻo”. Chắc chắn, bạn có thể phá vỡ các quy tắc, nhưng đừng ngạc nhiên khi nó chuyển đổi loại dữ liệu bạn đã mô tả trong chương trình của mình bằng lực lượng để tuân thủ các quy tắc của nó. Hành vi đó được gọi là… (đánh trống)… kiểu cưỡng bức .
Bây giờ chúng ta hãy xem xét một số ví dụ trong JavaScript. Đầu tiên, hãy bắt đầu với một biểu thức không dẫn đến ép buộc nhập.
5 + 5
Sử dụng toán tử + với hai số hoàn toàn hợp lệ. Chương trình sẽ coi + có nghĩa là "thêm" và vui vẻ thêm hai số. Không cần chuyển đổi.
Nhưng còn…
[] + 5
Ồ ồ. Trong JavaScript, +có thể có nghĩa là thêm hai số hoặc nối hai chuỗi. Trong trường hợp này, chúng ta không có hai số hoặc hai chuỗi. Chúng tôi chỉ có một số và một đối tượng. Theo quy tắc loại của JavaScript, điều này không có ý nghĩa logic. Vì nó tha thứ cho việc bạn vi phạm các quy tắc của nó, thay vì làm hỏng nó dù sao thì nó cũng cố gắng hiểu điều đó. Vậy JavaScript làm gì? Vâng, nó biết cách nối các chuỗi, vì vậy nó chuyển đổi cả [] và 5 thành chuỗi và kết quả là giá trị chuỗi “5”.
Thỏa thuận với các toán tử so sánh là gì ==và ===? Tại sao có hai toán tử so sánh?
==không miễn nhiễm với hành vi chuyển đổi kiểu của JavaScript. Các biểu thức chẳng hạn như5 == “5” sẽ đánh giá thành true vì JavaScript sẽ cố gắng chuyển đổi một trong số chúng để nó so sánh cùng một loại dữ liệu.
Trong nhiều trường hợp, điều đó không được mong muốn bởi vì bạn có thể muốn biết liệu một số dữ liệu bạn đang so sánh có thuộc loại khác hay không để bạn có thể quyết định phải làm gì với nó. Đó là nơi mà ===nhà điều hành đến. Khi bạn sử dụng ===, sẽ không có chuyển đổi loại nào diễn ra. Do đó, biểu thức 5 === “5”sẽ đánh giá thành false.
Trong Python nếu bạn cố gắng thêm, nói, chuỗi và số nguyên, bạn sẽ gặp lỗi:
>>> "hi" + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Tuy nhiên, trong JavaScript thì không. Các 10được chuyển đổi sang một chuỗi:
> "hi" + 10
"hi10"
"Loại cưỡng chế" chỉ là một cách gọi nhầm lẫn cho phần trên. Trên thực tế, không ngôn ngữ nào có "kiểu" theo nghĩa của Java hoặc C hoặc các ngôn ngữ khác có hệ thống kiểu tĩnh. Cách các ngôn ngữ xử lý các tương tác giữa các giá trị không được định kiểu tĩnh khác nhau là một vấn đề của sự lựa chọn và quy ước.
hãy để tôi giải thích kiểu cưỡng chế với ví dụ sau
Loại cưỡng chế nghĩa là Javascript tự động (nhanh chóng) chuyển đổi một biến từ kiểu dữ liệu này sang kiểu dữ liệu khác
Ví dụ: 123 + "4"thường gây ra lỗi nhưng trong Javascript do cưỡng chế kiểu, nó dẫn đến 1234một chuỗi
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
Trong đoạn mã trên, vì kiểu ép buộc - JavaScript nghĩ 23(số) và "23"(chuỗi) là một thứ giống nhau. điều này làm cho điều kiện đúng và in ra console.log
Trong trường hợp khác
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
Trong ===trường hợp Javascript không thực hiện Type Coercion, vì 23là một số và "23"là Chuỗi và vì=== hai kiểu dữ liệu này khác nhau và dẫn đến điều kiện sai. Nó không in console.log
Nói một cách đơn giản
Trong trường hợp này, =nó là một toán tử gán - chỉ định các giá trị nhưvar a = 3; , v.v.
(các toán tử dưới đây là để so sánh)
Trong trường hợp này, ==Javascript chuyển đổi / ép buộc kiểu dữ liệu thành một kiểu dữ liệu khác và sau đó so sánh nó.
Trong trường hợp này, === Javascript không chuyển đổi / cưỡng chế kiểu dữ liệu
Để tránh lỗi và cho mục đích gỡ lỗi ===chủ yếu được sử dụng
Vui lòng cho tôi biết độ chính xác của thông tin trên.
Ép buộc gõ trong javascript xảy ra khi công cụ Javascript phải thực hiện một hoạt động nhất định mà nó cần dữ liệu ở một kiểu nhất định. Khi động cơ gặp dữ liệu ở một kiểu nhất định không thể áp dụng cho hoạt động, thì nó sẽ ép dữ liệu thành một kiểu nhất định. Điều này là cần thiết vì các biến trong javascript được nhập động, có nghĩa là một biến nhất định có thể được gán giá trị thuộc bất kỳ kiểu nào.
if(1){
// 1 gets coerced to true
}
if(4 > '3') {
// 3 gets coerced into a number
}
44 == "44" // true, the string 44 gets converted to a nr
Trong javascript cưỡng chế, tất cả các giá trị được chuyển đổi thành truengoại trừ các giá trị sau đây bị ép buộc thành false:
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!false); // false
Cũng lưu ý rằng trong ví dụ trên rằng nhân đôi! toán tử được sử dụng. Các ! toán tử mark buộc một giá trị thành một boolean có giá trị ngược lại. Chúng ta có thể sử dụng toán tử này hai lần để chuyển đổi bất kỳ giá trị nào thành boolean.
a == bphương tiện javascript sẽ đánh giá alại bdựa trên nếu các giá trị có thể được đánh giá như nhau. Ví dụ, false == 0sẽ đánh giá true vì 0 cũng là giá trị của Boolean false. Tuy nhiên, false === 0sẽ đánh giá false bởi vì so sánh chặt chẽ, 0 không cùng giá trị vật lý với false. Một ví dụ khác là false == ''So sánh cơ bản lỏng lẻo so với so sánh chặt chẽ, bởi vì javascript là một ngôn ngữ được đánh máy lỏng lẻo. Có nghĩa là, javascript sẽ cố gắng chuyển đổi biến dựa trên ngữ cảnh của mã và điều này có tác dụng làm cho mọi thứ trở nên bình đẳng nếu chúng không được so sánh chặt chẽ. php cũng có hành vi này.
0 is not the same physical value as false. IMO về mặt vật lý falsechính xác là 0trong bộ nhớ. Tôi muốn nói rằng chúng khác nhau theo kiểu, vì falselà boolean, trong khi 0là số nguyên.
É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, v.v.). Bất kỳ kiểu nào, dù là kiểu 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).
Ép buộc ngầm so với rõ ràng Kiểu ép buộc có thể rõ ràng và ẩn ý.
Khi một nhà phát triển bày tỏ ý định chuyển đổi giữa các loại bằng cách viết mã thích hợp, như Number(value) , nó được gọi là ép kiểu rõ ràng (hoặc kiểu ép kiểu).
Vì JavaScript là một ngôn ngữ được định kiểu yếu, 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 giá trị đượ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:
Thứ hai, logic chuyển đổi cho nguyên thủy và đối tượng hoạt động khác nhau, nhưng cả nguyên thủy và đối tượng chỉ có thể được chuyển đổi theo ba cách đó.
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 hàm String (). Sự ép buộc ngầm được kích hoạt bởi toán tử binary +, khi bất kỳ toán hạng nào là một chuỗi:
String(123) // explicit
123 + '' // implicit
Tất cả các giá trị nguyên thủy được chuyển đổi thành chuỗi một cách tự nhiên như bạn có thể mong đợi:
String(123) // '123'
String(-12.3) // '-12.3'
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(false) // 'false'
Chuyển đổi biểu tượng là một chút phức tạp, bởi vì nó chỉ có thể được chuyển đổi một cách rõ ràng, nhưng không hoàn toàn.
String(Symbol('my symbol')) // 'Symbol(my symbol)'
'' + Symbol('my symbol') // TypeError is thrown
Chuyển đổi Boolean
Để chuyển đổi rõ ràng một giá trị thành một boolean, hãy áp dụng Boolean()hàm. Chuyển đổi ngầm định xảy ra trong ngữ cảnh logic hoặc được kích hoạt bởi các toán tử logic ( || && !).
Boolean(2) // explicit
if (2) { ... } // implicit due to logical context
!!2 // implicit due to logical operator
2 || 'hello' // implicit due to logical operator
Lưu ý: Các toán tử logic chẳng hạn như || and &&thực hiện chuyển đổi boolean trong nội bộ, nhưng thực sự trả về giá trị của các toán hạng ban đầu, ngay cả khi chúng không phải là boolean.
// 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
Ngay khi chỉ có 2 kết quả có thể có của chuyển đổi boolean: true hoặc false, thì việc nhớ danh sách các giá trị sai sẽ dễ dàng hơn.
Boolean('') // false
Boolean(0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(false) // false
Bất kỳ giá trị mà không có trong danh sách được chuyển đổi sang true, bao gồm object, function, Array, Date, loại người dùng định nghĩa, và vân vân. Biểu tượng là giá trị trung thực. Đối tượng và mảng trống cũng là giá trị trung thực:
Boolean({}) // true
Boolean([]) // true
Boolean(Symbol()) // true
!!Symbol() // true
Boolean(function() {}) // true
Chuyển đổi số
Đối với một chuyển đổi rõ ràng, chỉ cần áp dụng Number()hàm, giống như bạn đã làm với Boolean()và String().
Chuyển đổi ngầm rất khó, bởi 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 binary + 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ử đơn phân +
toán tử bình đẳng lỏng lẻo == (incl.! =).
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') // tường minh + '123' // không tường minh 123! = '456' // ẩn 4> '5' // không tường minh 5 / null // không tường minh đúng | 0 // ẩn
Đây là cách các giá trị nguyên thủy được chuyển đổi thành số:
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number(" 12 ") // 12
Number("-12.34") // -12.34
Number("\n") // 0
Number(" 12s ") // NaN
Number(123) // 123
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"
Ví dụ về một biến ban đầu được khai báo là một chuỗi được ép buộc thành giá trị boolean với! nhà điều hành
É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, v.v.). Bất kỳ kiểu nào, dù là kiểu 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).
Sự ép buộc 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, như Số (giá trị), thì nó được gọi là ép kiểu rõ ràng (hoặc ép kiểu).
Vì JavaScript là ngôn ngữ được định kiểu yếu, 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. Điều này thường xảy ra khi bạn áp dụng toán tử cho các giá trị thuộc 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 ngữ cảnh xung quanh, như if (value) {… }, trong đó giá trị được ép buộc thành boolean.
đây là một số ví dụ về cưỡng chế kiểu ngầm:
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 Date(0) - 0
new Date(0) + 0
đọc thêm: https://www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/
(true == 1) => true/(true === 1) => false.