Просмотр полной версии : Object, Array или Node ?
PeaceCoder
18.12.2009, 18:32
Никто не знает сабж короткого и быстро определить? или вообще кто знает как определить? Вопрос к гуру? Возникла идея, хочу проверить имеет ли смысл. как определить? как решают?
([]).constructor === Array // true
({}).constructor === Object // true
для Node можно воспользоваться каким-то свойством, например jQuery поступает просто:
if (el.nodeType) //element
Объект понятие растяжимое. Для Array function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
Kolyaj, а чем плох ([]).constructor === Array ? Можно пример, когда не совпадает?
Можно пример, когда не совпадает?
Когда массив из другого окна/фрейма придёт.
Спасибо :) Да, видимо этот метод лучше того, что я привел.
UPD Главное, чтобы Object.prototype.toString никто не переопределил ;)
PeaceCoder
18.12.2009, 19:24
а это уже легко проверяется. изза этого кстати этот метод ненадежен... есть ли надежней методы?
А смысл? Если уже начали переопределять, то можно и undefined = true установить, и прочий бред написать. В конце концов, можно реализовать настолько враждебное окружение, что любой скрипт перестанет работать. Так что не стоит беспокоится о надежности подобного плана.
PeaceCoder
18.12.2009, 20:04
а почему сразу нестабильность? могут переписать функция которая будет переводить реально обьект в строку вида JSON...
Для этого есть JSON.stringify. Вообще трогать прототип Object дурной тон и чревато.
PeaceCoder
18.12.2009, 20:38
ну раз так. написал такую функцию
function typeOf(o){
if (o===null || o===undefined) return o;
var $;
if (($=Object.prototype.toString.call(o).substr(8,1)) !="O") return $;
return (o=='[object]' ? 'H':$);
}
На выходе: null,undefined,A,O,N,S,B,H,F
PeaceCoder,
лучше всегда возвращать строку, по аналогии со стандартным typeof
http://javascript.ru/forum/project/6025-bibliotechka.html#post34742
PeaceCoder
19.12.2009, 00:40
лучше всегда возвращать строку, по аналогии со стандартным typeof
зачем? ведь она выдает разные типы. все переблал... что еще может быть?
зачем?
чтобы всегда выполнять сравнение со строкой
function typeOf(arg) {
return arg;
}
var a;
if (typeOf(a) == "undefined") {
alert(1);
}
else {
alert(2);
}
PeaceCoder
19.12.2009, 23:02
А ты об этом... ну это не страшно и не так важно.
чтобы всегда выполнять сравнение со строкой
Octane, ты, наверное, говоришь в целом, а не про данный конкретный случай? Потому что в данном случае у меня не получается придумать какую-нибудь реальную проблемную ситуацию с таким подходом
Разве что typeOf(a) == 'O' выглядит так, что не сразу догадаешься что значит O. Мне, например, такой вариант в голову пришел "О! тип a - то, что нужно" ;). И надо помнить, что правильно писать typeOf(a) == undefined, а не typeOf(a) == 'U'
PeaceCoder
20.12.2009, 13:35
просто если делать вспомогательную функцию то делать так что бы толк от нее был максимум. в данном случае определяет правильно любой тип да еще и код сокращает... O=object A=Array, B=Boolean, N=Number,S=String,H=HTMLDom,F=Function..., а то что функция возвращает можно и в JSDoc'е написать ине будет непоняток что такое "О" =)
Ну я не разбирался, что там за обозначения для типов выдумали в конкретной функции, речь о этой строке:
if (o===null || o===undefined) return o;
все привыкли, что typeof всегда возвращает строку, а тут вдруг
надо помнить, что правильно писать typeOf(a) == undefined, а не typeOf(a) == 'U'
Да, можно прочитать в JSDoc, но зачем так делать, если не проблема всегда возвращать строку.
PeaceCoder
20.12.2009, 17:41
Octane, код пишу для себя. а для других служит JSDoc =) Да и логичней сравнивать с undefined|null чем с "undefined"|"null" по 2 символа больше =)
да еще и код сокращает...
есть такая фраза penny wise and pound foolish (про твой текущий подход). Еще почитать можно здесь (http://en.wikipedia.org/wiki/Unix_philosophy)
Да и логичней сравнивать с undefined|null чем с "undefined"|"null" по 2 символа больше =)
логика тут отсутствует: вместо экономии процессорного времени ты экономишь на спичках лишних символах ;)
PeaceCoder
10.01.2010, 14:36
Немного переделал функцию. теперь можно определить точно, что за элемент. Работает кроссбраузерно для всех основных типов данных, остальное (HTML элементы надо подходить индивидуально)
/**
* Определение типа обьекта. Баг IE: Элемент A возвращает как '', а не HTMLAnchorElement
* #param {any} o обьект для определения.
* #return null,undefined,"Object","Array","Function","String","Boolean","Number","Window","HTMLDocument","HTML*Element","HTMLCollection"="NodeList" и др.
*/
function typeOf(o){
if (o===null) return "null";
if (o===undefined) return "undefined";
var $=Object.prototype.toString.call(o);
if (o+''!=$ && 'ASNBF'.indexOf($[8])<0) $=o+'';
return $.slice(8,-1);
}
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot