Không có ý nghĩa gì = + _ trong JavaScript


252

Tôi đã tự hỏi toán tử = + _ có nghĩa là gì trong JavaScript. Có vẻ như nó làm bài tập.

Thí dụ:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

57
Nhắc nhở tôi về toán tử tiếp cận cũ tốt-->
ov

12
+ Ở đây là một toán tử đơn nguyên, với _ là toán hạng của nó.
Pieter Witvoet

44
Có vẻ như một lập trình viên Perl không thể bỏ qua biến mặc định ;-)
Michael Wild

4
Một cú pháp tô sáng tốt sẽ giúp bạn trả lời câu hỏi.
hugo der hungrige

18
Bạn có thể làm một khuôn mặt cườix= +_+ 0;
tckmn

Câu trả lời:


396
r = +_;
  • +cố gắng để đúc bất cứ điều gì _là một số.
  • _chỉ là một tên biến (không phải là một toán tử), nó có thể a, foov.v.

Thí dụ:

+"1"

bỏ "1" thành số 1 thuần túy.

var _ = "1";
var r = +_;

rlà bây giờ 1, không phải "1".

Ngoài ra, theo trang MDN về Toán tử số học :

Toán tử unary plus có trước toán hạng của nó và đánh giá toán hạng của nó nhưng cố gắng chuyển đổi nó thành một số, nếu nó chưa có . [...] Nó có thể chuyển đổi cơ quan đại diện chuỗi các số nguyên và nổi, cũng như các giá trị không theo chuỗi true, falsenull. Các số nguyên ở cả "0x"định dạng thập phân và thập lục phân ( -prefixed) đều được hỗ trợ. Số âm được hỗ trợ (mặc dù không cho hex). Nếu nó không thể phân tích một giá trị cụ thể, nó sẽ đánh giá NaN.

Nó cũng được ghi nhận rằng

unary plus là cách nhanh nhất và được ưa thích để chuyển đổi một cái gì đó thành một số


2
Liệu + thực sự có nghĩa là truyền vào một số, hoặc +_thực sự có nghĩa là 0+_, trong trường hợp nào _phải được truyền trước khi thêm vào 0?
colincameron


17
@ c.cam108 - Không, họ không cư xử tương tự. Unary plus tạo giá trị cho một số, nhưng cộng nhị phân không: +'12' === 12(kết quả là một số), nhưng 0 + '12' === '012'(kết quả là một chuỗi). Lưu ý, tuy nhiên, điều đó 0 - '12' === -12.
Kobi

1
@juzerali Chắc chắn, nhưng đó không phải là thực hành tốt. Hãy thử sử dụng phép cộng;)
Izkata

Trông giống nhau với biến mặc định của perl $ _
Matthew Lock

95

Nó không phải là một toán tử gán.

  • _ chỉ là một tham số được truyền cho hàm.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
  • Trên dòng tiếp theo r = +_; +, biến biến đó ( _) thành một giá trị số hoặc số nguyên và gán nó cho biếnr

KHÔNG CONFUSE IT VỚI +=toán tử


54

=+thực sự là hai toán tử =được gán +_là tên biến.

giống:

i = + 5;
or 
j = + i;
or 
i = + _;

Các mã sau đây của tôi sẽ giúp bạn hiển thị việc sử dụng =+để chuyển đổi một chuỗi thành int .
thí dụ:

y = +'5'
x = y +5
alert(x);

đầu ra 10

sử dụng: Vì vậy, đây ylà int 5=+
khác:

y = '5'
x = y +5
alert(x);

đầu ra 55

Trong đó như _là một biến.

_ = + '5'
x = _ + 5
alert(x)

đầu ra 10

Ngoài ra, thật thú vị khi biết bạn cũng có thể đạt được điều tương tự với ~(nếu chuỗi là chuỗi int (float sẽ được làm tròn thành int) )

y = ~~'5'  // notice used two time ~
x = y  + 5
alert(x);

cũng cho ra 10

~là bitwise KHÔNG: Đảo ngược các bit của toán hạng của nó. Tôi đã làm hai lần mà không thay đổi cường độ.


