This question was asked almost a decade ago, but it still comes up in search engines, so it's probably worth adding an updated answer. ZFS on Linux is now fairly mature: Ubuntu added basic support in 2015 and in late 2019, added installation to a ZFS root. This means it is easier to compare ZFS and btrfs on the same OS, without turning this into a Linux vs FreeBSD discussion. (If you're not on Linux, btrfs is probably not an option.)
I've been using ZFS on a basic home Linux server for the last year with a few mirrored disks, and it works well. However, the need to install the ZFS kernel module complicates things somewhat compared to using btrfs, which is built into Linux. Booting from a ZFS root is not typical, and installing ZFS makes it harder to manage the frequent kernel updates in a rolling release distribution. I am using btrfs for some of my local storage, so I thought I would try to migrate my server to btrfs as well and solve all my problems with no external kernel modules.
ZFS is overall a more mature product. Setting up your first ZFS system is surprisingly easy: it seems like there should be more configuration required, but it's a "batteries included" filesystem. ZFS provides native support for encryption, whereas btrfs requires you to encrypt your own block device using dm-crypt or similar. ZFS can even take care of exporting your filesystem over NFS or SMB. ZFS's documentation is not pitched at a kernel hacker or casual user running a single boot disk (although ZFS can do this), but assumes that the reader is building a serious file server with users, redundancy and uptime.
In contrast, while btrfs is generally stable and many people have been using it happily for years, it still contains some dangerous features like the unstable RAID56 implementation, and its documentation is difficult to locate and understand. The overwhelming list of questions on the FAQ page is typical of the btrfs documentation experience. If your needs are simple, then you can probably safely ignore many of the warnings, but it will still take you longer to reach the level of understanding required to trust the filesystem. If you're still not sure what your needs are, btrfs makes it easier to change plans later, by adding or removing devices or resizing the filesystem while it is mounted.
ZFS and btrfs use the term snapshot in very different ways, which can be confusing at the initial stage of evaluating the two systems. While the two approaches are equally powerful, you may find one or the other more intuitive:
In ZFS, block devices form a zpool which can host an arbitrary number of mountable datasets. Each dataset may have a number of snapshots, which represent efficient copies of the state of that dataset at a particular time.
In btrfs, block devices form a filesystem which contains an arbitrary number of mountable subvolumes. A snapshot of a subvolume is itself another subvolume; "a snapshot is just like a (full) copy, except it's more economical because of the shared storage." The flexibility of this approach means you need to decide on some kind of layout convention if you want to use snapshots to manage incremental backups.
If you're considering both ZFS and btrfs on Linux, and you are interested in a more bleeding edge alternative, you could also look at bcachefs.