Для получения того самого типа — внутреннего свойства [[Class]] можно использовать особенность работы Object.prototype.toString и написать вот такой код
var allowedTypes = ["Object", "Undefined", "Null", "Boolean", "Number", "String"];
/**
* @param {Mixed} x
*
* @return {String}
*/
function Type(x) {
var type = Object.prototype.toString.call(x).replace(/^\[object\s|\]$/g, '');
return ~allowedTypes.indexOf(type) && type || "Object";
}
Еще есть интересная особенность оператора new — он не может вызвать функцию у которой нет свойства prototype — все нативные функции и функции () => из ES6
new Array.prototype.slice
// TypeError: Array.prototype.slice is not a constructor
// VS
var A = function () {};
Object.getOwnPropertyDescriptor(A, "prototype");
// {"configurable":false,"enumerable":false,"value":{},"writable":true}
// Убить prototype у пользовательской функции нельзя
delete A.prototype; // false - "configurable":false
new A(); // ok
А вот результаты на моей виртуалке с Ubuntu 12.04 и Node.js 0.8.9:
Rendering 100000 templates:
ECT
Escaped : 559ms
Unescaped : 134ms
Total : 693ms
Eco
Escaped : 2625ms
Unescaped : 491ms
Total : 3116ms
EJS
Escaped : 4621ms
Unescaped : 2786ms
Total : 7407ms
Handlebars.js
Escaped : 521ms
Unescaped : 275ms
Total : 796ms
Hogan.js
Escaped : 889ms
Unescaped : 720ms
Total : 1609ms
Swig
Escaped : 2052ms
Unescaped : 369ms
Total : 2421ms
Dust
Escaped : 553ms
Unescaped : 363ms
Total : 916ms
doT
Escaped : 1699ms
Unescaped : 100ms
Total : 1799ms
Fest
Escaped : 418ms
Unescaped : 202ms
Total : 620ms
Jade without `with`
Escaped : 4134ms
Unescaped : 3255ms
Total : 7389ms
Jade
Escaped : 13495ms
Unescaped : 12210ms
Total : 25705ms
Такие вещи предпочитаю перепроверять. Кстати, шаблон doT по Вашей ссылке вообще не валиден. Это можно проверить, вставив его и данные в демо-редактор на сайте разработчика. Даже если бы он был валиден, такое сравнение не приемлемо, т.к. в doT по умолчанию отключено экранирование данных, а во всех остальных оно по умолчанию включено. Отсюда его «хвалёная» скорость. Экранирование — самая тяжёлая операция для js-шаблонизаторов и использовать её стоит с умом. Не стоит экранировать все данные подряд.
В своём тесте я сравниваю для всех шаблонизаторов скорость с экранированием и без неё.
1. Ставим через Package Control — LiveReload
2. Ставим расширение версии 2.0.8 на свой браузер
проверенно на FF 15 и Chrome 22 работает.
[[Class]]
можно использовать особенность работыObject.prototype.toString
и написать вот такой кодЕще есть интересная особенность оператора new — он не может вызвать функцию у которой нет свойства prototype — все нативные функции и функции
() =>
из ES6Вот код бенчмарка: https://github.com/baryshev/template-benchmark.
А вот результаты на моей виртуалке с Ubuntu 12.04 и Node.js 0.8.9:
Такие вещи предпочитаю перепроверять. Кстати, шаблон doT по Вашей ссылке вообще не валиден. Это можно проверить, вставив его и данные в демо-редактор на сайте разработчика. Даже если бы он был валиден, такое сравнение не приемлемо, т.к. в doT по умолчанию отключено экранирование данных, а во всех остальных оно по умолчанию включено. Отсюда его «хвалёная» скорость. Экранирование — самая тяжёлая операция для js-шаблонизаторов и использовать её стоит с умом. Не стоит экранировать все данные подряд.
В своём тесте я сравниваю для всех шаблонизаторов скорость с экранированием и без неё.