Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Trong JavaScript, đối tượng cửa sổ là đối tượng phạm vi toàn cầu. Điều này có nghĩa là các biến, thuộc tính và phương thức mặc định thuộc về đối tượng window. Điều này cũng có nghĩa là việc chỉ định từ khóa

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
8 là tùy chọn

Thí dụ



Trang web đầu tiên của tôi

Đoạn đầu tiên của tôi


Tự mình thử »


Sử dụng bảng điều khiển. nhật ký()

Để gỡ lỗi, bạn có thể gọi phương thức

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
9 trong trình duyệt để hiển thị dữ liệu

Bạn sẽ tìm hiểu thêm về gỡ lỗi trong chương sau

Thí dụ




Tự mình thử »


In JavaScript

JavaScript không có bất kỳ đối tượng in hoặc phương thức in nào

Bạn không thể truy cập các thiết bị đầu ra từ JavaScript

Ngoại lệ duy nhất là bạn có thể gọi phương thức

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
01 trong trình duyệt để in nội dung của cửa sổ hiện tại

Trong Pass by Value, Hàm được gọi bằng cách truyền trực tiếp giá trị của biến làm đối số. Thay đổi đối số bên trong hàm không ảnh hưởng đến biến được truyền từ bên ngoài hàm

Javascript luôn chuyển theo giá trị, vì vậy việc thay đổi giá trị của biến không bao giờ thay đổi nguyên hàm cơ bản (Chuỗi hoặc số)

function callByValue(varOne, varTwo) { 
console.log("Inside Call by Value Method");
varOne = 100;
varTwo = 200;
console.log("varOne =" + varOne +"varTwo =" +varTwo);
}
let varOne = 10;
let varTwo = 20;
console.log("Before Call by Value Method");
console.log("varOne =" + varOne +"varTwo =" +varTwo);
callByValue(varOne, varTwo) console.log("After Call by Value Method");
console.log("varOne =" + varOne +"varTwo =" +varTwo);

output will be :
---------------
Before Call by Value Method
varOne =10 varTwo =20
Inside Call by Value Method
varOne =100 varTwo =200
After Call by Value Method
varOne =10 varTwo =20

Tuy nhiên, khi một biến đề cập đến một đối tượng bao gồm mảng, giá trị là tham chiếu đến đối tượng

Vượt qua tham chiếu

Trong Pass by Reference, Hàm được gọi bằng cách chuyển trực tiếp tham chiếu/địa chỉ của biến làm đối số. Thay đổi đối số bên trong hàm ảnh hưởng đến biến được truyền từ bên ngoài hàm. Trong các đối tượng và mảng Javascript theo sau chuyển qua tham chiếu

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}

vì vậy nếu chúng ta chuyển đối tượng hoặc mảng làm đối số cho phương thức, thì có khả năng giá trị của đối tượng có thể thay đổi

Khi chúng ta bắt đầu học lập trình, chúng ta thường được dạy sử dụng một số phép ẩn dụ để giúp chúng ta hiểu một trong những khái niệm cơ bản nhất trong lập trình - biến. Bạn có thể hoặc không được yêu cầu nghĩ về các biến như hộp lưu trữ hoặc nhà. Dù phép ẩn dụ đó là gì, nó đã trở thành lối tắt trong trí óc mà chúng ta sử dụng khi đọc/viết chương trình, nhưng chúng ta hiếm khi dành thời gian để xem xét những trực giác mà chúng ta đã phát triển theo thời gian

Trong bài viết này, tôi sẽ

  1. ở mức đặc tả ngôn ngữ, thảo luận về các loại mô hình tinh thần khác nhau cho các biến
  2. đi xuống bậc thang của sự trừu tượng và xem kỹ cách triển khai ngôn ngữ JavaScript để xem các biến JavaScript thực sự được tạo ra từ gì
  3. phá vỡ một trong những huyền thoại đô thị nổi tiếng nhất trong JavaScript - chuyển qua tham chiếu cho đối tượng

TL;DR. #

