O que significa = + _ em JavaScript

252

Eu queria saber o que o operador = + _ significa em JavaScript. Parece que faz atribuições.

Exemplo:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};
Dimitry
fonte
57
Lembrou-me do bom e velho operador de abordagem-->
ov 28/02
12
O + aqui é um operador unário, com _ como seu operando.
Pieter Witvoet
44
Parece um programador Perl não poderia deixar de ir a variável padrão ;-)
Michael selvagem
4
Um bom destaque de sintaxe ajudaria você a responder à pergunta.
Hugo der hungrige
18
Você pode fazer um rosto sorridentex= +_+ 0;
tckmn

Respostas:

396
r = +_;
  • +tenta lançar o que quer que _seja para um número.
  • _é apenas um nome variável (não um operador), pode ser a, fooetc.

Exemplo:

+"1"

converter "1" para o número 1 puro.

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

ré agora 1, não "1".

Além disso, de acordo com a página MDN em Operadores Aritméticos :

O operador unary plus precede seu operando e avalia seu operando, mas tenta convertê-lo em um número, se já não estiver . [...] Ele pode converter representações de seqüência de números inteiros e carros alegóricos, bem como os valores não-cordas true, falsee null. Os números inteiros nos formatos decimal e hexadecimal ( "0x"pré-fixado) são suportados. Números negativos são suportados (embora não sejam hexadecimais). Se não puder analisar um valor específico, será avaliado como NaN.

Note-se também que

unary plus é a maneira mais rápida e preferida de converter algo em um número

mpm
fonte
2
+ Significa realmente converter para um número ou +_realmente significa 0+_? Nesse caso, _deve ser convertido antes de adicionar a 0?
Colincameron
3
@ c.cam108 Consulte a página MDN no operador unary plus .
Loneomeday
17
@ c.cam108 - Não, eles não se comportam da mesma forma. Unary plus converte o valor em um número, mas o binário plus não: +'12' === 12(result é um número), mas 0 + '12' === '012'(result é uma string). Note, no entanto, isso 0 - '12' === -12.
Kobi
1
@juzerali Claro, mas isso não é uma boa prática. Tente usar adição;)
Izkata
Looks perlish com variável padrão $ Perl _
Matthew Bloqueio
95

Não é um operador de atribuição.

  • _ é apenas um parâmetro passado para a função

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • Na próxima linha, na r = +_; +frente, lança essa variável ( _) para um número ou valor inteiro e a atribui à variávelr

Não confundir com +=operador

Starx
fonte
54

=+são na verdade dois operadores =é atribuição e +e _é o nome da variável.

gostar:

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

Meus códigos a seguir o ajudarão a mostrar o uso de =+para converter uma string em int .
exemplo:

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

saídas 10

use: Então aqui yestá int 5por causa do =+
contrário:

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

saídas 55

Onde como _é uma variável.

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

saídas 10

Além disso, seria interessante saber que você também pode obter a mesma coisa com ~(se string for int string (float será arredondado para int) )

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

também gera 10

~é bit a bit NOT: inverte os bits do seu operando. Eu fiz duas vezes sem nenhuma mudança de magnitude.

Grijesh Chauhan
fonte
1
Eu uso frequentemente x|0para converter double em int; no entanto, assim como o uso de '~' tem a penalidade de restringir a números <2 ^ 32. + "2e15" não.
Aki Suihkonen
@AkiSuihkonen Sim, bom, acredito que x|0seja ainda mais rápido +. Correto ? boa técnica :). (2) Eu uso ~apenas para mostrar OP que +não é apenas um sinal que pode ser usado ( eu mesmo uso+ ).
Grijesh Chauhan
Difícil dizer - existe o jsperf, embora se queira medi-lo. OTOH esses dois operadores têm um significado completamente diferente. Se apenas exigir um número (e não um número inteiro) '+' for, de qualquer forma, um caractere menor.
Aki Suihkonen
1
Na verdade, eu apenas testei jsperf - 18M ops para '| 0', 19M ops para '+'; o desempenho provavelmente varia de navegador para navegador. jsperf.com/strtoint
Aki Suihkonen
1
@AkiSuihkonen Oh meu Deus, acabei de fazer o teste jsperf no Firefox, enorme diferença .. |muito mais rápido.
Tapirboy
16

