I won't repeat some of the other answers but add a performance perspective. information_schema views, as Martin Smith mentions in his answer, are not the most efficient source of this information since they have to expose standard columns that have to be collected from multiple underlying sources. sys views can be more efficient from that perspective, so if you have high performance requirements, and don't have to worry about portability, you should probably go with sys views.
For example, the first query below uses information_schema.tables to check if a table exists. The second one uses sys.tables to do the same thing.
if exists (select * from information_schema.tables where table_schema = 'dbo' and table_name = 'MyTable')
print '75% cost';
if exists (select * from sys.tables where object_id = object_id('dbo.MyTable'))
print '25% cost';
When you view the IO for these, the first query has 4 logical reads to sysschobjs and sysclsobjs, while the second one has none. Also the first one does two non-clustered index seeks and a key lookup while the second one only does a single clustered index seek. First one costs ~3x more than the second one according to query plans. If you have to do this lots of times in a large system, say for deployment time, this could add up and cause performance problems. But this really only applies to heavily loaded systems. Most IT line of business systems don't have these levels of performance issues.
Again, the overall cost of these are very small individually when compared to other queries in most systems but if your system has a lot of this type of activity, it could add up.