В чем разница между "новым числом (...)" и "числом (...)" в JavaScript? - PullRequest
7 голосов
/ 04 марта 2010

В Javascript одним из надежных способов преобразования строки в число является конструктор Number:

var x = Number('09'); // 9, because it defaults to decimal

Вдохновленный этим вопросом , я начал задаваться вопросом & mdash; В чем разница между вышесказанным и:

var x =new Number('09');

Number, конечно, выглядит лучше, но это выглядит как неуместное использование конструктора. Есть ли побочные эффекты или какая-либо разница в использовании без new ? Если нет разницы, почему бы и нет, и какова цель new ?

Ответы [ 4 ]

10 голосов
/ 04 марта 2010

В первом случае вы используете числовой конструктор , называемый функцией , как описано в спецификации, который просто выполняет преобразование типа, возвращая вам примитив Number.

Во втором случае вы используете конструктор Number для создания Number объекта :

var x = Number('09');
typeof x; // 'number'

var x = new Number('09');
typeof x; // 'object'

Number('1') === new Number('1'); // false

Разница может быть незначительной, но я думаю, что важно заметить, как объекты-оболочки действуют на примитивные значения.

4 голосов
/ 04 марта 2010

Number возвращает значение простого числа. Да, немного странно, что вы можете использовать функцию-конструктор также как обычную функцию, но именно так определяется JavaScript. Большинство встроенных в язык типов имеют странные и непоследовательные дополнительные функции, подобные этой.

new Number создает явный объект Number в штучной упаковке. Разница:

typeof Number(1)      // number
typeof new Number(1)  // object

В отличие от коробочных примитивных классов Java, в JavaScript явные Number объекты абсолютно бесполезны .

Я бы не стал беспокоиться ни о каком использовании Number. Если вы хотите быть явным, используйте parseFloat('09'); если вы хотите быть кратким, используйте +'09'; если вы хотите разрешить только целые числа, используйте parseInt('09', 10).

0 голосов
/ 19 февраля 2016

Число (без нового), похоже, не приводит к примитиву. В следующем примере вызывается anyMethod () (если в прототипе Number).

Number(3).anyMethod()

Принимая во внимание

3.anyMethod()

не будет работать.

0 голосов
/ 04 марта 2010

SpiderMonkey-1.7.0:

js> typeof new Number('09');
object
js> typeof Number('09');
number
...