Как стать автором
Обновить

Комментарии 8

отсутствует у вас информация по опере 11 и веб сокетам, они включаются в настройках (opera:config#UserPrefs|EnableWebSockets)
вот что возвращает

function
function WebSocket() { [native code] }
object
[object WebSocketPrototype]
но в них остается ещё много много багов в деталях. Фиксированные ответы на typeof и toString очень важны для JavaScript

Если typeof еще подразумевается как оператор именно для определения типа, то полагаться на toString совершенно нельзя — он задумывался совсем не для этого.
Тут я с вами отчасти согласен. typeof подразумевался как оператор определения типа, но работает исключительно с примитивными типами, притом типизирует объект по таблице. Сейчас же toString дает больше представления об объекте, чем typeof (тот же Array). Притом toString для каждого объекта каждого браузера фиксирован, поэтому впределах оного браузера он выдает верный результат.
Если вы мне не верите взгляните на jQuery.type (они отказались от typeof), MDC isArray.
С помощью typeof нельзя многого получить: невозможно определить нативный ли это метод/объект, нельзя узнать, что этот объект Array, невозможно определить это html объект или нет (HTMLDivElement). Преимущество typeof — он в разы быстрее toString, привычнее, с помощью него можно определить undefined.
Как бы я хотел, что бы осуществилась моя мечта, и, наверное, не только моя…
Что бы разработчики браузеров договорились о единой конвенции интерпретации и парсинга. Я уже и не мечтаю, что верстка когда-то станет одинаково валидной во всех браузерах, ну хотя бы жабаскрипт. Надо гнать детские мечты из головы.
Вся надежда на НЛО :)
$classOf= function(){
var toString= {}.toString
var glob= this
return function( val ){
if( val === void 0 ) return 'Undefined'
if( val === null ) return 'Null'
if( val === glob ) return 'Global'
return toString.call( val ).replace( /^\[object |\]$/g, '' )
}
}()
Для примитивов и массива а также для некоторых нативных объектов даст точное определение, не прокатит с XMLHttpRequest, Worker, Image… для них надо вызывать own toString.
На примере воркера:
// FF 3.6.x
console.log(Worker.hasOwnProperty("toString")); // false
console.log(Worker.toString === Object.toString); // false 
console.log(Object.prototype.toString.call(Worker)); // [object DOMConstructor] аналогично для XHR
console.log(Object.prototype.toString.call(Worker.prototype)); 
// ^^^ [object XPC_WN_ModsAllowed_NoCall_Proto_JSClass] - o_O
console.log(Worker + ""); // [object Worker]
console.log(Worker.prototype + ""); // [xpconnect wrapped native prototype]

Это, конечно, выглядит красиво {}.toString, но не стоит каждый раз для получения метода toString создавать объект Object.prototype.toString ;)

Походу в таблицу придется добавить Object.prototype.toString.call(...)
Про каждый раз {}.toString я не прав.
Object.prototype.toString.call с нативными объектами ведет себя иначе только в FF в остальных результат аналогичный (Object.prototype.toString.call(Worker) === Worker + "").
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории