FFI calls are just like normal calls: they need a coercion on them.
i = ffiFunc() | 0; // returns an int
d = +ffiFunc(); // returns a double
This is identical for FFI and non-FFI calls. A difference though is that asm functions have specific types (an asm function returns either nothing, an int, or a double). But an FFI is just any old JS function. So you could not write the above 2 lines together with an asm function, only an FFI can get an int one time and a double another time from the same function.