为什么我需要一个有点聪明的运算符来访问最后一个数组元素?
Why do I need a bit wise Operator to access the last array element?
我有下面的代码,它应该像这样在数组中找到两个字符串之间的交集 ["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"]
它应该给出结果:1,4,13
function FindIntersection(strArr) {
const firstArr = strArr[0].split(", ");
const secondArr = strArr[1].split(", ");
let newArr = [];
let i = 0;
let j = 0;
while(i < firstArr.length && j < secondArr.length) {
let a = firstArr[i] | 0;
let b = secondArr[j] | 0;
if(a === b) {
newArr.push(a);
i++;
j++;
} else if(a > b) {
j++;
} else if (b > a) {
i++;
}
}
strArr = newArr.join(",");
return strArr;
}
当我不使用按位运算符时 | 0
为什么不能正确访问数组中的最后一个元素?
按位运算符是如何解决这个问题的?
您不需要显式位运算符,只需将其转换为整数即可。如评论中所述,这只是触发将字符串转换为整数的一种方式。
typeof('str' | 0) === 'number'
但这很糟糕,对吧,因为 'str'
可能存在错误。我会更明确地使用:
let a = parseInt(firstArr[i], 10);
如果它不是有效的整数,那将是 return NaN
,而 NaN === NaN
是 false
,所以你不会不小心将它添加到 [=16] =].
明确地说,您不是使用按位运算符访问数组元素,而是使用 i
和 j
中的数字访问元素,然后您使用按位或将元素转换为数字。
将数字字符串转换为数字的其他几种方法:
"3" | 0 -> 3
"3" * 1 -> 3
+"3" -> 3
parseInt("3") -> 3
它可以将字符串转换为数字,parseInt 也可以工作
function FindIntersection(strArr) {
const firstArr = strArr[0].split(", ");
const secondArr = strArr[1].split(", ");
let newArr = [];
let i = 0;
let j = 0;
while(i < firstArr.length && j < secondArr.length) {
let a = parseInt(firstArr[i]);
let b = parseInt(secondArr[j]);
if(a === b) {
newArr.push(a);
i++;
j++;
} else if(a > b) {
j++;
} else if (b > a) {
i++;
}
}
strArr = newArr.join(",");
return strArr;
}
通过使用 Number 对象,这种方式也有效
function FindIntersection(strArr) {
const firstArr = strArr[0].split(", ");
const secondArr = strArr[1].split(", ");
let newArr = [];
let i = 0;
let j = 0;
while(i < firstArr.length && j < secondArr.length) {
let a = Number(firstArr[i]);
let b = Number(secondArr[j]);
if(a === b) {
newArr.push(a);
i++;
j++;
} else if(a > b) {
j++;
} else if (b > a) {
i++;
}
}
strArr = newArr.join(",");
return strArr;
}
console.log(FindIntersection(["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"]));
我有下面的代码,它应该像这样在数组中找到两个字符串之间的交集 ["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"]
它应该给出结果:1,4,13
function FindIntersection(strArr) {
const firstArr = strArr[0].split(", ");
const secondArr = strArr[1].split(", ");
let newArr = [];
let i = 0;
let j = 0;
while(i < firstArr.length && j < secondArr.length) {
let a = firstArr[i] | 0;
let b = secondArr[j] | 0;
if(a === b) {
newArr.push(a);
i++;
j++;
} else if(a > b) {
j++;
} else if (b > a) {
i++;
}
}
strArr = newArr.join(",");
return strArr;
}
当我不使用按位运算符时 | 0
为什么不能正确访问数组中的最后一个元素?
按位运算符是如何解决这个问题的?
您不需要显式位运算符,只需将其转换为整数即可。如评论中所述,这只是触发将字符串转换为整数的一种方式。
typeof('str' | 0) === 'number'
但这很糟糕,对吧,因为 'str'
可能存在错误。我会更明确地使用:
let a = parseInt(firstArr[i], 10);
如果它不是有效的整数,那将是 return NaN
,而 NaN === NaN
是 false
,所以你不会不小心将它添加到 [=16] =].
明确地说,您不是使用按位运算符访问数组元素,而是使用 i
和 j
中的数字访问元素,然后您使用按位或将元素转换为数字。
将数字字符串转换为数字的其他几种方法:
"3" | 0 -> 3
"3" * 1 -> 3
+"3" -> 3
parseInt("3") -> 3
它可以将字符串转换为数字,parseInt 也可以工作
function FindIntersection(strArr) {
const firstArr = strArr[0].split(", ");
const secondArr = strArr[1].split(", ");
let newArr = [];
let i = 0;
let j = 0;
while(i < firstArr.length && j < secondArr.length) {
let a = parseInt(firstArr[i]);
let b = parseInt(secondArr[j]);
if(a === b) {
newArr.push(a);
i++;
j++;
} else if(a > b) {
j++;
} else if (b > a) {
i++;
}
}
strArr = newArr.join(",");
return strArr;
}
通过使用 Number 对象,这种方式也有效
function FindIntersection(strArr) {
const firstArr = strArr[0].split(", ");
const secondArr = strArr[1].split(", ");
let newArr = [];
let i = 0;
let j = 0;
while(i < firstArr.length && j < secondArr.length) {
let a = Number(firstArr[i]);
let b = Number(secondArr[j]);
if(a === b) {
newArr.push(a);
i++;
j++;
} else if(a > b) {
j++;
} else if (b > a) {
i++;
}
}
strArr = newArr.join(",");
return strArr;
}
console.log(FindIntersection(["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"]));