Tại sao một biến JavaScript sẽ bắt đầu bằng ký hiệu đô la? [bản sao]


1037

Tôi khá thường thấy JavaScript với các biến bắt đầu bằng ký hiệu đô la. Khi nào / tại sao bạn lại chọn tiền tố một biến theo cách này?

(Tôi không hỏi về $('p.foo')cú pháp mà bạn thấy trong jQuery và những người khác, nhưng các biến thông thường như $name$order)


16
Có lẽ đó là một thói quen được chọn từ lập trình Perl. (chỉnh sửa: hoặc PHP)
brien

5
Một số ngôn ngữ yêu cầu nó, chẳng hạn như PHP hoặc Perl - Tôi đoán rằng nhà phát triển không nhớ rằng nó không cần thiết trong javascript.
Bradshaw giàu

3
hoặc họ không muốn bị làm phiền khi bỏ thói quen này. Đây rất có thể là câu trả lời chính xác, vì rất nhiều nhà phát triển hack cùng trang web của họ làm như vậy bằng PHP và javascript.
BlueRaja - Daniel Pflughoeft

@DonaldDuck Tôi nghĩ rằng bạn có thể có các bản sao sai vòng của mình - đây là 7 tháng so với liên kết của bạn
Ken

1
@Ken Theo câu trả lời này , đó không phải là độ tuổi quan trọng mà là câu trả lời tốt như thế nào. Cá nhân tôi nghĩ rằng câu trả lời cho câu hỏi khác là tốt hơn, đó là lý do tại sao tôi đã bỏ phiếu để đóng câu hỏi này dưới dạng trùng lặp. Nếu bạn nghĩ rằng câu trả lời cho câu hỏi này tốt hơn, bạn có thể bỏ phiếu để đóng câu hỏi khác dưới dạng trùng lặp.
Vịt Donald

Câu trả lời:


1420

Sử dụng rất phổ biến trong jQuery là để phân biệt các đối tượng jQuery được lưu trữ trong các biến với các biến khác.

Ví dụ: tôi sẽ xác định:

var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself

Tôi thấy điều này rất hữu ích trong việc viết mã jQuery và giúp dễ dàng thấy các đối tượng jQuery có một tập các thuộc tính khác nhau.


98
Đây là ký hiệu Hungary THỰC SỰ. Nó truyền đạt thông tin về những gì được lưu trữ trong biến ngoài những gì tên biến làm. A ++ sẽ Hungary một lần nữa.
Artemis

2
Tôi muốn tài liệu jquery cũng sử dụng ký hiệu này ... Nó thực sự hữu ích.
pedromanoel

1
@Artemis Tôi đã chọn tiếng Hungary gần 20 năm trước và chưa bao giờ có thể ngừng sử dụng nó. Trong những năm qua, rất nhiều người đã bày tỏ sự không hài lòng với việc tôi sử dụng nó nhưng thật hữu ích, tôi không thể hiểu tại sao.
Cú đêm

10
Đồng ý với $. Nhưng các dấu gạch dưới trong tên biến nên được ngăn chặn, các biến JS-bình thường nên sử dụng camelCase. email_fields -> emailField. Chỉ trường hợp sử dụng hợp lệ cho _ là tiền tố cho các thuộc tính riêng tư / được bảo vệ.
cschuff

11
@cschuff Đó hoàn toàn là tuyên bố ... Tôi thích dấu gạch dưới cho tất cả các biến cục bộ và trường hợp lạc đà dự trữ cho các thuộc tính của các đối tượng nguyên mẫu.
Paul

250

Trong phiên bản 1, 2 và 3 của ECMAScript , việc sử dụng các tên biến $ -prefixed đã được khuyến khích rõ ràng bởi thông số kỹ thuật ngoại trừ trong bối cảnh mã được tạo tự động:

Ký hiệu đô la ( $) và dấu gạch dưới ( _) được cho phép ở bất cứ đâu trong mã định danh. Ký hiệu đô la chỉ dành cho sử dụng trong mã được tạo cơ học.

