V8 has been considered previously in this series. That being the case, attention here focuses on comparing and contrasting V8 with WebKit's JavaScriptCore.
JavaScriptCore and V8 differ significantly in their execution models. JavaScriptCore will execute JavaScript bytecode - today it executes a syntax tree. V8 takes a radically different approach on two fronts. First, it introduces an efficient method for accessing properties associated with an object. Second, JavaScript bytecode is compiled into architecture-specific machine code. Because JavaScript is a dynamic language, the new paradigm for property access is fully integrated with execution of machine code through a patching mechanism that accounts for object-property dynamics in real time. Not only are JavaScriptCore and V8 approaching the model of execution differently from a technical standpoint, they are also exhibiting philosophical differences - to incur or not to incur the penalty of interpretation.
JavaScriptCore and V8 are completely aligned on garbage collection, as both engines are (or will) use a generational approach. Of course, the specifics of the algorithms employed and their implementation remain different.
WebKit's JavaScript engine places emphasis on the need to support various extensions to JavaScript. I have not (yet) run across such considerations in the case of V8.
Like JavaScriptCore, V8 provides C++ bindings. I have not (yet) run across anything suggesting that V8 intends to support bindings through another language.
In summary then, it is fairly clear why the Chromium Project adopted V8 over JavaScriptCore. V8 delivers today an efficient run-time platform based on a novel execution model and leading-edge garbage collection. As V8 continues to evolve, however, JavaScript extensions are highly likely to warrant consideration.