var nameThatNumber = function() {
var names = {
10: 'ten',
1: 'one', 11: 'eleven',
2: 'two', 12: 'twelve', 20: 'twenty',
3: 'three', 13: 'thirteen', 30: 'thirty',
4: 'four', 14: 'fourteen', 40: 'fourty',
5: 'five', 15: 'fifteen', 50: 'fifty',
6: 'six', 16: 'sixteen', 60: 'sixty',
7: 'seven', 17: 'seventeen', 70: 'seventy',
8: 'eight', 18: 'eighteen', 80: 'eighty',
9: 'nine', 19: 'nineteen', 90: 'ninety',
100: 'hundred',
k1: 'thousand',
k2: 'million',
k3: 'billion'
};
function stringify(num) {
if(num < 1000) {
return triade(num);
}
var triades = [];
var n = num;
while(n) {
triades.push(n % 1000);
n = Math.floor(n / 1000);
}
return triades.map(function(n, i) {
var t = triade(n);
if(t === '') {
return '';
}
var nm = ' ' + (names['k' + i] || '');
return t + nm;
}).reverse().join(' ').replace(/\s+/g, ' ').trim();
}
function triade(num) {
var n = num;
if(n === 0) {
return '';
}
if(n <= 20) {
return names[n];
}
var result = '';
if(n >= 100) {
result = names[Math.floor(n / 100)] + ' ' + names[100];
}
n %= 100;
if(n === 0) {
return result;
}
if(result !== '') {
result += ' and ';
}
if(n <= 20) {
return result + names[n];
}
result += names[Math.floor(n / 10) * 10];
n %= 10;
if(n !== 0) {
result += ' ' + names[n];
}
return result;
}
return function nameThatNumber(num) {
var n = Math.abs(parseInt(num));
if(isNaN(n)) {
return 'Not a number!';
}
if(n === 0) {
return 'zero';
}
return (num < 0 ? 'minus ' : '') + stringify(n);
};
}();
Почему так?this ссылается на контекст, в котором функция была вызвана
test.otherSome(); //контекст - test
test.otherSome.call(null); //контекст - null
new test.otherSome(); //контекст - новый объект унаследованный от test.otherSome.prototype
(0, test.otherSome)(); //контекст - undefined (в strict mode) или глобальный объект (не в strict mode)
({ otherSome: test.otherSome }).otherSome(); //контекст - объект который в скобочках
ЗЫ. А как реализовать такую штуку...? Та которая не работает...
(function(std, env, heap) {
'use asm';
function fib(n) {
n = n|0;
if((n|0) < (2|0)) {
return 1|0;
}
return (fib((n|0) - (1|0)) + fib((n|0) - (2|0)))|0;
}
return fib;
}(
{},
null,
new ArrayBuffer(0)
));
const heap = new ArrayBuffer(1 << 30); //создали буфер 1gb но память он пока не занимает
const heapUI16 = new Uint16Array(heap); // создали типизированный массив связанный с буфером
// здесь будет сожрана память на весь буфер (1gb + доп данные от v8)
// + будет большой такой лок процесса пока буфер забьется нулями, что плохо
const heap = new ArrayBuffer(1 << 30); //создали буфер 1gb
const heapView = new DataView(heap); //интерфейс для управления heap снаружи
//asm.js модуль
const asmModule = (function(std, env, heap) { 'use asm';
var HUI8 = new std.Uint8Array(heap); //это памяти пока не съест
//...
}({Uint8Array}, null, heap));
//функция для помещения строки на heap
function alocateString(pointer, str) {
heapView.setUint32(pointer, str.length);
for(let i = 0, p = pointer + 4; i < str.length; i++, (p += 2)) {
heapView.setUint16(p, str.charCodeAt(i));
}
}
//поместим не в начало буфера, а куда нить на позицию в 1мб длинную строку, 8кб:
alocateString(1024*1024, 'test'.repeat(1024));
Вуаля, после добавления в буфер 8kb расходуемая процессом память выросла так же на 8kb (ну с копейками) /^((-|\+)\.?|\.)?\d|\d$/.test("1test");
typeof a
возвращает строку с типом знаения содержащимся в переменной a на момент вызова!isNaN(a) && isFinite(a)