HTTP/2 301
content-length: 162
content-type: text/html
date: Tue, 14 Oct 2025 21:25:36 GMT
location: https://developer.mozilla.org/en-US/docs/Web/API/XRHand
server: nginx
strict-transport-security: max-age=60; includeSubDomains
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
HTTP/2 200
content-type: text/html
x-guploader-uploadid: AAwnv3J39PIe50Z_YEPfe-whynS9iS_AWXB8VkcuimL2FVwce2LfyJ_JeIuf1bNMcblWDrF2
cache-control: public, max-age=3600
expires: Tue, 14 Oct 2025 22:25:37 GMT
last-modified: Tue, 14 Oct 2025 01:07:47 GMT
etag: W/"d3a31acf387915e1c6026129ff1a1c7f"
x-goog-generation: 1760404067871885
x-goog-metageneration: 1
x-goog-stored-content-encoding: identity
x-goog-stored-content-length: 143611
x-goog-meta-goog-reserved-file-mtime: 1760402262
x-goog-hash: crc32c=jkxFFw==, md5=06Mazzh5FeHGAmEp/xocfw==
x-goog-storage-class: STANDARD
accept-ranges: none
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
alt-svc: clear
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=63072000
content-security-policy: default-src 'self'; script-src 'report-sample' 'self' 'wasm-unsafe-eval' https://www.google-analytics.com/analytics.js https://www.googletagmanager.com/gtag/js assets.codepen.io production-assets.codepen.io https://js.stripe.com 'sha256-XNBp89FG76amD8BqrJzyflxOF9PaWPqPqvJfKZPCv7M=' 'sha256-YCNoU9DNiinACbd8n6UPyB/8vj0kXvhkOni9/06SuYw=' 'sha256-PZjP7OR6mBEtnvXIZfCZ5PuOlxoDF1LDZL8aj8c42rw='; script-src-elem 'report-sample' 'self' 'wasm-unsafe-eval' https://www.google-analytics.com/analytics.js https://www.googletagmanager.com/gtag/js assets.codepen.io production-assets.codepen.io https://js.stripe.com 'sha256-XNBp89FG76amD8BqrJzyflxOF9PaWPqPqvJfKZPCv7M=' 'sha256-YCNoU9DNiinACbd8n6UPyB/8vj0kXvhkOni9/06SuYw=' 'sha256-PZjP7OR6mBEtnvXIZfCZ5PuOlxoDF1LDZL8aj8c42rw='; style-src 'report-sample' 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; connect-src 'self' developer.allizom.org bcd.developer.allizom.org bcd.developer.mozilla.org updates.developer.allizom.org updates.developer.mozilla.org https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com https://incoming.telemetry.mozilla.org https://observatory-api.mdn.allizom.net https://observatory-api.mdn.mozilla.net https://api.github.com/search/issues stats.g.doubleclick.net https://api.stripe.com; font-src 'self'; frame-src 'self' interactive-examples.mdn.mozilla.net interactive-examples.mdn.allizom.net mdn.github.io live-samples.mdn.mozilla.net live-samples.mdn.allizom.net *.mdnplay.dev *.mdnyalp.dev *.play.test.mdn.allizom.net https://v2.scrimba.com https://scrimba.com jsfiddle.net www.youtube-nocookie.com codepen.io survey.alchemer.com https://js.stripe.com; img-src 'self' data: *.githubusercontent.com *.googleusercontent.com *.gravatar.com mozillausercontent.com firefoxusercontent.com profile.stage.mozaws.net profile.accounts.firefox.com developer.mozilla.org mdn.dev interactive-examples.mdn.mozilla.net interactive-examples.mdn.allizom.net wikipedia.org upload.wikimedia.org https://mdn.github.io/shared-assets/ https://mdn.dev/ https://*.google-analytics.com https://*.googletagmanager.com www.gstatic.com; manifest-src 'self'; media-src 'self' archive.org videos.cdn.mozilla.net https://mdn.github.io/shared-assets/; child-src 'self'; worker-src 'self';
x-frame-options: DENY
origin-trial: AxVILwizhbMjxFeHOn1P3R8niO1RJY/smaK4B4d1rLzc1gTaxtXMSaTi+FoigYgCw40uFRDwFcEAeqDR+vVLOW4AAABfeyJvcmlnaW4iOiJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZyIsImZlYXR1cmUiOiJQcml2YXRlQXR0cmlidXRpb25WMiIsImV4cGlyeSI6MTc0MjA3OTYwMH0=
x-cloud-trace-context: 478724417bd2505cb99b2d86807882a5
date: Tue, 14 Oct 2025 21:25:37 GMT
server: Google Frontend
via: 1.1 google
vary: Accept-Encoding
content-encoding: gzip
x-cache: miss
XRHand - Web APIs | MDN
size
Read only
Experimental
Returns 25
, the size of the pair iterator.
The XRHand
object is a pair iterator. It can directly be used in a for...of
structure. for (const joint of myHand)
is equivalent to for (const joint of myHand.entries())
.
However, it's not a map-like object, so you don't have the clear()
, delete()
, has()
, and set()
methods.
entries()
Experimental
Returns an iterator with the hand joints/XRJointSpace
pairs for each element.
See Map.prototype.entries()
for more details.
forEach()
Experimental
Runs a provided function once per each hand joint/XRJointSpace
pair.
See Map.prototype.forEach()
for more details.
get()
Experimental
Returns a XRJointSpace
for a given hand joint or undefined
if no such hand joint key is in the map.
See Map.prototype.get()
for more details.
keys()
Experimental
Returns an iterator with all the hand joint keys.
See Map.prototype.keys()
for more details.
values()
Experimental
Returns an iterator with all the XRJointSpace
values.
See Map.prototype.values()
for more details.
The XRHand
object contains the following hand joints:
Hand joint
Index
wrist
0
thumb-metacarpal
1
thumb-phalanx-proximal
2
thumb-phalanx-distal
3
thumb-tip
4
index-finger-metacarpal
5
index-finger-phalanx-proximal
6
index-finger-phalanx-intermediate
7
index-finger-phalanx-distal
8
index-finger-tip
9
middle-finger-metacarpal
10
middle-finger-phalanx-proximal
11
middle-finger-phalanx-intermediate
12
middle-finger-phalanx-distal
13
middle-finger-tip
14
ring-finger-metacarpal
15
ring-finger-phalanx-proximal
16
ring-finger-phalanx-intermediate
17
ring-finger-phalanx-distal
18
ring-finger-tip
19
pinky-finger-metacarpal
20
pinky-finger-phalanx-proximal
21
pinky-finger-phalanx-intermediate
22
pinky-finger-phalanx-distal
23
pinky-finger-tip
24
const wristJoint = inputSource.hand.get("wrist");
const indexFingerTipJoint = inputSource.hand.get("index-finger-tip");
for (const [joint, jointSpace] of inputSource.hand) {
console.log(joint);
console.log(jointSpace);
}