1

实际上我想创建一个简单的数组度假村。

var preSelected = "13_335 14_555";
var arrayClasses = preSelected.split(' ');
var arrayClassesSorted = new Array();

$.each(arrayClasses, function() {
//var elCount = $("li."+ this).size();
elCount = 20 ...... ;
arrayClassesSorted[elCount] = this;
    ....
});

结果应该是一个看起来像这样的数组(如果没有 li 类,计数器不起作用...):

Array (
  [20] => 14_555
)

但我得到的结果是这样的:

[20] => Array
    (
        [0] => 1
        [1] => 4
        [2] => _
        [3] => 5
        [4] => 5
        [5] => 5
)

现在我想知道,为什么“this”会为这个数组创建第二个维度。

如果把它放入 String(this),它的工作。但在这种情况下,这真的是“这个”的预期结果吗?

4

1 回答 1

3

我认为这只是控制台向您显示的内容,它实际上并不意味着您有一个二维数组。不要把你看到的一切都当作真理。

您正在分配一个字符串对象而不是字符串原语,并且控制台将该对象视为类似数组的对象,因为它具有 a.length和数字属性。

以下是 Chrome 控制台为字符串对象和字符串原语打印的内容:

> console.log(new String('foo'));
  String {0: "f", 1: "o", 2: "o"}
  undefined
> console.log('foo');
  foo
  undefined

您应该始终避免使用字符串对象,因为它们会导致意外行为:

> new String('foo') === 'foo'
  false

更好地分配原始值:

$.each(arrayClasses, function(val) {
    //var elCount = $("li."+ this).size();
    elCount = 20 ...... ;
    arrayClassesSorted[elCount] = val;
    ....
});

“字符串对象从何而来?” 你可能会问。

您正在分配this给数组:

arrayClassesSorted[elCount] = this;

并且this将始终是一个对象(原始值被转换为对象),除非函数在严格模式下运行 [MDN]

于 2013-02-27T13:47:36.783 回答