1
Tôi sử dụng thường xuyên x|0để chuyển đổi gấp đôi thành int; tuy nhiên, điều này cũng như việc sử dụng '~' có hình phạt giới hạn ở các số <2 ^ 32. + "2e15" thì không.
Aki Suihkonen

@AkiSuihkonen Có tốt tôi tin x|0là còn nhanh hơn +nữa. Đúng không? kỹ thuật đẹp :). (2) Tôi ~chỉ sử dụng để hiển thị OP +không chỉ có thể sử dụng một dấu hiệu ( bản thân tôi sử dụng+ ).
Grijesh Chauhan

Thật khó để nói - có jsperf mặc dù là một người muốn đo nó. OTOH hai toán tử này có một ý nghĩa hoàn toàn khác nhau. Nếu chỉ yêu cầu một số (và không phải số nguyên) thì '+' dù sao cũng ngắn hơn một ký tự.
Aki Suihkonen

1
Trên thực tế tôi chỉ thử nghiệm nó jsperf - 18M ops cho '| 0', 19M ops cho '+'; hiệu suất có thể sẽ thay đổi tùy theo trình duyệt. jsperf.com/strtoint
Aki Suihkonen

1
@AkiSuihkonen Ôi trời, vừa làm bài kiểm tra jsperf trên Firefox, sự khác biệt rất lớn .. |rất nhanh.
Tapirboy

16

Không phải vậy =+. Trong JavaScript, +có nghĩa là thay đổi nó thành số.

+'32' trả về 32.

+'a' trả về NaN.

Vì vậy, bạn có thể sử dụng isNaN()để kiểm tra nếu nó có thể được thay đổi thành số.


16

Đó là một người lén lút.

Điều quan trọng cần hiểu là ký tự gạch dưới ở đây thực sự là một tên biến , không phải là toán tử.

Dấu cộng phía trước đó là nhận được giá trị số dương của dấu gạch dưới - tức là truyền hiệu quả biến biến gạch dưới thành một số nguyên. Bạn có thể đạt được hiệu ứng tương tự với parseInt(), nhưng dấu cộng có khả năng được sử dụng ở đây vì nó ngắn gọn hơn.

Và điều đó chỉ để lại dấu bằng như chỉ là một phép gán biến tiêu chuẩn.

Có lẽ nó không được cố tình viết để gây nhầm lẫn, vì một lập trình viên Javascript có kinh nghiệm thường sẽ nhận ra dấu gạch dưới là một biến. Nhưng nếu bạn không biết rằng nó chắc chắn rất khó hiểu. Tôi chắc chắn sẽ không viết nó như thế; Tôi không phải là người hâm mộ của các tên biến vô nghĩa ngắn vào thời điểm tốt nhất - Nếu bạn muốn các tên biến ngắn trong mã JS để tiết kiệm không gian, hãy sử dụng một công cụ khai thác; đừng viết nó với các biến ngắn để bắt đầu.


1
+1, vì bạn là người duy nhất ở đây chỉ ra rõ ràng đó _là một biến.
TRiG

@TRiG câu trả lời của Starx là gì, mà không phải là tl; dr?
Toán học

12

= + _ sẽ chuyển _ thành một số.

Vì thế

var _ = "1",
   r = +_;
console.log(typeof r)

sẽ xuất số.


9

Tôi cho rằng bạn có nghĩa là r = +_;? Trong trường hợp đó, nó chuyển đổi tham số thành a Number. Nói _là '12 .3 ', sau đó +'12.3'trả về 12.3. Vì vậy, trong các tuyên bố trích dẫn +_được gán cho r.


6

_chỉ là một tên biến, được truyền dưới dạng tham số của hàm hexbin.radiusvà chuyển +nó thành số

Hãy để tôi thực hiện một exmple giống như chức năng của bạn.

var hexbin = {},r  ;

hexbin.radius = function(_) {
   if (!arguments.length)
      return r;
   console.log( _ , typeof _ )    
   r = +_;
   console.log( r , typeof r , isNaN(r) );   
}

và chạy chức năng ví dụ này .. đầu ra nào

hexbin.radius ("1");

1 string
1 number false 

hexbin.radius (1);

