我有以下代码:
arr = ["abc", "def", "ghi", "jkl"]
arr2 = ["abc", "def", "ghi", "jkl"]
$(arr).each(function(){
thiselem = this;
$(arr2).each(function(){
if(thiselem == "abc" && this == "abc")
alert("case 1");
if(thiselem == this)
alert('case 2');
});
});
当我运行此命令时,仅弹出“情况 1”。从逻辑上讲,这个语句通过传递属性应该是正确的,所以我猜测这是一些 JavaScript 字符串语法问题或者 jQuery 范围的事情搞砸了。如有任何建议,我们将不胜感激。
最佳答案
其他发帖者建议了解决方法,我将尝试回答为什么您的原始代码不起作用的问题。答案相当重要,并揭示了一些值得注意的 javascript 陷阱。
jQuery.each
使用 apply将 this
传递给其回调。当 apply 的参数是原始值(如字符串)时,它将被“装箱”,即转换为对象(具体来说,String
对象):
console.log(typeof("cat")) // string
logger = function() { console.log(typeof(this)) }
logger.apply("cat") // object
现在考虑以下事项:
a = ["abc"]
b = ["abc"]
$(a).each(function() {
var that = this
$(b).each(function() {
console.log(this == that) // false!
})
})
虽然 a[0] 和 b[0] “显然”相等,但 ==
运算符返回 false,因为两者都是对象,并且两个对象变量只有在物理上相同时才相等目的。另一方面,这按预期工作:
a = ["abc"]
b = ["abc"]
$(a).each(function() {
console.log(this == "abc") // true
console.log(this == b[0]) // true
})
当 JS 将对象与字符串进行比较时,会使用 toString
将对象转换为字符串原语。由于 this
是一个 String 对象,因此它的 toString
返回组成它的原始字符串,如果两个原始字符串的字符相等,则它们相等。
关于javascript - jquery字符串比较变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10900796/