Bài đăng trên blog này có thể sẽ quá dài và, có thể theo quan điểm của một số người, mang tính mô phạm. Vì vậy, tôi nghĩ rằng tôi sẽ đưa ra một TL nhanh chóng; DR

  1. Thay vì coi một biến JavaScript như một cái hộp, bạn nên nghĩ nó như một cái nhãn, một sợi dây, thứ gì đó trỏ đến/tham chiếu đến giá trị
  2. Tất cả các biến JavaScript đều được triển khai dưới dạng con trỏ và các giá trị luôn ở trên heap, bao gồm các giá trị và đối tượng nguyên thủy. (ngoại trừ số nguyên nhỏ do gắn thẻ con trỏ)
  3. Các đối tượng không được truyền theo tham chiếu. Bạn có thể tranh luận rằng tất cả đều thuộc về danh pháp, nhưng trong JavaScript, việc truyền các đối tượng hoặc giá trị nguyên thủy cho một hàm không được xử lý theo cách khác trong bộ nhớ

Mô hình tinh thần cho các biến #

Có hai trường phái tư tưởng mà tôi đã thấy khi nói đến các mô hình tinh thần cho các biến số.

  1. hộp lưu trữ, nhà, hoặc một số loại container
  2. nhãn, dây hoặc một số loại tài liệu tham khảo

Một hộp#

Đối với hầu hết mọi người, "chiếc hộp" có lẽ là phép ẩn dụ đầu tiên họ được dạy sử dụng khi học lập trình. Tôi đoán điều này là do đối với hầu hết mọi người, ngôn ngữ lập trình được dạy chính thức đầu tiên của họ là C. Ít nhất là đối với thế hệ của tôi, chúng tôi đã không dạy Python tại CS101

Mô hình tinh thần "hộp" này hoạt động tốt đối với các ngôn ngữ như C và C++, trong đó một biến có thể có giá trị theo nghĩa đen của nó khi được biểu thị trong bộ nhớ. Nói cách khác, một biến C/C++ được tải tại một số địa chỉ bộ nhớ và bắt đầu từ địa chỉ đó, các bit trong khối bộ nhớ tự tạo nên giá trị

Đây là một ví dụ trong C++

struct Position
{
    int x;
    int y;
};

struct Line
{
    Position pos1;
    Position pos2;
};

Line foo;

Biến

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
1 sẽ có kích thước bằng 4 số nguyên, do đó có 16 byte trong bộ nhớ

Kích thước chính xác có thể khác nhau tùy thuộc vào kiến ​​trúc CPU và có thể không chính xác 4

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
2 vì có thể có một số phần đệm bổ sung cho mục đích căn chỉnh

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Khi bạn gán nó cho một biến khác hoặc chuyển nó làm đối số cho một hàm, nghĩa đen là bạn đang mang một khối bộ nhớ có kích thước 16 byte xung quanh và sao chép toàn bộ nội dung vào biến mới hoặc tham số đó.

Line foo{{1, 2}, {3, 4}};
Line bar = foo;

Đây là hành vi mặc định trong C++. Bạn có thể tránh chúng bằng cách xóa hàm tạo bản sao hoặc ở chế độ riêng tư hoặc chuyển theo tham chiếu thay vì chuyển theo giá trị. Vì đây không phải là bài viết về C++ nên tôi sẽ không đi vào chi tiết

Toán tử gán

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
0 thay thế nội dung của đối tượng
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
1 bằng một bản sao toàn bộ nội dung của
const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
1

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Bây giờ chúng ta có hai khối bộ nhớ có kích thước 16 byte và chúng độc lập với nhau, e. g.

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
3 và
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
4 là hai đối tượng riêng biệt

Do đó, các biến trong C/C++ giống như các hộp, trừ khi bạn khai báo chúng dưới dạng tham chiếu/con trỏ

Một dây#

Mô hình tinh thần “chiếc hộp” không thành công khi các biến và giá trị được lưu trữ ở những vị trí khác nhau trong bộ nhớ

________số 8

Không giống như ví dụ về C++,

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
1 trong đoạn mã JavaScript ở trên không chứa giá trị đối tượng bên trong. Có thêm một lớp định hướng ở đây

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Khi chúng ta gán giá trị của
const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
1 cho một biến mới
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
1 như trong
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
8, chúng sẽ bắt đầu chia sẻ cùng một đối tượng, dẫn đến
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
3 và
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
4 là cùng một đối tượng

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Vì vậy, thay vì coi các biến là những chiếc hộp, trong JavaScript, hãy coi các biến là những sợi dây kết nối bạn với các giá trị

còn giá trị nguyên thủy thì sao?#

