我正在浏览peepcode jQuery示例(https://peepcode.com/products/jquery),我选择更新所有依赖项。
毫不奇怪,我遇到了一个关于javascript中字符串文字和String对象之间差异的问题(这里有很好的讨论:Why are there two kinds of JavaScript strings?)
我遇到的一个问题是jQuery.each将字符串文字转换为String对象,而jQueryUI方法removeClass无法正确处理。以下是修复此问题的代码段。
我想知道错误是在jQuery.each中错误地将字符串文字转换为String对象还是removeClass假设它可以获得字符串文字或字符串对象。
更新:我刚刚意识到这是另一种解决方法: Strings in array are no longer strings after jQuery.each()
以下是代码:
jQuery.fn.extend({
taskStates:["task-empty", "task-x", "task-apostrophe", "task-dash"],
resetTaskStateClassNames: function() {
var elements = this;
// Commented code breaks as "this" becomes the String object not the literal
// and removeClass does not check for String Object
// jQuery.each(jQuery.fn.taskStates, function(){
// elements.removeClass(this); // this is the taskState
// })
jQuery.fn.taskStates.forEach( function(ts) {
elements.removeClass(ts);
});
return this;
},
答案 0 :(得分:2)
这与jQuery无关。非严格模式下this
的值被强制转换为对象,就像Object(this)
一样。
http://es5.github.com/#x10.4.3
10.4.3输入功能代码#Ⓣ
当控件进入函数对象F中包含的函数代码的执行上下文,调用者提供thisArg和调用者提供的argumentsList时,执行以下步骤:
- 如果功能代码是严格代码,请将 ThisBinding 设置为 thisArg 。
- 如果 thisArg 为
null
或undefined
,则将 ThisBinding 设置为全局对象。- 如果 Type(thisArg)不是对象,则将 ThisBinding 设置为
ToObject(thisArg)
。- 否则将 ThisBinding 设置为 thisArg 。
醇>
答案 1 :(得分:0)
这是可行的jQuery代码段。我猜自从截屏视频制作以来,API(http://api.jquery.com/jQuery.each/)发生了变化。
jQuery.each(jQuery.fn.taskStates, function(index, value){
elements.removeClass(value); // this is the taskState as a string literal
})
除了你可以在对象属性或数组上使用jQuery.each之外,我没有看到任何优于简单地使用javascript forEach