diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index a93fb652d71265f293bf0ccdbc079f3fb562203b..5d56661013212af177d366be3a9e12488e5e73f5 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -199,8 +199,10 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret
         static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
 
         jsdisp = iface_to_jsdisp((IUnknown*)V_DISPATCH(v));
-        if(!jsdisp)
+        if(!jsdisp) {
+            V_VT(ret) = VT_EMPTY;
             return disp_propget(V_DISPATCH(v), DISPID_VALUE, ctx->lcid, ret, ei, NULL /*FIXME*/);
+        }
 
         if(hint == NO_HINT)
             hint = is_class(jsdisp, JSCLASS_DATE) ? HINT_STRING : HINT_NUMBER;
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index 0afb1806d3840235e32438c0eb56ab5e61d47052..fe8274f767676ec362aabfc3792b5171e7be3e42 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -65,6 +65,7 @@ DEFINE_EXPECT(global_success_d);
 DEFINE_EXPECT(global_success_i);
 DEFINE_EXPECT(global_notexists_d);
 DEFINE_EXPECT(testobj_delete);
+DEFINE_EXPECT(testobj_value);
 DEFINE_EXPECT(GetItemInfo_testVal);
 
 #define DISPID_GLOBAL_TESTPROPGET   0x1000
@@ -198,11 +199,30 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
+static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
 {
-    ok(0, "unexpected call\n");
-    return E_NOTIMPL;
+    switch(id) {
+    case DISPID_VALUE:
+        CHECK_EXPECT(testobj_value);
+
+        ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
+        ok(pdp != NULL, "pdp == NULL\n");
+        ok(!pdp->rgvarg, "rgvarg != NULL\n");
+        ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
+        ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
+        ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
+        ok(pvarRes != NULL, "pvarRes == NULL\n");
+        ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
+        ok(pei != NULL, "pei == NULL\n");
+
+        V_VT(pvarRes) = VT_I4;
+        V_I4(pvarRes) = 1;
+        return S_OK;
+    }
+
+    ok(0, "unexpected call %x\n", id);
+    return DISP_E_MEMBERNOTFOUND;
 }
 
 static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
@@ -223,7 +243,7 @@ static IDispatchExVtbl testObjVtbl = {
     DispatchEx_GetIDsOfNames,
     DispatchEx_Invoke,
     DispatchEx_GetDispID,
-    DispatchEx_InvokeEx,
+    testObj_InvokeEx,
     testObj_DeleteMemberByName,
     DispatchEx_DeleteMemberByDispID,
     DispatchEx_GetMemberProperties,
@@ -844,6 +864,10 @@ static void run_tests(void)
 
     parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
 
+    SET_EXPECT(testobj_value);
+    parse_script_a("ok(String(testObj) === '1', 'wrong testObj value');");
+    CHECK_CALLED(testobj_value);
+
     run_from_res("lang.js");
     run_from_res("api.js");
     run_from_res("regexp.js");