Não é =+. Em JavaScript, +significa alterá-lo para número.

+'32' retorna 32.

+'a' retorna NaN.

Portanto, você pode isNaN()verificar se pode ser alterado para número.

Ovilia
fonte
16

É um sorrateiro.

O importante é entender que o caractere sublinhado aqui é na verdade um nome de variável , não um operador.

O sinal de mais na frente disso está obtendo o valor numérico positivo do sublinhado - ou seja, convertendo efetivamente a variável de sublinhado para int. Você pode obter o mesmo efeito com parseInt(), mas a conversão do sinal de adição provavelmente é usada aqui porque é mais concisa.

E isso apenas deixa o sinal de igual como apenas uma atribuição de variável padrão.

Provavelmente não foi deliberadamente escrito para confundir, pois um programador Javascript experiente geralmente reconhece o sublinhado como uma variável. Mas se você não sabe que é definitivamente muito confuso. Eu certamente não escreveria assim; Não sou fã de nomes curtos de variáveis ​​sem sentido na melhor das hipóteses - Se você quiser que nomes curtos de variáveis ​​no código JS economizem espaço, use um minificador; não escreva com variáveis ​​curtas para começar.

SDC
fonte
1
+1, pois você é o único aqui a indicar explicitamente que _é uma variável.
TRiG 28/02
@TRiG, ​​que tal a resposta de Starx, que faz isso sem ser tl; dr?
Mathletics
12

= + _ converterá _ em um número.

assim

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

número de saída.

Harsha Ivaturi
fonte
9

Suponho que você quis dizer r = +_;? Nesse caso, é a conversão do parâmetro para a Number. Diga _é '12 .3 'e depois +'12.3'retorna 12.3. Portanto, na declaração citada +_é atribuída a r.

KooiInc
fonte
6

_é apenas um nome de variável, passado como parâmetro de função hexbin.radiuse +convertido em número

Deixe-me fazer um exemplo igual à sua função.

var hexbin = {},r  ;

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

e execute esta função de exemplo .. que gera

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);

true boolean
1 number false
rab
fonte
Respondeu muito tarde, mas muito boa resposta +.
Grijesh Chauhan
5

Ele atribuirá um novo valor à variável do lado esquerdo de um número.

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
Amrendra
fonte
Você esqueceu um +antes do b.
Attila O.
1
thanx 4 me ajudando a escrever uma resposta gud.
Amrendra
3

+_é quase equivalente de parseFloat(_). Observe que parseIntirá parar em caracteres não numéricos, como ponto, enquanto parshFloatque não irá.

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

Muito poucas diferenças:

Brian
fonte
Eu acho que na primeira linha você quer dizer em parseInr(_)vez de parseFloat(_) ?
Grijesh Chauhan
1
Não, eu quis dizer float, porque parseInt irá parar com um caracter não numérico, parshFloat não. EXP: parseFloat(2.4) = 2.4vs parseInt(2.4) = 2.
21713 Brian
3

Simplificando, +_ é equivalente a usar o construtor Number () .

De fato, ele ainda funciona em datas:

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

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


Mais informações também podem ser encontradas na seção MDN - Unary plus (+) :

O operador unary plus precede seu operando e avalia seu operando, mas tenta convertê-lo em um número, se já não estiver. Embora a negação unária (-) também possa converter não-números, o unary plus é a maneira mais rápida e preferida de converter algo em um número, porque não realiza nenhuma outra operação no número. Ele pode converter representações de seqüência de caracteres de números inteiros e flutuantes, bem como os valores que não são de seqüência de caracteres true, false e null. Os números inteiros nos formatos decimal e hexadecimal (com prefixo "0x") são suportados. Números negativos são suportados (embora não sejam hexadecimais). Se não puder analisar um valor específico, será avaliado como NaN.

Dom
fonte
2

Nesta expressão:

r = +_;
  • '+' atua aqui como um operador unário que tenta converter o valor do operando certo. Não converte o operando, mas o valor avaliado. Portanto _, permanecerá "1" se fosse originalmente, mas o rnúmero se tornará puro.

Considere estes casos se deseja aplicar o + para conversão numérica

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

No entanto, é o conversor numérico mais rápido que eu dificilmente recomendaria um uso excessivo, se for o caso. parseInt/parseFloatsão boas alternativas mais legíveis.

Arman McHitarian
fonte