JQuery.each将字符串文字转换为字符串。为什么?

时间:2012-01-09 03:50:03

标签: javascript jquery jquery-ui

我正在浏览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;
    },

2 个答案:

答案 0 :(得分:2)

这与jQuery无关。非严格模式下this的值被强制转换为对象,就像Object(this)一样。

http://es5.github.com/#x10.4.3

  

10.4.3输入功能代码#Ⓣ

     

当控件进入函数对象F中包含的函数代码的执行上下文,调用者提供thisArg和调用者提供的argumentsList时,执行以下步骤:

     
      
  1. 如果功能代码是严格代码,请将 ThisBinding 设置为 thisArg
  2.   
  3. 如果 thisArg nullundefined,则将 ThisBinding 设置为全局对象。
  4.   
  5. 如果 Type(thisArg)不是对象,则将 ThisBinding 设置为ToObject(thisArg)
  6.   
  7. 否则将 ThisBinding 设置为 thisArg
  8.   

答案 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