Tuy nhiên, trong phiên bản tiếp theo (Phiên bản thứ 5 , hiện tại), hạn chế này đã bị loại bỏ và đoạn văn trên được thay thế bằng

Ký hiệu đô la ( $) và dấu gạch dưới ( _) được cho phép ở bất cứ đâu trong Mã định danh .

Như vậy, dấu $ bây giờ có thể được sử dụng tự do trong các tên biến. Một số khung và thư viện nhất định có quy ước riêng về ý nghĩa của biểu tượng, được ghi chú trong các câu trả lời khác ở đây.


3
Trong khi điều này có thể đúng, nó có thực sự giúp trả lời câu hỏi của OP không? Câu trả lời hiện được chấp nhận là tốt hơn - khi một lập trình viên JS mới làm quen nhìn thấy $variable, rất có thể vì nó chứa toàn bộ đối tượng jQuery.
rinogo

14
@rinogo Nó trả lời câu hỏi với một số sự thật tuyệt đối không phụ thuộc vào các giả định về các thư viện được sử dụng.
Oriol

1
@yoyo_fun: Mã được tạo bởi máy tính chứ không phải do con người viết.
cic


3
"Nó trả lời câu hỏi với một số sự thật tuyệt đối". Trên thực tế, sự thật là các nhà phát triển đã hoàn toàn bỏ qua nhận xét này từ thông số ngôn ngữ ... và có lẽ vẫn còn. :)
Stijn de Witt

61

Như những người khác đã đề cập, ký hiệu đô la được dự định sẽ được sử dụng bởi mã được tạo ra một cách cơ học. Tuy nhiên, quy ước đó đã bị phá vỡ bởi một số thư viện JavaScript rất phổ biến. JQuery, Prototype và MS AJAX (AKA Atlas) đều sử dụng ký tự này trong các định danh của họ (hoặc như một toàn bộ định danh).

Tóm lại bạn có thể sử dụng $bất cứ khi nào bạn muốn. (Thông dịch viên sẽ không phàn nàn.) Câu hỏi là khi nào bạn muốn sử dụng nó?

Cá nhân tôi không sử dụng nó, nhưng tôi nghĩ rằng việc sử dụng nó là hợp lệ. Tôi nghĩ rằng MS AJAX sử dụng nó để biểu thị rằng một hàm là bí danh cho một số cuộc gọi dài dòng hơn.

Ví dụ:

var $get = function(id) { return document.getElementById(id); }

Đó dường như là một quy ước hợp lý.


JQuery KHÔNG sử dụng điều này trong các mã định danh, lý do cho $ .X đơn giản là phải gõ ít hơn - jQuery.X giống hệt nhau, trên thực tế $ .X là một bí danh không gian tên cho jQuery.X - mọi chức năng của jQuery đều nằm trong jQuery-ns, không phải $
Specializt

5
@specializt như tôi đã nói 5 năm trước "hoặc là toàn bộ định danh". Theo định danh tôi có nghĩa là định nghĩa CS tiêu chuẩn là mã thông báo từ vựng không phải là từ khóa trong ngôn ngữ. Trong trường hợp này $ và jQuery là hai mã định danh khác nhau tham chiếu cùng một giá trị. Nhưng dù sao họ cũng là định danh.
Benry

56

Trong ngữ cảnh của AngularJS, $tiền tố chỉ được sử dụng cho các định danh trong mã của khung. Người dùng của khung được hướng dẫn không sử dụng nó trong các định danh riêng của họ:

Không gian góc cạnh $$$

Để ngăn xung đột tên ngẫu nhiên với mã của bạn, Angular tiền tố tên của các đối tượng công cộng với $và tên của các đối tượng riêng tư với $$. Vui lòng không sử dụng $hoặc $$tiền tố trong mã của bạn.

Nguồn: https://docs.angularjs.org/api


35

Tôi là người đã khởi nguồn hội nghị này vào năm 2006 và đã quảng bá nó trong danh sách gửi thư jQuery ban đầu, vì vậy hãy để tôi chia sẻ một số lịch sử và động lực xung quanh nó.

Câu trả lời được chấp nhận đưa ra ví dụ này:

var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself

Nhưng điều đó không thực sự minh họa nó tốt. Ngay cả khi không có $, chúng ta vẫn sẽ có hai tên biến khác nhau ở đây emailemail_field. Đó là rất nhiều tốt ở đó. Tại sao chúng ta cần phải ném một $trong những tên khi chúng ta đã có hai tên khác nhau?

Trên thực tế, tôi đã không sử dụng email_fieldở đây vì hai lý do: names_with_underscoreskhông phải là JavaScript thành ngữ và fieldkhông thực sự có ý nghĩa đối với một phần tử DOM. Nhưng tôi đã làm theo cùng một ý tưởng.

Tôi đã thử một vài thứ khác nhau, trong số đó có một cái gì đó rất giống với ví dụ:

var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it

(Tất nhiên một đối tượng jQuery có thể có nhiều hơn một phần tử DOM, nhưng mã tôi đang làm việc có rất nhiều idbộ chọn, vì vậy trong những trường hợp đó có sự tương ứng 1: 1.)

Tôi đã có một trường hợp khác khi một hàm nhận một phần tử DOM làm tham số và cũng cần một đối tượng jQuery cho nó:

// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
    var emailJQ = $(email);
    // Now email is the DOM element and emailJQ is a jQuery object for it
}

Vâng, đó là một chút bối rối! Trong một trong các đoạn mã của tôi, emaillà đối tượng jQuery và emailElementlà phần tử DOM, nhưng trong phần còn lại, emaillà phần tử DOM và emailJQlà đối tượng jQuery.

Không có sự thống nhất và tôi tiếp tục trộn chúng lên. Thêm vào đó, có một chút phiền toái khi phải tạo ra hai tên khác nhau cho cùng một thứ: một cho đối tượng jQuery và một tên khác cho thành phần DOM phù hợp. Bên cạnh đó email, emailElementemailJQ, tôi cũng tiếp tục thử các biến thể khác.

Sau đó, tôi nhận thấy một mô hình phổ biến:

var email = $("#email");
var emailJQ = $(email);

Vì JavaScript coi $đơn giản là một chữ cái khác cho các tên và vì tôi luôn nhận được một đối tượng jQuery từ một $(whatever)cuộc gọi, nên mẫu cuối cùng cũng nhận ra tôi. Tôi có thể nhận một $(...)cuộc gọi và chỉ cần loại bỏ một số ký tự, và nó sẽ xuất hiện với một cái tên khá hay:

$("#email")
$(email)

Strikeout không hoàn hảo, nhưng bạn có thể hiểu ý tưởng: với một số ký tự bị xóa, cả hai dòng này cuối cùng trông giống như:

$email

Đó là khi tôi nhận ra mình không cần phải tạo nên một quy ước như emailElementhay emailJQ. Đã có một quy ước tốt đẹp nhìn chằm chằm vào tôi: đưa một số nhân vật ra khỏi $(whatever)cuộc gọi và nó biến thành $whatever.

var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object

và:

// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
    var $email = $(email);
    // $email is the jQuery object and email is the DOM object
    // Same names as in the code above. Yay!
}

Vì vậy, tôi đã không phải tạo ra hai tên khác nhau mọi lúc mà chỉ có thể sử dụng cùng một tên có hoặc không có $tiền tố. Và $tiền tố là một lời nhắc tốt đẹp rằng tôi đang xử lý một đối tượng jQuery:

$('#email').click( ... );

hoặc là:

var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );

21

Stevo là đúng, ý nghĩa và cách sử dụng ký hiệu đô la (trong nền tảng Javascript và jQuery, nhưng không phải trong PHP) là hoàn toàn ngữ nghĩa. $ là một ký tự có thể được sử dụng như một phần của tên định danh. Ngoài ra, ký hiệu đô la có lẽ không phải là điều "kỳ lạ" nhất bạn có thể gặp trong Javascript. Dưới đây là một số ví dụ về tên định danh hợp lệ:

var _       = function() { alert("hello from _"); }
var \u0024  = function() { alert("hello from $ defined as u0024"); }
var Ø       = function() { alert("hello from Ø"); }
var $$$$$   = function() { alert("hello from $$$$$"); }

Tất cả các ví dụ trên sẽ hoạt động.

Thử chúng đi.


7

Ký tự $ không có ý nghĩa đặc biệt đối với công cụ JavaScript. Nó chỉ là một ký tự hợp lệ khác trong một tên biến như az, AZ, _, 0-9, v.v ...


2
đúng nhưng không phải những gì được hỏi Tôi đến đây muốn hiểu lý do tại sao nó được sử dụng và dường như trường hợp tôi nhìn thấy nó là để phân biệt một var chứa một đối tượng jquery giữa một var chứa một đối tượng dom.
rtpHarry

3
@rtpHarry bạn không phải là người đặt câu hỏi và câu hỏi "tại sao" đã được trả lời đầy đủ ở đây. Điều này không liên quan gì đến JQuery, như đã được nêu trong câu hỏi. Trên thực tế, tôi nghĩ rằng câu trả lời trên phù hợp nhất với câu hỏi - đôi khi nếu bạn muốn nắm bắt điều gì đó bạn cần câu trả lời rõ ràng nhỏ nhất - $không mang ý nghĩa đặc biệt nào trong JavaScript. Giai đoạn = Stage.
Amn

Tôi thấy điều đó chắc chắn .. ahem ... mọi người muốn thêm ký hiệu đô la vào tên biến để làm cho mọi thứ có vẻ góc cạnh hơn.
glyph

2

_ở đầu một tên biến thường được sử dụng để chỉ ra một biến riêng tư (hoặc ít nhất một biến có ý định giữ riêng tư), tôi thấy$ thuận tiện cho việc thêm trước các bí danh ngắn gọn của riêng mình vào các thư viện mã chung.

Ví dụ: khi sử dụng jQuery, tôi thích sử dụng biến $J(thay vì chỉ $) và sử dụng$P khi sử dụng php.js, v.v.

Tiền tố làm cho nó khác biệt về mặt trực quan với các biến khác như biến tĩnh của riêng tôi, cho tôi biết thực tế rằng mã là một phần của thư viện này hay thư viện khác và ít có khả năng xung đột hoặc gây nhầm lẫn cho người khác khi họ biết quy ước.

Nó cũng không làm lộn xộn mã (hoặc yêu cầu nhập thêm) như một tên được chỉ định đầy đủ lặp lại cho mỗi cuộc gọi thư viện.

Tôi thích nghĩ về nó giống như những gì các phím bổ trợ làm để mở rộng khả năng của các phím đơn.

Nhưng đây chỉ là quy ước của riêng tôi.


2

Như tôi đã trải nghiệm trong 4 năm qua, nó sẽ cho phép một số người dễ dàng xác định xem biến chỉ ra một giá trị / đối tượng hay một phần tử DOM được bao bọc bởi jQuery

Ex:
var name = 'jQuery';
var lib = {name:'jQuery',version:1.6};

var $dataDiv = $('#myDataDiv');

trong ví dụ trên khi tôi thấy biến "$ dataDiv" tôi có thể dễ dàng nói rằng biến này trỏ đến một phần tử DOM được bao bọc bởi jQuery (trong trường hợp này là div). và tôi cũng có thể gọi tất cả các phương thức jQuery mà không bao bọc đối tượng một lần nữa như $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () thay vì $ ($ dataDiv) .append ().

Hy vọng nó có thể giúp. Vì vậy, cuối cùng muốn nói rằng nó sẽ là một thực hành tốt để làm theo điều này nhưng không bắt buộc.


0

${varname} chỉ là một quy ước đặt tên mà các nhà phát triển jQuery sử dụng để phân biệt các biến đang giữ các phần tử jQuery.

Plain {varname}được sử dụng để lưu trữ những thứ chung chung như văn bản và chuỗi. ${varname}giữ các phần tử được trả về từ jQuery.

Bạn có thể sử dụng đồng bằng {varname} để lưu trữ các phần tử jQuery, nhưng như tôi đã nói lúc đầu, điều này phân biệt nó với các biến đơn giản và làm cho nó dễ hiểu hơn nhiều (hãy tưởng tượng nhầm lẫn nó với một biến đơn giản và tìm kiếm khắp nơi để hiểu những gì nó giữ) .

