Комментарии 21
>>100000000000000000000
для таких числе
для таких числе
.toFixed(/* количество знаков после запятой */)
Почему все эти люди не используют самовызывающийся конструктор Джона Резига? Разве их самих не задалбывает всякий раз записывать «new» при создании переменной нового типа?
А какие преимущества это дает, кроме отсутствия слова 'new'? Усложнение и большая запутанность кода?
Представте себе — не задалбывает. Потому что я вижу что я создаю новый обьект а не вызываю функцию.
Не стоит поощрять ошибки и пользоваться такими вещами.
Не стоит поощрять ошибки и пользоваться такими вещами.
О каких ошибках вы говорите?
Когда функция-конструктор вызывается как часть выражения с new, то это конструктор, который инициализирует создание нового объекта.
Далее в качестве примера, предлагаю кратко рассмотреть поведение предопределенных конструкторов в ECMAScript…
Вызов конструктора в качестве функции (без оператора new) для типов Number, String и Boolean приводит к неявному преобразованию типов:
typeof Number([]) // number
typeof new Number([]) // object
//...
Такие операции преобразования типов в ECMAScript выполняется за счет наличия внутреннего метода [[DefaultValue]], который для нативных объектов возвращает примитивное значение в строгом соответствии с таблицами преобразований для внутренних методов ToBoolean, ToNumber, ToString и ToObject.
Для получения значения вызываются методы valueOf() или toString().
Смоделировать подобное поведение для пользовательских объектов не составит большого труда:
var object = {
property: 1,
valueOf: function() {
return this.property;
}
};
console.log(+object); // 1
Такое преобразование происходит за счет активации внутреннего метода ToPrimitive, который в свою очередь неявно вызывает метод valueOf().
Теперь давайте рассмотрим более объектно-ориентированный способ:
var Foo = function(param) {
if(this instanceof Foo)
return this.param;
else
return param || 1;
};
Foo.prototype.valueOf = function() {
return this.param || 1;
};
console.log(Foo()); // 1
console.log(Foo(10)); // 10
console.log(new Foo); // Object
console.log(+new Foo); // 1
console.log(new Foo + 1); // 2
Помимо примитивных значений есть еще объектные:
var object = new Object({property: 1});
console.log(object.property) // 1
В результате этой операции аргумент, переданный в конструктор, активирует внутренний метод ToObject, вследствие чего возвращается объектное значение. При этом, если в конструктор был передан объект, то операции конвертирования типов не происходит.
Иными словами, в Object мы можем передать не только объект, но и такие примитивные типы, как Boolean, Number и String:
var boolean = new Object(true); // [object Boolean]
var number = new Object(1); // [object Number]
var string = new Object('string'); // [object String]
Использование оператора new в данном случае опционально, как и с другими конструкторами, такими как Array, Function и RegExp:
new Array(1, 2); // [object Array]
new Function(''); // [object Function]
new RegExp(''); // [object RegExp]
В этом случае отсутствие оператора new трактуется как вызов конструктора в качестве функции.
Однако, возможны исключения когда наличие оператора new действительно влияет на результат:
var type = function(object) {
return Object.prototype.toString.call(object);
};
type(new Date); // [object Date]
type(Date); // [object Function]
type(Date()); // [object String]
type(+new Date); // [object Number]
Во-первых, прошу обратить внимание на то, что все четыре вызова возвращают разные результаты. У неподготовленных пользователей, вероятно, это приведет к баттхёрту :)
Примечание: особо стоит отметить, то что объект Math не имеет внутреннего свойства [[Construct]] из-за чего невозможно использовать этот объект как конструктор с оператором new.
Также объект Math не имеет внутреннего свойства [[Call]] из-за чего невозможно вызывать этот объект как функцию!
Таким образом, можно сказать, что для построения архитектуры собственных конструкторов, использование fallback'a (вызов конструктора в качестве функции без оператора new) не может считаться ошибкой если он спроектирован грамотно.
его решение использует
developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee
arguments.calee()
, что в будущей версии JavaScript запрещено, как я понялdeveloper.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee
Я хотел сказать про вызовы конструкторов классов, вроди:
напримерн может случится вот так:
(хотел сказать что вызов функции конструктора без new установит ссылку на this = window может как то запутанно объясняю)
var MyConstructor = function(){};
MyConstructor();
new MyConstructor();
напримерн может случится вот так:
MyConstructor.prototype.alert = function(){ return 1+1;};
(хотел сказать что вызов функции конструктора без new установит ссылку на this = window может как то запутанно объясняю)
есть библиотека Fraction.js.
не знал, пригодится
не знал, пригодится
Кстати есть ещё bigdecimal.js для больших чисел
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Три нестандартных типа чисел в JavaScript и две библиотеки