Ví dụ trên là về đối tượng trong JavaScript. Tại thời điểm này, bạn có thể nghi ngờ về tính chính xác hoặc hiệu quả của phương thức tinh thần “dây” đối với các giá trị của các kiểu nguyên thủy. Ví dụ: nếu chúng ta khởi tạo

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
1 ở dạng chuỗi, số hoặc boolean, liệu biến có thực sự giữ giá trị bên trong, giống như những gì chúng ta đã thấy trong ví dụ C++ không?

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
3

Với đoạn mã JavaScript ở trên, liệu chúng ta có kết thúc với hai khối bộ nhớ riêng biệt tạo thành chuỗi

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
2 không?

Câu trả lời là cái sau. Nó không khác nhiều so với các đối tượng, ngoại trừ các đối tượng có thể thay đổi và các kiểu nguyên thủy là bất biến

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Sử dụng các ký tự đối tượng luôn cung cấp cho bạn các đối tượng mới, duy nhất, trong khi các giá trị nguyên thủy (ngoại trừ các số, chúng phức tạp) được sử dụng lại. Điều đó có nghĩa là với

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
6, chúng tôi chỉ có một chuỗi
const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
1 được lưu trữ trong bộ nhớ khi chạy do thực tập chuỗi. Điều này thoạt nghe có vẻ lạ đối với bạn và nếu bạn cần bằng chứng, vui lòng xem bài đăng của tôi về chủ đề mô hình bộ nhớ trong V8

thông số kỹ thuật nói gì #

Trước khi tôi đi sâu vào triển khai ngôn ngữ để thực sự cho bạn thấy các biến JavaScript nào được tạo ra từ phối cảnh V8 cấp thấp, tôi muốn nêu rõ rằng, ngay cả khi không xem xét nội dung bên trong, chúng ta vẫn có thể suy ra nên sử dụng phương thức tinh thần nào. . Xét cho cùng, tất cả ngữ nghĩa ngôn ngữ được xác định bởi đặc tả phải được bảo tồn bởi việc triển khai ngôn ngữ

Tôi sẽ là người đầu tiên thừa nhận rằng thông số kỹ thuật khó đọc. Nó không được viết từ quan điểm của một hướng dẫn ngôn ngữ. Thay vào đó, nó được viết theo quan điểm về cách viết trình thông dịch javascript. Bạn có thể bỏ qua phần này nếu không quan tâm đến thông số kỹ thuật

Việc định hướng hoặc phân tách các biến JavaScript và các giá trị tương ứng của chúng được thể hiện trong đặc tả ECMAScript thông qua Loại đặc tả bản ghi tham chiếu trừu tượng này. Nó không được tiết lộ trong JavaScript - bạn không bao giờ có thể lấy chúng hoặc tương tác trực tiếp với chúng

Tôi sẽ giới thiệu Loại Đặc tả Bản ghi Tham chiếu làm Tài liệu tham khảo sau đây

Tham chiếu là một thiết bị đặc tả được sử dụng để biểu thị vị trí mà tại đó bạn có thể đọc giá trị hoặc ghi giá trị vào. Nhưng bản thân chúng không lưu trữ giá trị, vì bạn không thể tìm thấy trường

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
8 trong định nghĩa của nó. Nó được sử dụng trong toàn bộ thông số kỹ thuật, nhưng bạn hiếm khi cảm nhận được sự tồn tại của nó khi viết JavaScript vì thông thường, bạn tương tác với các giá trị thu được thông qua chúng

Ví dụ. khi bạn viết một bài tập như

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
9, nó sẽ được đánh giá và hai Tham chiếu cho các biến
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 và
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
31 được xây dựng (chính xác là,
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 và
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
31 là các định danh). Tham chiếu của vế phải (RHS) của phương trình được chuyển đến hàm trừu tượng này có tên là GetValue, hàm này tìm nạp giá trị được liên kết/trỏ bởi Tham chiếu. Giá trị đó và Tham chiếu của phía bên trái (LHS) sau đó được chuyển đến hàm PutValue trừu tượng, thiết lập một liên kết mới thông qua
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
34. Lưu ý rằng LHS vẫn là Tham chiếu trong quá trình gán vì công cụ cần biết nơi lưu trữ giá trị, trong khi RHS luôn được đánh giá là giá trị thông qua
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
35. Bạn không thể chuyển Tham chiếu RHS tới
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
36. Đó chính xác là lý do tại sao bạn không thể có một biến trỏ đến một biến khác trong JavaScript- một sợi dây chỉ kết nối bạn với một giá trị

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Một trong hai nhà khai thác duy nhất có thể hoạt động trực tiếp tại Tham chiếu là

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
37, (nhà khai thác còn lại là
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
38). Khi bạn sử dụng
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
37 trên thuộc tính trong đối tượng, bạn sẽ không xóa giá trị được chỉ định bởi thuộc tính. Thay vào đó, bạn chỉ đang xóa Tham chiếu, tôi. e. vị trí mà tại đó giá trị được lưu trữ

