var submitting = false;
window.addEventListener("beforeunload", function (event) {
console.log('checking form');
let inputValue = document.querySelector('#myInput').value;
if(inputValue.length > 0 && submitting === false) {
console.log(inputValue);
event.returnValue = 'Are you sure you wish to leave?';
}
event.preventDefault();
});
document.addEventListener("submit", function(event) {
submitting = true;
});
在第一张照片上,它看起来如下:
const expected_keys: String[] = [
"q",
"w",
"e",
"r",
"t",
"y"
];
export function lint(data: any): object {
var working_keys: String[] = [];
var linted_data: any = {};
for (let key in data) {
console.log(key); // Print 1
if (expected_keys.includes(key)) {
working_keys.push(key);
}
}
console.log(working_keys); // Print 2
for (let key in working_keys) {
console.log(key); // Print 3
linted_data[working_keys[key]] = data[working_keys[key]];
}
return linted_data;
}
在第二张纸上,它也是qwerty。但是,对于第三次打印,我得到的索引是0-5而不是qwerty。为什么是这样?这两个数组都具有相同类型的q
w
e
r
t
y
。与String[]
有关系吗?
获取以下数据:
push()
为什么出现以下错误,但打字稿仍然可以按预期编译并运行?
{
"q": "info",
"w": "info",
"e": "info",
"r": "info",
"t": "info",
"y": "info",
}
答案 0 :(得分:3)
for...in
语法遍历对象的属性。
您的第三次遍历是遍历数组的属性,这些属性实际上是数组中各项的索引。
如果您希望key
的值成为数组的一项,则应使用for...of
语法或working_keys.forEach
来代替。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
答案 1 :(得分:3)
首先:如果您像working_keys
这样访问Array迭代器,更好的方法是使用for .. of
循环
第二件事:尝试使用defineProperty
构造函数定义对象属性,如下所示:
Object.defineProperty(linted_data, key, { value: data });
最后:我想可能是打字稿类型设置存在问题,所以您将String对象用作键而不是纯基本文字字符串,也许简单的转换可能会解决问题:
linted_data[working_keys[key].toString()] = data[working_keys[key]];
答案 2 :(得分:1)
打印1正在记录对象的键。打印2正在记录string[]
。
打印3正在记录string[]
(0-5)的键。
如果您希望Print 3记录字符串数组的值,请使用for (let key of working_keys)
。重要的区别是 of ,而不是 in 。
for..of与for..in语句for..of和for..in语句 遍历列表;尽管迭代的值不同, for..in返回要迭代的对象上的键的列表,而 for..of返回列表的数值属性的值 对象被迭代。