1 number
1 number false

hexbin.radius ([]);

[] object
0 number false

hexbin.radius ('a');

a string
NaN number true

hexbin.radius ({});

Object {} object
NaN number true

hexbin.radius (đúng);

true boolean
1 number false

Trả lời rất muộn nhưng câu trả lời rất hay +.
Grijesh Chauhan

5

Nó sẽ gán giá trị mới cho biến bên trái một số.

var a=10;
var b="asg";
var c=+a;//return 10
var d=-a;//return -10
var f="10";

var e=+b;
var g=-f;

console.log(e);//NAN
console.log(g);//-10

Bạn đã quên một +trước b.
Attila O.

1
thanx 4 giúp tôi viết một câu trả lời gud.
Amrendra

3

+_là gần như tương đương của parseFloat(_). Quan sát rằng parseIntsẽ dừng lại ở ký tự không phải là số như dấu chấm, trong khi parshFloatsẽ không.

EXP:

    parseFloat(2.4) = 2.4 
vs 
    parseInt(2.4) = 2 
vs 
    +"2.4" = 2.4

Exp:

var _ = "3";
    _ = +_;

console.log(_); // will show an integer 3

Rất ít sự khác biệt:


Tôi nghĩ trong dòng đầu tiên bạn muốn nói parseInr(_)thay vì parseFloat(_) ?
Grijesh Chauhan

1
Không float, ý tôi là , vì parseInt sẽ dừng ở ký tự không phải là số, parshFloat sẽ không. EXP: parseFloat(2.4) = 2.4so với parseInt(2.4) = 2.
Brian

3

Nói một cách đơn giản, +_ tương đương với việc sử dụng hàm tạo Number () .

Trong thực tế, nó thậm chí hoạt động vào ngày:

var d = new Date('03/27/2014');
console.log(Number(d)) // returns 1395903600000
console.log(+d) // returns 1395903600000

DEMO: http://jsfiddle.net/dundredd77/GCLjd/


Thông tin thêm cũng có thể được tìm thấy trên phần MDN - Unary plus (+) :

Toán tử unary plus có trước toán hạng của nó và đánh giá toán hạng của nó nhưng cố gắng chuyển đổi nó thành một số, nếu nó chưa có. Mặc dù phủ định unary (-) cũng có thể chuyển đổi các số không, nhưng unary plus là cách nhanh nhất và được ưa thích để chuyển đổi một số thành một số, bởi vì nó không thực hiện bất kỳ thao tác nào khác trên số. Nó có thể chuyển đổi các biểu diễn chuỗi của số nguyên và số float, cũng như các giá trị không phải là chuỗi true, false và null. Các số nguyên ở cả hai định dạng thập phân và thập lục phân ("0x" -prefixed) đều được hỗ trợ. Số âm được hỗ trợ (mặc dù không cho hex). Nếu nó không thể phân tích một giá trị cụ thể, nó sẽ đánh giá NaN.


2

Trong biểu thức này:

r = +_;
  • '+' Hoạt động ở đây như một toán tử đơn nguyên cố gắng chuyển đổi giá trị của toán hạng bên phải. Nó không chuyển đổi toán hạng nhưng giá trị được đánh giá. Vì vậy, _sẽ ở lại "1" nếu ban đầu như vậy nhưng rsẽ trở thành số thuần túy.

Xem xét những trường hợp này xem người ta có muốn áp dụng + cho chuyển đổi số không

+"-0" // 0, not -0
+"1" //1
+"-1" // -1
+"" // 0, in JS "" is converted to 0
+null // 0, in JS null is converted to 0
+undefined // NaN
+"yack!" // NaN
+"NaN" //NaN
+"3.14" // 3.14

var _ = "1"; +_;_ // "1"
var _ = "1"; +_;!!_ //true
var _ = "0"; +_;!!_ //true
var _ = null; +_;!!_ //false

Mặc dù vậy, đây là công cụ chuyển đổi số nhanh nhất mà tôi hầu như không khuyên bạn nên sử dụng quá mức nếu sử dụng tất cả. parseInt/parseFloatlà những lựa chọn tốt dễ đọc hơn.

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.