Các biến JavaScript được làm bằng chính xác # là gì

Các chủ đề được thảo luận từ thời điểm này trở đi đều được coi là “chi tiết triển khai”. Đây là nơi đặc tả ngôn ngữ kết thúc và quá trình triển khai bắt đầu

Tôi sẽ giải thích các biến JavaScript thực sự là gì từ quan điểm của công cụ JavaScript - V8. Có nhiều công cụ JavaScript khác nhau trong tự nhiên. Và thậm chí chỉ dành cho động cơ V8, nó rất phức tạp và có nhiều cách để chạy mã, các bộ phận và quy trình khác nhau của nó đã được viết lại nhiều lần trong nhiều năm. Những gì tôi mô tả ngày hôm nay có thể trở nên lỗi thời vào ngày mai. Đừng dựa vào các chi tiết thực hiện

Hãy lùi lại một giây. Đơn giản nhất, hãy nghĩ về một biến như một mã định danh, một bí danh cho đoạn bộ nhớ mà tại đó giá trị tức thời của nó được lưu trữ. Tại thời điểm biên dịch, tất cả các biến của bạn đều được chuyển thành địa chỉ bộ nhớ. Bất cứ nơi nào một biến được sử dụng trong mã, giá trị (ngay lập tức) của nó sẽ được truy cập thông qua địa chỉ bộ nhớ đó

Như chúng ta đã thảo luận, các giá trị chúng ta tạo trong chương trình JavaScript của mình không được lưu trữ trực tiếp trong các biến JavaScript. Ở cấp độ thấp, điều đó có nghĩa là các bit từ khối bộ nhớ mà biến JavaScript là bí danh không trực tiếp tạo nên giá trị của nó. Sau đó, những gì chính xác được lưu trữ trong một biến JavaScript? . Bắt đầu từ địa chỉ đó, có một đoạn bộ nhớ riêng biệt, tại đó giá trị "JavaScript thực", giá trị chúng ta thấy, thao tác và chuyển trong chương trình JavaScript của mình, được lưu trữ

Nếu bạn đã quen với khái niệm con trỏ, bạn đã biết câu trả lời. các biến trong JavaScript chính xác là con trỏ. (một lần nữa, ngoại trừ số nguyên nhỏ)

Hãy tinh chỉnh mô hình tinh thần của chúng ta một chút. thay vì dây, chúng tôi sử dụng các bảng làm phép ẩn dụ mới và hãy tạo một biến

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 trỏ đến một đối tượng trống

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
1

Điều gì xảy ra trong bộ nhớ có thể được minh họa như

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Thông thường, các địa chỉ bộ nhớ được biểu diễn dưới dạng thập lục phân, nhưng tôi sẽ không bận tâm ở đây vì đơn giản

Bây giờ chúng ta gán đối tượng trống cho biến

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
31 trong
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
12

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

các biến

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 và
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
31 được tải tại các vị trí bộ nhớ khác nhau, nhưng chúng lưu trữ cùng một giá trị tức thì - địa chỉ bộ nhớ (bắt đầu) mà tại đó đối tượng trống
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
15 được lưu trữ

Một lần nữa, nó cho thấy tại sao nói rằng “biến

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 có đối tượng trống làm giá trị của nó” là không chính xác về mặt kỹ thuật - biến
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 chỉ có địa chỉ bộ nhớ của đối tượng đó

để vs. hăng sô#

