= + _ หมายถึงอะไรใน JavaScript


252

ฉันสงสัยว่าตัวดำเนินการ= + _ มีความหมายอย่างไรใน JavaScript ดูเหมือนว่าจะได้รับมอบหมาย

ตัวอย่าง:

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

57
ทำให้ผมนึกถึงดีเก่าวิธีการดำเนินการ-->
OV

12
เครื่องหมาย + นี่คือโอเปอเรเตอร์ unary โดยมี _ เป็นตัวถูกดำเนินการ
Pieter Witvoet

44
ดูเหมือนว่าโปรแกรมเมอร์ Perl ไม่สามารถปล่อยตัวแปรเริ่มต้น ;-)
Michael Wild

4
การเน้นไวยากรณ์ที่ดีจะช่วยให้คุณตอบคำถามได้
hugo der hungrige

18
คุณสามารถทำให้ใบหน้าที่ยิ้มx= +_+ 0;
tckmn

คำตอบ:


396
r = +_;
  • +พยายามที่จะโยนสิ่ง_ที่เป็นจำนวน
  • _เป็นเพียงชื่อตัวแปร (ไม่ได้เป็นผู้ดำเนินการ) มันอาจจะเป็นa, fooฯลฯ

ตัวอย่าง:

+"1"

ส่ง "1" ไปยังหมายเลขบริสุทธิ์ 1

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

rคือตอนนี้ไม่ได้1"1"

ยิ่งไปกว่านั้นตามหน้า MDN เกี่ยวกับตัวดำเนินการทางคณิตศาสตร์ :

ผู้ประกอบการบวกเอกแจ๋วถูกดำเนินการและประเมินผลการดำเนินของมัน แต่ความพยายามที่จะแปลงเป็นตัวเลขถ้ามันไม่ได้อยู่แล้ว [ ... ]มันสามารถแปลงการแสดงสตริงของจำนวนเต็มและลอยเช่นเดียวกับที่ไม่ใช่สตริงค่าtrue, และfalse nullจำนวนเต็มใน"0x"รูปแบบทศนิยมและฐานสิบหก ( -prefixed) ได้รับการสนับสนุน รองรับจำนวนลบ (แต่ไม่ใช่สำหรับเลขฐานสิบหก) NaNหากไม่สามารถแยกค่าเฉพาะอย่างยิ่งจะประเมิน

มันยังตั้งข้อสังเกตอีกว่า

unary plus เป็นวิธีที่เร็วและเป็นที่ต้องการในการแปลงบางสิ่งให้เป็นตัวเลข


2
+ หมายถึงการส่งไปยังหมายเลข+_จริง ๆหรือหมายความว่าจริง ๆ0+_แล้วในกรณีใดที่_จะต้องส่งก่อนเพิ่มเป็น 0
colincameron

3
@ c.cam108 ดูหน้า MDN ในผู้ประกอบการบวกเอก
lonesomeday

17
@ c.cam108 - ไม่พวกเขาไม่ทำงานเหมือนกัน บวกกับปลดค่าเป็นตัวเลข แต่ไบนารีบวกไม่ได้: +'12' === 12(ผลลัพธ์คือตัวเลข) แต่0 + '12' === '012'(ผลลัพธ์คือสตริง) 0 - '12' === -12แต่โปรดทราบว่า
Kobi

1
@ juzerali แน่นอน แต่นั่นไม่ใช่วิธีปฏิบัติที่ดี ลองใช้การเพิ่ม;)
Izkata

ดูด้วยค่าเริ่มต้นของตัวแปร perl $ _
Matthew Lock

95

มันไม่ได้เป็นผู้ประกอบการที่ได้รับมอบหมาย

  • _ เป็นเพียงพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
  • ในบรรทัดถัดไปจะr = +_; +ปลดเปลื้องตัวแปรนั้น ( _) ให้กับตัวเลขหรือค่าจำนวนเต็มและกำหนดให้กับตัวแปรr

อย่าสับสนกับ+=ผู้ประกอบการ


54

=+จริง ๆ แล้วสองตัวดำเนินการ=คือการกำหนดและ+และ _เป็นชื่อตัวแปร

ชอบ:

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

รหัสต่อไปนี้ฉันจะช่วยให้คุณสามารถแสดงการใช้งานของ=+การแปลงสตริง เข้าint
ตัวอย่าง:

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

เอาท์พุท10

ใช้:ดังนั้นนี่yคือ int 5เพราะเป็น=+
อย่างอื่น:

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

เอาท์พุต55

โดยที่_เป็นตัวแปร

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

เอาท์พุท10

นอกจากนี้ มันจะน่าสนใจที่จะรู้ว่าคุณสามารถบรรลุสิ่งเดียวกันด้วย~(ถ้า string เป็นint string (float จะปัดเศษเป็น int) )

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

ยังเอาต์พุต10

~is bitwise NOT: แปลงบิตของตัวถูกดำเนินการ ฉันทำสองครั้งโดยไม่มีการเปลี่ยนแปลงขนาด


1
ฉันใช้บ่อยx|0ในการแปลงสองครั้งเป็น int; อย่างไรก็ตามสิ่งนี้รวมถึงการใช้ '~' มีบทลงโทษที่ จำกัด จำนวน <2 ^ 32 + "2e15" ไม่ได้
Aki Suihkonen

@AkiSuihkonen ใช่ดีผมเชื่อว่าแม้จะได้เร็วขึ้นแล้วx|0 +ถูกต้องหรือไม่ เทคนิคที่ดี :) (2) ฉันใช้~เพื่อแสดง OP ที่+ไม่เพียง แต่ใช้สัญลักษณ์เท่านั้น ( ฉันเองใช้+ )
Grijesh Chauhan

ยากที่จะพูด - มี jsperf แม้ว่าใครจะต้องการวัดมัน OTOH ผู้ประกอบการทั้งสองนี้มีความหมายที่แตกต่างกันโดยสิ้นเชิง หากต้องการเพียงตัวเลข (และไม่ใช่จำนวนเต็ม) '+' จะสั้นกว่าหนึ่งอักขระ
Aki Suihkonen

1
ที่จริงฉันเพิ่งทดสอบมัน jsperf - 18M ops สำหรับ '| 0', 19M ops สำหรับ '+'; ประสิทธิภาพอาจแตกต่างจากเบราว์เซอร์เบราว์เซอร์ jsperf.com/strtoint
Aki Suihkonen

1
@ AkiSuihkonen โอ้ฉันเพิ่งทำแบบทดสอบ jsperf ใน Firefox แตกต่างกัน|มาก.. เร็วขึ้นมาก
Tapirboy

16

=+มันไม่ได้ ใน JavaScript +หมายถึงเปลี่ยนเป็นหมายเลข

+'32' ผลตอบแทน 32

+'a' ส่งคืน NaN

ดังนั้นคุณอาจใช้isNaN()เพื่อตรวจสอบว่าสามารถเปลี่ยนเป็นจำนวน


16

มันเป็นเรื่องลับๆล่อๆ

สิ่งสำคัญที่ต้องเข้าใจคืออักขระขีดล่างที่นี่จริง ๆ แล้วเป็นชื่อตัวแปรไม่ใช่ตัวดำเนินการ

เครื่องหมายบวกด้านหน้าที่ได้รับค่าตัวเลขบวกของเครื่องหมายขีดเส้นใต้ - นั่นคือการคัดเลือกตัวแปรขีดเส้นใต้ให้เป็น int อย่างมีประสิทธิภาพ คุณสามารถใช้เอฟเฟ็กต์แบบเดียวกันparseInt()ได้ แต่การใช้เครื่องหมายบวกนั้นน่าจะถูกใช้ที่นี่เพราะมันกระชับกว่า

และนั่นก็เท่ากับทำให้เครื่องหมายเท่ากับเท่ากับการกำหนดตัวแปรมาตรฐาน

อาจไม่ได้เขียนอย่างจงใจเพื่อสร้างความสับสนในฐานะที่เป็นโปรแกรมเมอร์ Javascript ที่มีประสบการณ์โดยทั่วไปจะรับรู้ขีดล่างเป็นตัวแปร แต่ถ้าคุณไม่รู้ว่ามันสับสนอย่างแน่นอน แน่นอนฉันจะไม่เขียนมันอย่างนั้น ฉันไม่ใช่แฟนตัวยงของชื่อตัวแปรที่ไม่มีความหมายสั้น ๆ ในช่วงเวลาที่ดีที่สุด - หากคุณต้องการชื่อตัวแปรแบบสั้นในรหัส JS เพื่อประหยัดพื้นที่ใช้ minifier; อย่าเขียนด้วยตัวแปรสั้น ๆ เพื่อเริ่มต้นด้วย


1
+1 เนื่องจากคุณเป็นคนเดียวที่จะชี้ให้เห็นอย่างชัดเจนว่า_เป็นตัวแปร
TRiG

