Comments 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 для больших чисел
Sign up to leave a comment.
Три нестандартных типа чисел в JavaScript и две библиотеки