Sự khác biệt giữa việc khai báo các biến sử dụng từ khóa

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
18 và từ khóa
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
19 là bạn có thể thay đổi địa chỉ bộ nhớ được lưu trữ trong một biến được khai báo bằng
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
18 nhưng không thể thay đổi địa chỉ được khai báo bằng
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
19 - lưu ý rằng bản thân một biến không được di chuyển qua bộ nhớ

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Và đối tượng trống

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
15 sẽ được thu gom rác sau này nếu nó không còn có thể truy cập được từ chương trình JavaScript của bạn

Mọi thứ đều ở trên đống #

Chúng ta chưa nói nhiều về những giá trị nguyên thủy. Đối với V8 hiện tại, các giá trị của các kiểu nguyên thủy, ngoại trừ các số nguyên nằm trong khoảng từ -2³¹ đến 2³¹-1 trên kiến ​​trúc 64 bit (sẽ nói thêm về điều này sau), giống như các đối tượng - chúng được lưu trữ riêng biệt và các biến JavaScript chỉ có thể trỏ

Điều này được nêu rõ trong một trong các bài đăng trên blog của V8

“Các giá trị JavaScript trong V8 được biểu diễn dưới dạng đối tượng và được phân bổ trên heap V8, bất kể chúng là đối tượng, mảng, số hay chuỗi. Điều này cho phép chúng ta biểu diễn bất kỳ giá trị nào dưới dạng con trỏ tới một đối tượng. ”

Thuật ngữ Heap là một thuật ngữ điện toán chung, được hiểu rõ. Trong C++, chúng được gọi trong Tiêu chuẩn là "lưu trữ động". Hãy coi đó chỉ là một phần của ký ức. Và để truy cập dữ liệu được phân bổ trên heap, các con trỏ, i. e. các giá trị tức thời của các biến JavaScript của bạn (rất có thể) nằm ở đâu đó được gọi là ngăn xếp hoặc các thanh ghi, trỏ đến các đối tượng heap

Đây vẫn là một sự đơn giản hóa quá mức. Tôi đã viết một bài blog khác về cách bố trí bộ nhớ trong V8

Lớp ẩn trong JavaScript#

Bảng thứ hai (màu xanh lam) trong sơ đồ trước đó luôn ẩn trong thế giới JavaScript, giống như Loại đặc tả bản ghi tham chiếu của chúng tôi. Trong JavaScript, bạn không thể nhìn thấy hoặc tương tác với một con trỏ (i. e. biến JavaScript) ngoại trừ việc truy xuất các giá trị thực do chúng chỉ ra, bạn cũng không thể lấy địa chỉ bộ nhớ của chính con trỏ. Ngon miệng phải không?

Ví dụ: không giống như các ngôn ngữ như Go, C hoặc C++, trong JavaScript, bạn không thể sử dụng toán tử tham chiếu

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
43 để truy xuất địa chỉ bộ nhớ của biến e. g.
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
44. Vì lý do đó, sơ đồ dưới đây không thể xảy ra trong JavaScript

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Trong các ngôn ngữ như C, C++ và GO nơi bảng thứ hai hiển thị, bạn có thể hủy đăng ký một con trỏ để thay đổi giá trị được trỏ tới bởi nó

Bây giờ bạn đã biết các biến/thuộc tính đối tượng JavaScript được tạo thành từ gì - chúng (trực tiếp) được tạo thành từ các con trỏ, lưu trữ địa chỉ bộ nhớ và trỏ tới các giá trị bạn tạo và thao tác trong chương trình JavaScript của mình. Nhưng đừng quá nhiệt tình và sử dụng con trỏ để chỉ mọi biến JavaScript mà bạn đã khai báo. Không giống như C/C++, đối với JavaScript, con trỏ không phải là một thuật ngữ được sử dụng trong ngữ nghĩa ngôn ngữ. Gọi con trỏ biến sẽ không thêm bất kỳ sự phân biệt hữu ích nào

Quyền anh#

bạn có thể đang nghĩ. tại sao chúng ta phải thêm các chỉ dẫn con trỏ bổ sung giữa các giá trị và thuộc tính biến/đối tượng? . Trong ngôn ngữ lập trình kiểu động, việc kiểm tra kiểu được thực hiện trong thời gian chạy. Tuy nhiên, các biến JavaScript có thể chứa bất kỳ loại giá trị nào trong thời gian chạy. Do đó, các loại không thể được liên kết với một biến nhưng với giá trị cơ bản được trỏ/tham chiếu bởi một biến. Để đạt được điều đó, chúng ta cần một biểu diễn bộ nhớ thống nhất cho các biến JavaScript - con trỏ. Và các giá trị thực được phân bổ ở một nơi khác trên heap (bộ nhớ động), chứa siêu dữ liệu như loại và kích thước của giá trị, được chỉ bởi các con trỏ đó (i. e. biến JavaScript)

