adapter.requestDevice({ requiredFeatures, requiredLimits, label }) returns a device with exactly what you request. Ask for nothing and you get the specification's defaults, which every conforming adapter meets:
<script type="module">
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice(); // no requirements: the spec's defaults
const names = ['maxTextureDimension2D', 'maxBufferSize', 'maxStorageBufferBindingSize',
'maxVertexAttributes', 'maxComputeInvocationsPerWorkgroup'];
const row = (a, b, c) => console.log(`${a}`.padEnd(34) + `${b}`.padStart(12) +
`${c}`.padStart(12));
row('limit', 'device', 'adapter');
for (const n of names) row(n, device.limits[n], adapter.limits[n]);
console.log(`device.features: ${[...device.features].join(', ')}`);
</script>limit device adapter maxTextureDimension2D 8192 16384 maxBufferSize 268435456 2147483648 maxStorageBufferBindingSize 134217728 2147483644 maxVertexAttributes 16 30 maxComputeInvocationsPerWorkgroup 256 1024 device.features: core-features-and-limits
The GTX 1650 offers double or more on every row, yet the default device gets 8192-pixel textures, 256 MiB buffers and no optional features (core-features-and-limits just marks a full "core" device). Since Chrome 140 1 an adapter is also consumed by its first device: a second requestDevice() here rejected with an OperationError (adapter is "consumed"), so request a fresh adapter for a new device, as after device loss (Device Loss Recovery).