Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Уточненное определение типа объекта - typeOf (https://javascript.ru/forum/project/49857-utochnennoe-opredelenie-tipa-obekta-typeof.html)

_0_ 31.08.2014 19:39

Уточненное определение типа объекта - typeOf
 
Может будет интересно, часто вижу кривые определения типа объекта, например Array определяется по наличию метода concat :lol:

Сделал для себя функцию typeOf - надстройку над стандартной

function typeOf( arg ){
		var t = typeof(arg);
		if( arg === null ){
			return 'null';
		}else if( t == 'object' ){
			t = Object.prototype.toString.call( arg )
			return t.substr( 8, t.length - 9 ).toLowerCase();
		}else{
			return t;
		}
	}

	// ну и проверочка

	function log( arg ){
		console.log( typeOf( arg ),' > ', arg );
	}
	
	log()
	log({})
	log([])
	log('ggg')
	log(888)
	log( /\g\/i/ )
	log(null)
	log( function(){} );


Скопируй в консоль и нажми ENTER

Sweet 31.08.2014 20:14

Цитата:

Сообщение от _0_
часто вижу кривые определения типа объекта... Сделал для себя функцию typeOf

Тоже не особо прямая функция:
typeOf(window)

В фоксе выдаёт "window", в хроме - "global", в ie8 - "object". Сколько браузеров - столько и мнений, однако.:D

Octane 31.08.2014 21:29

Цитата:

Сообщение от _0_
часто вижу кривые определения типа объекта, например Array определяется по наличию метода concat

Duck typing? Не, не слышал!

И конкретно для массивов во всех браузерах есть Array.isArray.

skrudjmakdak 01.09.2014 15:59

?? зачем изобретать велосипед, когда он уже давно изобретен?
например можно дернуть у ext эту функцию:

function (value) {
            var type,
                typeToString;
            
            if (value === null) {
                return 'null';
            }

            type = typeof value;

            if (type === 'undefined' || type === 'string' || type === 'number' || type === 'boolean') {
                return type;
            }

            typeToString = toString.call(value);

            switch(typeToString) {
                case '[object Array]':
                    return 'array';
                case '[object Date]':
                    return 'date';
                case '[object Boolean]':
                    return 'boolean';
                case '[object Number]':
                    return 'number';
                case '[object RegExp]':
                    return 'regexp';
            }

            if (type === 'function') {
                return 'function';
            }

            if (type === 'object') {
                if (value.nodeType !== undefined) {
                    if (value.nodeType === 3) {
                        return (nonWhitespaceRe).test(value.nodeValue) ? 'textnode' : 'whitespace';
                    }
                    else {
                        return 'element';
                    }
                }

                return 'object';
            }

        }


ах да, еще она есть у jquery: jQuery.type([]);

MallSerg 01.09.2014 17:12

ИМХО:
В JS почти всегда нужно проверять необходимые свойства у объектов.
Если есть проверка типа то скрипт почти наверняка написан неправильно.


Часовой пояс GMT +3, время: 19:15.