Gói các kiểu nguyên thủy bên trong một cấu trúc dữ liệu khác ghi lại siêu dữ liệu bổ sung về giá trị được gọi là quyền anh

Số nguyên nhỏ#

Và tôi đã đề cập rằng các số nguyên nhỏ là một ngoại lệ đối với quy tắc quyền anh này. Trong V8, các số nguyên nhỏ (thuật ngữ trong V8 là

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
45) được tối ưu hóa rất nhiều để chúng có thể được mã hóa bên trong một điểm. Không giống như các loại khác, một
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
45 có thể được lưu trữ trực tiếp trong con trỏ mà không cần phân bổ bộ nhớ bổ sung cho nó

Điều này có nghĩa là, đúng về mặt kỹ thuật khi nói rằng

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 có giá trị
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
48 như trong
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
49

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Đọc bài viết này từ V8 nếu bạn quan tâm đến cách họ phân biệt giữa

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
45 và. một con trỏ cho một giá trị ngay lập tức. Kỹ thuật này được gọi là gắn thẻ con trỏ và nó không phải là duy nhất đối với V8 hoặc JavaScript. Một loạt các ngôn ngữ khác như OCaml và Ruby cũng làm điều này

Vì vậy, bây giờ hãy để tôi sửa lại những tuyên bố tôi đã đưa ra trước đây cho đầy đủ

  1. Giá trị của một biến JavaScript (hoặc một thuộc tính đối tượng) là một số nguyên ngay lập tức hoặc một con trỏ tới một số bộ nhớ khác mà tại đó giá trị thực được lưu trữ
  2. Do đó, chúng ta có thể nói một biến JavaScript hoặc một thuộc tính đối tượng chỉ có giá trị khi giá trị đó là
    Line foo{{1, 2}, {3, 4}};
    Line bar = foo;
    45. Mặt khác, chúng chỉ trỏ đến các giá trị

Tại sao JavaScript không thể thực hiện chuyển qua tham chiếu#

Huyền thoại này không phải là duy nhất đối với cộng đồng JavaScript. Tôi cũng đã thấy điều này xuất hiện trong cộng đồng Java

Câu trả lời đã được đưa ra. JavaScript không thể thực hiện chuyển qua tham chiếu vì chúng tôi không thể có một điểm biến cho một biến khác - một dây chỉ kết nối chúng tôi với một giá trị

Một bài kiểm tra giấy quỳ nổi tiếng để biết liệu một ngôn ngữ có hỗ trợ tính năng chuyển qua tham chiếu hay không là xem liệu bạn có thể viết ra một hàm nhận hai đối số và hoán đổi chúng sao cho các biến được truyền vào hàm được thay đổi bên ngoài hàm hay không. Trong khi có thể làm trong C++

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
4

Điều này là không thể trong JavaScript. Nhưng tôi không nghĩ rằng chúng ta cần phải kết hợp các chức năng để giải thích tại sao JavaScript không hỗ trợ chuyển qua tham chiếu

Về cốt lõi, để JavaScript hỗ trợ chuyển qua tham chiếu, chúng ta cần có cách thay đổi giá trị được trỏ/tham chiếu bởi một biến đã cho mà không thực hiện gán lại trên chính biến đó

Ví dụ ta khai báo biến

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 trong
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
53, có cách nào đổi số mà
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 đang có từ
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
55 thành
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
56 mà không cần trực tiếp gán lại
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
56 thành
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 như trong
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
59 không?

Toán tử tăng tiền tố/tiền tố như trong

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
20 hoặc
Line foo{{1, 2}, {3, 4}};
Line bar = foo;
21 vẫn được tính là một phép gán lại trên chính biến
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 vì cả hai đều sử dụng phương thức trừu tượng
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
36 trong nội bộ

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
5

