Feeds:
文章
留言

Archive for 三月 10th, 2009

今天需要使用 $.each( ) 出現我預期之外的結果,如下測試碼:

var a = [‘a’];
    // ok
    //$.each(a, function(i, val) {
    //    alert(‘Test#1 >> ‘ + i + ‘:’ + val);
    //});

    a[a.length] = ‘b’;
    // ok
    //$.each(a, function(i, val) {
    //    alert(‘Test#2 >> ‘ + i + ‘:’ + val);
    //});

    a[2] = ‘c’;
    // ok
    //$.each(a, function(i, val) {
    //    alert(‘Test#3 >> ‘ + i + ‘:’ + val);
    //});

    a[‘3’] = ‘d’;
    // ok
    //$.each(a, function(i, val) {
    //    alert(‘Test#4 >> ‘ + i + ‘:’ + val);
    //});

    a[‘four’] = ‘e’;
    // fail: skip a[‘four’]
    $.each(a, function(i, val) {
        alert(‘Test#5 >> ‘ + i + ‘:’ + val);
    });

    var b = [];
    b["one"] = 1;
    b["two"] = 2;

    $.each(b, function(i, val) {
        // fail: no run here
        alert(‘Test#6 >> ‘ + i + ‘:’ + val);
    });

我不太確定這是否為 Bug,不過我已經回報給 jQuery #4319 ,屆時就知道是否為 Bug…

不過從 jquery 原始碼來看,這個問題主要在於他使用 length 屬性來判斷是否為 Array,如下:

if ( length === undefined ) {
    for ( name in object )
        if ( callback.call( object[ name ], name, object[ name ] ) === false )
            break;
} else
    for ( var value = object[0];
        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}

可是關聯式陣列有 length 但卻不會增加,導致 each 無法正常運作

Read Full Post »