Skip to content

Commit a49de6f

Browse files
committed
Use for...of loops to avoid object inheritance
Stop using `for...in` loops because they iterate over the objects' entire inheritance tree. Instead, only iterate over the objects' _own_ keys. This _should_ speed htmx up a bit, but I haven't benchmarked it! It's more of a correctness issue. Also use `Object.assign()` instead of reimplementing it.
1 parent 9d598f8 commit a49de6f

1 file changed

Lines changed: 22 additions & 38 deletions

File tree

src/htmx.js

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -799,14 +799,7 @@ var htmx = (function() {
799799
* @returns {T1 & T2}
800800
*/
801801
function mergeObjects(obj1, obj2) {
802-
for (const key in obj2) {
803-
if (obj2.hasOwnProperty(key)) {
804-
// @ts-ignore tsc doesn't seem to properly handle types merging
805-
obj1[key] = obj2[key]
806-
}
807-
}
808-
// @ts-ignore tsc doesn't seem to properly handle types merging
809-
return obj1
802+
return Object.assign({}, obj1, obj2)
810803
}
811804

812805
/**
@@ -2065,17 +2058,15 @@ var htmx = (function() {
20652058
const triggerBody = xhr.getResponseHeader(header)
20662059
if (triggerBody.indexOf('{') === 0) {
20672060
const triggers = parseJSON(triggerBody)
2068-
for (const eventName in triggers) {
2069-
if (triggers.hasOwnProperty(eventName)) {
2070-
let detail = triggers[eventName]
2071-
if (isRawObject(detail)) {
2072-
// @ts-ignore
2073-
elt = detail.target !== undefined ? detail.target : elt
2074-
} else {
2075-
detail = { value: detail }
2076-
}
2077-
triggerEvent(elt, eventName, detail)
2061+
for (const eventName of Object.keys(triggers)) {
2062+
let detail = triggers[eventName]
2063+
if (isRawObject(detail)) {
2064+
// @ts-ignore
2065+
elt = detail.target !== undefined ? detail.target : elt
2066+
} else {
2067+
detail = { value: detail }
20782068
}
2069+
triggerEvent(elt, eventName, detail)
20792070
}
20802071
} else {
20812072
const eventNames = triggerBody.split(',')
@@ -2795,7 +2786,7 @@ var htmx = (function() {
27952786
const boostedSelector = ', [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]'
27962787

27972788
const extensionSelectors = []
2798-
for (const e in extensions) {
2789+
for (const e of Object.keys(extensions)) {
27992790
const extension = extensions[e]
28002791
if (extension.getSelectors) {
28012792
var selectors = extension.getSelectors()
@@ -3942,11 +3933,9 @@ var htmx = (function() {
39423933
} else {
39433934
varsValues = parseJSON(str)
39443935
}
3945-
for (const key in varsValues) {
3946-
if (varsValues.hasOwnProperty(key)) {
3947-
if (values[key] == null) {
3948-
values[key] = varsValues[key]
3949-
}
3936+
for (const key of Object.keys(varsValues)) {
3937+
if (values[key] == null) {
3938+
values[key] = varsValues[key]
39503939
}
39513940
}
39523941
}
@@ -4120,15 +4109,13 @@ var htmx = (function() {
41204109
function formDataFromObject(obj) {
41214110
if (obj instanceof FormData) return obj
41224111
const formData = new FormData()
4123-
for (const key in obj) {
4124-
if (obj.hasOwnProperty(key)) {
4125-
if (obj[key] && typeof obj[key].forEach === 'function') {
4126-
obj[key].forEach(function(v) { formData.append(key, v) })
4127-
} else if (typeof obj[key] === 'object' && !(obj[key] instanceof Blob)) {
4128-
formData.append(key, JSON.stringify(obj[key]))
4129-
} else {
4130-
formData.append(key, obj[key])
4131-
}
4112+
for (const key of Object.keys(obj)) {
4113+
if (obj[key] && typeof obj[key].forEach === 'function') {
4114+
obj[key].forEach(function(v) { formData.append(key, v) })
4115+
} else if (typeof obj[key] === 'object' && !(obj[key] instanceof Blob)) {
4116+
formData.append(key, JSON.stringify(obj[key]))
4117+
} else {
4118+
formData.append(key, obj[key])
41324119
}
41334120
}
41344121
return formData
@@ -4535,11 +4522,8 @@ var htmx = (function() {
45354522
if (requestAttrValues.noHeaders) {
45364523
// ignore all headers
45374524
} else {
4538-
for (const header in headers) {
4539-
if (headers.hasOwnProperty(header)) {
4540-
const headerValue = headers[header]
4541-
safelySetHeaderValue(xhr, header, headerValue)
4542-
}
4525+
for (const header of Object.keys(headers)) {
4526+
safelySetHeaderValue(xhr, header, headers[header])
45434527
}
45444528
}
45454529

0 commit comments

Comments
 (0)