Bạn không thể. Điều đó là không thể trong JavaScript

  1. nếu chúng tôi ở mức đặc tả ngôn ngữ JavaScript, như tôi đã chỉ ra sớm, bạn không thể liên kết một mã định danh biến với loại Đặc tả bản ghi tham chiếu. Điều này ngăn bạn có một biến có vị trí (i. e. một Tham chiếu) của một biến khác làm giá trị của nó
  2. đi sâu hơn vào cấp độ triển khai, không có cách nào để lấy địa chỉ bộ nhớ của biến do lớp ẩn mà chúng ta đã thảo luận ở trên
    • Ví dụ: nếu biến
      function callByReference(varObj) { 
      console.log("Inside Call by Reference Method");
      varObj.a = 100;
      console.log(varObj);
      }
      let varObj = {a:1};
      console.log("Before Call by Reference Method");
      console.log(varObj);
      callByReference(varObj) console.log("After Call by Reference Method");
      console.log(varObj);
      output will be :
      ---------------
      Before Call by Reference Method
      {a: 1}
      Inside Call by Reference Method
      {a: 100}
      After Call by Reference Method
      {a: 100}
      30 được tải tại
      Line foo{{1, 2}, {3, 4}};
      Line bar = foo;
      25, chúng ta không thể lấy địa chỉ đó
      Line foo{{1, 2}, {3, 4}};
      Line bar = foo;
      25 và lưu trữ nó bên trong một biến khác
      function callByReference(varObj) { 
      console.log("Inside Call by Reference Method");
      varObj.a = 100;
      console.log(varObj);
      }
      let varObj = {a:1};
      console.log("Before Call by Reference Method");
      console.log(varObj);
      callByReference(varObj) console.log("After Call by Reference Method");
      console.log(varObj);
      output will be :
      ---------------
      Before Call by Reference Method
      {a: 1}
      Inside Call by Reference Method
      {a: 100}
      After Call by Reference Method
      {a: 100}
      31 và sau đó là biến
      function callByReference(varObj) { 
      console.log("Inside Call by Reference Method");
      varObj.a = 100;
      console.log(varObj);
      }
      let varObj = {a:1};
      console.log("Before Call by Reference Method");
      console.log(varObj);
      callByReference(varObj) console.log("After Call by Reference Method");
      console.log(varObj);
      output will be :
      ---------------
      Before Call by Reference Method
      {a: 1}
      Inside Call by Reference Method
      {a: 100}
      After Call by Reference Method
      {a: 100}
      31 để truy cập và thay đổi dữ liệu chứa khối bộ nhớ của biến
      function callByReference(varObj) { 
      console.log("Inside Call by Reference Method");
      varObj.a = 100;
      console.log(varObj);
      }
      let varObj = {a:1};
      console.log("Before Call by Reference Method");
      console.log(varObj);
      callByReference(varObj) console.log("After Call by Reference Method");
      console.log(varObj);
      output will be :
      ---------------
      Before Call by Reference Method
      {a: 1}
      Inside Call by Reference Method
      {a: 100}
      After Call by Reference Method
      {a: 100}
      30

      Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Bạn có thể tranh luận rằng mọi thứ sẽ thay đổi nếu

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 chỉ vào một đối tượng. Ví dụ: nếu chúng ta khai báo biến
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 là
const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
12, thực sự có nhiều cách để sửa đổi đối tượng thành
const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
13 mà không cần trực tiếp gán lại giá trị đối tượng mới cho
function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30

Trên thực tế, rất nhiều người có ấn tượng sai khi truyền một đối tượng cho một hàm. trong chức năng đó, đúng là chúng ta có thể thay đổi đối tượng và sự thay đổi đó thực sự sẽ phản ánh giá trị đối tượng được truyền từ bên ngoài. Đây là một ví dụ

Line foo{{1, 2}, {3, 4}};
Line bar = foo;
2

Nhưng điều này không liên quan gì đến tham chiếu chuyển qua - biến

function callByReference(varObj) { 
console.log("Inside Call by Reference Method");
varObj.a = 100;
console.log(varObj);
}
let varObj = {a:1};
console.log("Before Call by Reference Method");
console.log(varObj);
callByReference(varObj) console.log("After Call by Reference Method");
console.log(varObj);
output will be :
---------------
Before Call by Reference Method
{a: 1}
Inside Call by Reference Method
{a: 100}
After Call by Reference Method
{a: 100}
30 vẫn trỏ đến cùng một đối tượng - danh tính của đối tượng không thay đổi