Ví dụ :

var $blah = $(this).parents('.blahblah');

Ở đây, blah đang lưu trữ một phần tử jQuery được trả về.

Vì vậy, khi người khác nhìn thấy $blahmã, họ sẽ hiểu nó không chỉ là một chuỗi hay một số, đó là một phần tử jQuery.


6
Bạn vừa đọc lại câu trả lời được chấp nhận từ 6 năm trước.
Ken

Tôi cho rằng điều đó không làm cho câu trả lời "chất lượng thấp".
Sunny R Gupta

-1

Mặc dù bạn chỉ có thể sử dụng nó để tiền tố định danh của mình, ví dụ, nó được sử dụng cho mã được tạo, chẳng hạn như mã thông báo thay thế trong mẫu, chẳng hạn.


1
Đúng sáu năm trước, nhưng không còn nữa.
Đánh dấu Amery

-2

Sử dụng góc là cho các thuộc tính được tạo ra bởi khung. Đoán, họ đang đi theo gợi ý (bây giờ không còn tồn tại) được cung cấp bởi ECMA-262 3.0.


-3

$ được sử dụng để DISTINGUISH giữa các biến phổ biến và biến jquery trong trường hợp biến thông thường. hãy để bạn đặt hàng trong FLIPKART sau đó nếu đơn hàng là biến hiển thị cho bạn đầu ra chuỗi thì nó được đặt tên đơn giản là "thứ tự" nhưng nếu chúng ta nhấp vào thứ tự địa điểm thì một đối tượng được trả về, đối tượng đó sẽ được ký hiệu là $ là "$ ra lệnh "để lập trình viên có thể bắn ra các biến javascript và biến jquery trong toàn bộ mã.


-4

Nếu bạn thấy ký hiệu đô la ($) hoặc ký hiệu đô la kép ($$) và tò mò về ý nghĩa của điều này trong khung Nguyên mẫu, đây là câu trả lời của bạn:

$$('div');
// -> all DIVs in the document.  Same as document.getElementsByTagName('div')!

$$('#contents');
// -> same as $('contents'), only it returns an array anyway (even though IDs must be unique within a document).

$$('li.faux');
// -> all LI elements with class 'faux'

Nguồn:
http://www.prototypejs.org/api/utility/dollar-dollar


5
OP đặc biệt tuyên bố rằng ông không hỏi về hình thức tiền tố đô la này.
Nigel Alderton

-5

Lý do đôi khi tôi sử dụng các quy ước tên php với các biến javascript: Khi thực hiện xác thực đầu vào, tôi muốn chạy các thuật toán chính xác giống nhau ở cả phía máy khách và phía máy chủ. Tôi thực sự muốn hai mặt của mã trông giống nhau nhất có thể, để đơn giản hóa việc bảo trì. Sử dụng dấu đô la trong tên biến làm cho điều này dễ dàng hơn.

(Ngoài ra, một số hàm trợ giúp hợp lý giúp làm cho mã trông giống nhau, ví dụ: gói tra cứu giá trị đầu vào, các phiên bản không OO của strlen, chất nền, v.v. Mặc dù vậy, nó vẫn yêu cầu một số điều chỉnh thủ công.)


-5

Mã định danh JavaScript hợp lệ phải bắt đầu bằng một chữ cái, dấu gạch dưới (_) hoặc ký hiệu đô la ($); các ký tự tiếp theo cũng có thể là chữ số (0-9). Vì JavaScript phân biệt chữ hoa chữ thường, các chữ cái bao gồm các ký tự "A" đến "Z" (chữ hoa) và các ký tự "a" đến "z" (chữ thường).

Chi tiết:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables


Các câu hỏi không phải là 'Biến JavasScript có thể bắt đầu bằng $ không?', Nhưng 'Tại sao lại là ...'. OP đang tìm kiếm một lý do để sử dụng quy ước đặt tên như vậy.
Steve Ives
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.