---
title: JSValue
framework: javascriptcore
role: symbol
role_heading: Class
path: javascriptcore/jsvalue
---

# JSValue

A JavaScript value.

## Declaration

```swift
class JSValue
```

## Overview

Overview You use the JSValue class to convert basic values, such as numbers and strings, between JavaScript and Objective-C or Swift representations to pass data between native code and JavaScript code. You can also use this class to create JavaScript objects that wrap native objects of custom classes or JavaScript functions with implementations that native methods or blocks provide. Each JSValue instance originates from a JSContext object that represents the JavaScript execution environment containing that value. The value holds a strong reference to its context object — as long as it retains any value for a particular JSContext instance, that context remains alive. When you invoke an instance method on a JSValue object, and that method returns another JSValue object, the returned value belongs to the same context as the original value. Each JavaScript value also has an association (indirectly via the context property) with a specific JSVirtualMachine object that represents the underlying set of execution resources for its context. You can pass JSValue instances only to methods on JSValue and JSContext instances on the same virtual machine — attempting to pass a value to a different virtual machine raises an Objective-C exception. Convert Between JavaScript and Native Types When you use the JSValue methods for creating, reading, and converting JavaScript values, JavaScriptCore automatically converts native values to JavaScript values and vice versa, using the rules below. NSDictionary objects or Swift dictionaries and the keys they contain become JavaScript objects with matching named properties and vice versa. JavaScriptCore recursively copies and converts the values for keys. NSArray objects or Swift arrays become JavaScript arrays and vice versa, with elements that JavaScriptCore recursively copies and converts. Objective-C blocks (or Swift closures with the @convention(block) attribute) become JavaScript Function objects, with parameter and return types that JavaScriptCore converts using the same rules as values. Converting a JavaScript function with a backing from a native block or method returns that block or method; all other JavaScript functions convert as empty dictionaries. For all other native object types (and class types or metatypes), JavaScriptCore creates a JavaScript wrapper object with a constructor prototype chain that reflects the native class hierarchy. By default, the JavaScript wrapper for a native object doesn’t make that object’s properties and methods available in JavaScript. To choose properties and methods for export to JavaScript, see JSExport. When you convert an object, method, or block, JavaScriptCore implicitly converts the types and values of object properties and method parameters using the rules below:  |  |   |  |   |  |   |  |   |  |   |  |   |  |   |  |   |  |   |  |   |  |

## Topics

### Creating JavaScript Values

- [init(object:in:)](javascriptcore/jsvalue/init(object:in:).md)
- [init(bool:in:)](javascriptcore/jsvalue/init(bool:in:).md)
- [init(double:in:)](javascriptcore/jsvalue/init(double:in:).md)
- [init(int32:in:)](javascriptcore/jsvalue/init(int32:in:).md)
- [init(uInt32:in:)](javascriptcore/jsvalue/init(uint32:in:).md)
- [init(newObjectIn:)](javascriptcore/jsvalue/init(newobjectin:).md)
- [init(newArrayIn:)](javascriptcore/jsvalue/init(newarrayin:).md)
- [init(newRegularExpressionFromPattern:flags:in:)](javascriptcore/jsvalue/init(newregularexpressionfrompattern:flags:in:).md)
- [init(newErrorFromMessage:in:)](javascriptcore/jsvalue/init(newerrorfrommessage:in:).md)
- [init(undefinedIn:)](javascriptcore/jsvalue/init(undefinedin:).md)
- [init(nullIn:)](javascriptcore/jsvalue/init(nullin:).md)
- [init(point:inContext:)](javascriptcore/jsvalue/init(point:incontext:).md)
- [init(range:inContext:)](javascriptcore/jsvalue/init(range:incontext:).md)
- [init(rect:inContext:)](javascriptcore/jsvalue/init(rect:incontext:).md)
- [init(size:inContext:)](javascriptcore/jsvalue/init(size:incontext:).md)
- [init(newSymbolFromDescription:in:)](javascriptcore/jsvalue/init(newsymbolfromdescription:in:).md)
- [init(newPromiseIn:fromExecutor:)](javascriptcore/jsvalue/init(newpromisein:fromexecutor:).md)
- [init(newPromiseRejectedWithReason:in:)](javascriptcore/jsvalue/init(newpromiserejectedwithreason:in:).md)
- [init(newPromiseResolvedWithResult:in:)](javascriptcore/jsvalue/init(newpromiseresolvedwithresult:in:).md)