Trên thực tế, đây chính xác là giá trị truyền qua - giá trị được truyền và sao chép là một con trỏ có địa chỉ bộ nhớ của đối tượng

const foo = {pos1: {x: 1, y: 2}, pos2: {x: 3, y: 4}};
16

Làm cách nào để chuyển một giá trị từ biến JavaScript sang biến C# trong asp net?

Bản thân nhà phát minh JavaScript Brendan Eich cũng xác nhận rằng tham chiếu/con trỏ của đối tượng được sao chép trong một email cũ. Có thể một tên khác phù hợp hoặc trực quan hơn cho cách các đối số đối tượng được truyền và đánh giá sẽ là chia sẻ qua lại

Ghi chú về thuật ngữ#

Đối với các biến trỏ đến đối tượng, một số người cũng thích coi chúng là tham chiếu đến đối tượng. Trong ngữ cảnh này, một tham chiếu và một con trỏ là giống nhau. Một con trỏ và một tham chiếu đều có chức năng cung cấp quyền truy cập vào dữ liệu được lưu trữ ở một nơi khác - một hướng dẫn đến một giá trị khác. Trong các ngôn ngữ như Java và JavaScript chỉ có cái này hay cái kia, việc lựa chọn thuật ngữ phần lớn là một quyết định tùy ý. Thuật ngữ chỉ quan trọng đối với các ngôn ngữ như C++, điều này không bình thường khi có cả con trỏ và tham chiếu

Bớt tư tưởng#

Khi nói đến việc học một ngôn ngữ lập trình, luôn có hai mức độ trừu tượng liên quan

  1. bản thân ngôn ngữ, tôi. e. , ngữ nghĩa tĩnh và thời gian chạy được xác định bởi đặc tả ngôn ngữ

  2. các chi tiết triển khai cơ bản, tôi. e. , một máy ảo cụ thể thực hiện ngôn ngữ

Khi thảo luận về ngôn ngữ lập trình, hãy luôn nhớ mức độ trừu tượng mà bạn đang vận hành

Cuối cùng, bài đăng này phần lớn được lấy cảm hứng từ khóa học JustJavaScript của Dan Abramov. Anh ấy đã giải thích một cách tao nhã cách JavaScript hoạt động theo một cách thơ mộng và ngụ ngôn mà không đi đến bất kỳ chi tiết triển khai nào. Cho dù bạn là người mới sử dụng ngôn ngữ này hay bạn đã là một nhà phát triển có kinh nghiệm, tôi khuyến khích bạn nên xem khóa học của anh ấy

Làm cách nào để chuyển giá trị biến trong JavaScript?

Truyền theo giá trị. Trong Truyền theo giá trị, hàm được gọi bằng cách truyền trực tiếp giá trị của biến làm đối số . Vì vậy, mọi thay đổi được thực hiện bên trong hàm không ảnh hưởng đến giá trị ban đầu. Trong Truyền theo giá trị, các tham số được truyền dưới dạng đối số tạo bản sao của chính nó.

Làm cách nào để chuyển đối số bằng tham chiếu trong JavaScript?

Trong Pass by Reference, một hàm được gọi bằng cách chuyển trực tiếp tham chiếu/địa chỉ của biến làm đối số. Thay đổi đối số bên trong hàm ảnh hưởng đến biến được truyền từ bên ngoài hàm. Trong các đối tượng và mảng Javascript được truyền theo tham chiếu

Làm cách nào để chuyển biến JavaScript sang JSTL?

Không, không có cách nào trực tiếp để gán biến javascript cho JSTL/JSP . Java chạy trên máy chủ, tạo ra một trang HTML. Javascript chạy trên máy khách. Cách duy nhất để truyền thông tin từ máy khách đến máy chủ là tạo một yêu cầu HTTP - đây là cơ sở của ajax.

Biến $ trong JavaScript là gì?

Biến JavaScript chỉ đơn giản là tên của vị trí lưu trữ . Có hai loại biến trong JavaScript. biến cục bộ và biến toàn cục. Có một số quy tắc khi khai báo biến JavaScript (còn được gọi là định danh). Tên phải bắt đầu bằng một chữ cái (a đến z hoặc A đến Z), dấu gạch dưới ( _ ) hoặc ký hiệu đô la ($ ).