Perhaps my favourite discovery in JavaScript was that functions may have another value when it is evaluated without calling. Manipulating .valueOf or .toString makes for fun but somewhat unreadable code.
function A(){return 3}
A.valueOf = function(){return 2}
console.log(A,A(),A()*A)
This, together with bind, was heavily used in my Rami language. Thanks to this duality of function and value, I could easily create a JS evaluator which kept the syntax. mult(add(2)(4)(6))(4)
. A kind of polish notation JavaScript.