### Reading and Converting JavaScript Values

- [toObject()](javascriptcore/jsvalue/toobject().md)
- [toObjectOf(_:)](javascriptcore/jsvalue/toobjectof(_:).md)
- [toBool()](javascriptcore/jsvalue/tobool().md)
- [toDouble()](javascriptcore/jsvalue/todouble().md)
- [toInt32()](javascriptcore/jsvalue/toint32().md)
- [toUInt32()](javascriptcore/jsvalue/touint32().md)
- [toNumber()](javascriptcore/jsvalue/tonumber().md)
- [toString()](javascriptcore/jsvalue/tostring().md)
- [toDate()](javascriptcore/jsvalue/todate().md)
- [toArray()](javascriptcore/jsvalue/toarray().md)
- [toDictionary()](javascriptcore/jsvalue/todictionary().md)
- [toPoint()](javascriptcore/jsvalue/topoint().md)
- [toRange()](javascriptcore/jsvalue/torange().md)
- [toRect()](javascriptcore/jsvalue/torect().md)
- [toSize()](javascriptcore/jsvalue/tosize().md)

### Determining the Type of a JavaScript Value

- [isUndefined](javascriptcore/jsvalue/isundefined.md)
- [isNull](javascriptcore/jsvalue/isnull.md)
- [isBoolean](javascriptcore/jsvalue/isboolean.md)
- [isNumber](javascriptcore/jsvalue/isnumber.md)
- [isString](javascriptcore/jsvalue/isstring.md)
- [isObject](javascriptcore/jsvalue/isobject.md)
- [isArray](javascriptcore/jsvalue/isarray.md)
- [isDate](javascriptcore/jsvalue/isdate.md)
- [isSymbol](javascriptcore/jsvalue/issymbol.md)

### Comparing JavaScript Values

- [isEqual(to:)](javascriptcore/jsvalue/isequal(to:).md)
- [isEqualWithTypeCoercion(to:)](javascriptcore/jsvalue/isequalwithtypecoercion(to:).md)
- [isInstance(of:)](javascriptcore/jsvalue/isinstance(of:).md)

### Working with Function and Constructor Values

- [call(withArguments:)](javascriptcore/jsvalue/call(witharguments:).md)
- [construct(withArguments:)](javascriptcore/jsvalue/construct(witharguments:).md)
- [invokeMethod(_:withArguments:)](javascriptcore/jsvalue/invokemethod(_:witharguments:).md)

### Working with Container Values

- [defineProperty(_:descriptor:)](javascriptcore/jsvalue/defineproperty(_:descriptor:).md)
- [hasProperty(_:)](javascriptcore/jsvalue/hasproperty(_:).md)
- [deleteProperty(_:)](javascriptcore/jsvalue/deleteproperty(_:).md)
- [atIndex(_:)](javascriptcore/jsvalue/atindex(_:).md)
- [setValue(_:at:)](javascriptcore/jsvalue/setvalue(_:at:).md)
- [forProperty(_:)](javascriptcore/jsvalue/forproperty(_:).md)
- [setValue(_:forProperty:)](javascriptcore/jsvalue/setvalue(_:forproperty:).md)
- [JSValueProperty](javascriptcore/jsvalueproperty.md)

### Accessing a Value’s JavaScript Context

- [context](javascriptcore/jsvalue/context.md)

### Accessing Values with Subscript Syntax

- [objectAtIndexedSubscript(_:)](javascriptcore/jsvalue/objectatindexedsubscript(_:).md)
- [setObject(_:atIndexedSubscript:)](javascriptcore/jsvalue/setobject(_:atindexedsubscript:).md)
- [objectForKeyedSubscript(_:)](javascriptcore/jsvalue/objectforkeyedsubscript(_:).md)
- [setObject(_:forKeyedSubscript:)](javascriptcore/jsvalue/setobject(_:forkeyedsubscript:).md)

### Working with the C JavaScriptCore API

- [jsValueRef](javascriptcore/jsvalue/jsvalueref.md)
- [init(JSValueRef:inContext:)](javascriptcore/jsvalue/init(jsvalueref:incontext:).md)

### Constants

- [Property Descriptor Keys](javascriptcore/property-descriptor-keys.md)

### Initializers