@TRiG คำตอบของ Starx เกี่ยวกับอะไรซึ่งไม่เป็น tl; dr
คณิตศาสตร์


9

ฉันคิดว่าคุณหมายถึงr = +_;อะไร Numberในกรณีที่มันแปลงของพารามิเตอร์ไป พูด_เป็น '12 0.3' แล้วผลตอบแทน+'12.3' 12.3ดังนั้นในคำสั่งที่ยกมาได้รับมอบหมายให้+_r


6

_เป็นเพียงชื่อตัวแปรที่ส่งผ่านเป็นพารามิเตอร์ของฟังก์ชันhexbin.radiusและ+แปลงเป็นตัวเลข

ขอผมทำ exmple แบบเดียวกับฟังก์ชั่นของคุณ

var hexbin = {},r  ;

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

และเรียกใช้ฟังก์ชันตัวอย่างนี้ .. ซึ่งแสดงผล

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 (จริง);

true boolean
1 number false

ตอบช้ามาก แต่คำตอบที่ดีมาก +
Grijesh Chauhan

5

มันจะกำหนดค่าใหม่ให้กับตัวแปรด้านซ้ายจำนวน

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
อัตติลาโอ.

1
ขอบคุณ 4 ช่วยให้ฉันเขียนคำตอบ gud
Amrendra

3

+_เกือบจะเทียบเท่าparseFloat(_)ของ สังเกตว่าparseIntจะหยุดที่ตัวละครที่ไม่ใช่ตัวเลขเช่นจุดในขณะที่parshFloatจะไม่

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

ความแตกต่างน้อยมาก:


ฉันคิดว่าในบรรทัดแรกที่คุณต้องการจะพูดparseInr(_)แทนparseFloat(_) ?
Grijesh Chauhan

1
ไม่ฉันหมายถึงfloatเพราะการแยกวิเคราะห์จะหยุดที่อักขระที่ไม่ใช่ตัวเลข parshFloat จะไม่ EXP: VSparseFloat(2.4) = 2.4 parseInt(2.4) = 2
Brian

3

ใส่เพียงแค่+_ จะเทียบเท่ากับการใช้จำนวน ()คอนสตรัค

ในความเป็นจริงมันใช้งานได้แม้ในวันที่:

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

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


ข้อมูลเพิ่มเติมสามารถดูได้ที่ MDN - ส่วนบวก (+) :

ตัวดำเนินการ unary plus นำหน้าตัวถูกดำเนินการและประเมินเป็นตัวถูกดำเนินการ แต่พยายามแปลงมันเป็นตัวเลขหากยังไม่ได้ดำเนินการ แม้ว่า unary negation (-) สามารถแปลงตัวเลขที่ไม่ใช่ตัวเลขได้ แต่ unary plus เป็นวิธีที่เร็วที่สุดและต้องการแปลงบางสิ่งให้เป็นตัวเลขเพราะมันไม่ได้ทำการดำเนินการอื่นใดกับตัวเลข มันสามารถแปลงการแทนสตริงของจำนวนเต็มและลอยเช่นเดียวกับค่าที่ไม่ใช่สตริงจริง, เท็จและเป็นโมฆะ จำนวนเต็มในรูปแบบทั้งทศนิยมและฐานสิบหก ("0x" -prefixed) ได้รับการสนับสนุน รองรับจำนวนลบ (แต่ไม่ใช่สำหรับเลขฐานสิบหก) หากไม่สามารถแยกวิเคราะห์ค่าเฉพาะได้มันจะประเมินเป็น NaN


2

ในการแสดงออกนี้:

r = +_;
  • '+' ทำหน้าที่เป็นตัวดำเนินการเอกนารีที่พยายามแปลงค่าของตัวถูกดำเนินการที่เหมาะสม มันไม่แปลงตัวถูกดำเนินการ แต่เป็นค่าที่ประเมิน ดังนั้น_จะคงอยู่ "1" ถ้ามันเป็นอย่างนั้น แต่rจะกลายเป็นจำนวนที่บริสุทธิ์

พิจารณากรณีเหล่านี้ว่าต้องการใช้ + สำหรับการแปลงเชิงตัวเลขหรือไม่

+"-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

แม้ว่ามันจะเป็นตัวแปลงตัวเลขที่เร็วที่สุดที่ฉันไม่แนะนำให้ใช้มากเกินไปหากใช้ไปเลย parseInt/parseFloatเป็นทางเลือกที่ดีกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.