               (do
                 (let [new-elem (get-new-elem)
                       cur (.-cur-element state)]
-                  (when (not= (get-virtual-dom cur) (get-virtual-dom new-elem))
+                  (when-not (identical? (get-virtual-dom cur) (get-virtual-dom new-elem))
                     (let [hide (get-transition cur :node-detaching)]
                       (if hide
                         (do


(defn- try-diff [parent vdom cur-dom-node top-level]
  (let [cur-state (get-element-state cur-dom-node)
        cur-vdom (get-virtual-dom (.-element-spec cur-state))]
    (if (keyword-identical? (first vdom) (first cur-vdom))
      (do
        ;(println "diff hit" (first vdom))
        (let [old-attrs? (second cur-vdom)
              new-attrs? (second vdom)
              new-attrs (when (map? new-attrs?) new-attrs?)]
          (reset-element-spec! cur-state vdom)
          (replace-attrs! cur-dom-node
                          cur-state
                          (when (map? old-attrs?) old-attrs?)
                          new-attrs)
          (let [new-children (if new-attrs (nnext vdom) (next vdom))
                dangling-child (try-diff-subseq cur-dom-node (.-firstChild cur-dom-node) new-children)]

      virtual-dom

      :default
      (let [tag (first virtual-dom)
            node (create-dom-node tag)
            attrs? (second virtual-dom)
            attrs (when (map? attrs?) attrs?)
            state (init-element-state! node elem-spec tag attrs)
            children (if attrs (nnext virtual-dom) (next virtual-dom))]
        (doseq [[k v] attrs]
          (bind-attr! node k v state))