- [init(UInt32:inContext:)](javascriptcore/jsvalue/init(uint32:incontext:).md)
- [init(bool:inContext:)](javascriptcore/jsvalue/init(bool:incontext:).md)
- [init(double:inContext:)](javascriptcore/jsvalue/init(double:incontext:).md)
- [init(int32:inContext:)](javascriptcore/jsvalue/init(int32:incontext:).md)
- [init(jsValueRef:in:)](javascriptcore/jsvalue/init(jsvalueref:in:).md)
- [init(newArrayInContext:)](javascriptcore/jsvalue/init(newarrayincontext:).md)
- [init(newBigIntFrom:in:)](javascriptcore/jsvalue/init(newbigintfrom:in:)-1f0xs.md)
- [init(newBigIntFrom:in:)](javascriptcore/jsvalue/init(newbigintfrom:in:)-7worq.md)
- [init(newBigIntFrom:in:)](javascriptcore/jsvalue/init(newbigintfrom:in:)-8l9iv.md)
- [init(newBigIntFrom:in:)](javascriptcore/jsvalue/init(newbigintfrom:in:)-r38z.md)
- [init(newBigIntFromDouble:inContext:)](javascriptcore/jsvalue/init(newbigintfromdouble:incontext:).md)
- [init(newBigIntFromInt64:inContext:)](javascriptcore/jsvalue/init(newbigintfromint64:incontext:).md)
- [init(newBigIntFromString:inContext:)](javascriptcore/jsvalue/init(newbigintfromstring:incontext:).md)
- [init(newBigIntFromUInt64:inContext:)](javascriptcore/jsvalue/init(newbigintfromuint64:incontext:).md)
- [init(newErrorFromMessage:inContext:)](javascriptcore/jsvalue/init(newerrorfrommessage:incontext:).md)
- [init(newObjectInContext:)](javascriptcore/jsvalue/init(newobjectincontext:).md)
- [init(newPromiseInContext:fromExecutor:)](javascriptcore/jsvalue/init(newpromiseincontext:fromexecutor:).md)
- [init(newPromiseRejectedWithReason:inContext:)](javascriptcore/jsvalue/init(newpromiserejectedwithreason:incontext:).md)
- [init(newPromiseResolvedWithResult:inContext:)](javascriptcore/jsvalue/init(newpromiseresolvedwithresult:incontext:).md)
- [init(newRegularExpressionFromPattern:flags:inContext:)](javascriptcore/jsvalue/init(newregularexpressionfrompattern:flags:incontext:).md)
- [init(newSymbolFromDescription:inContext:)](javascriptcore/jsvalue/init(newsymbolfromdescription:incontext:).md)
- [init(nullInContext:)](javascriptcore/jsvalue/init(nullincontext:).md)
- [init(object:inContext:)](javascriptcore/jsvalue/init(object:incontext:).md)
- [init(point:in:)](javascriptcore/jsvalue/init(point:in:).md)
- [init(range:in:)](javascriptcore/jsvalue/init(range:in:).md)
- [init(rect:in:)](javascriptcore/jsvalue/init(rect:in:).md)
- [init(size:in:)](javascriptcore/jsvalue/init(size:in:).md)
- [init(undefinedInContext:)](javascriptcore/jsvalue/init(undefinedincontext:).md)

### Instance Properties

- [isBigInt](javascriptcore/jsvalue/isbigint.md)

### Instance Methods

- [compare(_:)](javascriptcore/jsvalue/compare(_:)-35b2t.md)
- [compare(_:)](javascriptcore/jsvalue/compare(_:)-5w184.md)
- [compare(_:)](javascriptcore/jsvalue/compare(_:)-64n3k.md)
- [compare(_:)](javascriptcore/jsvalue/compare(_:)-9d4zq.md)
- [toInt64()](javascriptcore/jsvalue/toint64().md)
- [toUInt64()](javascriptcore/jsvalue/touint64().md)

### Default Implementations

- [JSValue Implementations](javascriptcore/jsvalue/jsvalue-implementations.md)

## Relationships

### Inherits From

- [NSObject](objectivec/nsobject-swift.class.md)

### Conforms To

- [CVarArg](swift/cvararg.md)
- [CustomDebugStringConvertible](swift/customdebugstringconvertible.md)
- [CustomStringConvertible](swift/customstringconvertible.md)
- [Equatable](swift/equatable.md)
- [Hashable](swift/hashable.md)
- [NSObjectProtocol](objectivec/nsobjectprotocol.md)

## See Also

### JavaScript Code

- [JSManagedValue](javascriptcore/jsmanagedvalue.md)
