2015-09-07 88 views
2

此代码是在Mozilla开发者网络上给出的Array.prototype.map的polyfill。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapJavascript中对象的长度属性有什么用?

// Production steps of ECMA-262, Edition 5, 15.4.4.19 
// Reference: http://es5.github.io/#x15.4.4.19 
if (!Array.prototype.map) { 

    Array.prototype.map = function(callback, thisArg) { 

    var T, A, k; 

    if (this == null) { 
     throw new TypeError(' this is null or not defined'); 
    } 

    // 1. Let O be the result of calling ToObject passing the |this| 
    // value as the argument. 
    var O = Object(this); 

    // 2. Let lenValue be the result of calling the Get internal 
    // method of O with the argument "length". 
    // 3. Let len be ToUint32(lenValue). 
    var len = O.length >>> 0; 

    // 4. If IsCallable(callback) is false, throw a TypeError exception. 
    // See: http://es5.github.com/#x9.11 
    if (typeof callback !== 'function') { 
     throw new TypeError(callback + ' is not a function'); 
    } 

    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. 
    if (arguments.length > 1) { 
     T = thisArg; 
    } 

    // 6. Let A be a new array created as if by the expression new Array(len) 
    // where Array is the standard built-in constructor with that name and 
    // len is the value of len. 
    A = new Array(len); 

    // 7. Let k be 0 
    k = 0; 

    // 8. Repeat, while k < len 
    while (k < len) { 

     var kValue, mappedValue; 

     // a. Let Pk be ToString(k). 
     // This is implicit for LHS operands of the in operator 
     // b. Let kPresent be the result of calling the HasProperty internal 
     // method of O with argument Pk. 
     // This step can be combined with c 
     // c. If kPresent is true, then 
     if (k in O) { 

     // i. Let kValue be the result of calling the Get internal 
     // method of O with argument Pk. 
     kValue = O[k]; 

     // ii. Let mappedValue be the result of calling the Call internal 
     //  method of callback with T as the this value and argument 
     //  list containing kValue, k, and O. 
     mappedValue = callback.call(T, kValue, k, O); 

     // iii. Call the DefineOwnProperty internal method of A with arguments 
     // Pk, Property Descriptor 
     // { Value: mappedValue, 
     // Writable: true, 
     // Enumerable: true, 
     // Configurable: true }, 
     // and false. 

     // In browsers that support Object.defineProperty, use the following: 
     // Object.defineProperty(A, k, { 
     // value: mappedValue, 
     // writable: true, 
     // enumerable: true, 
     // configurable: true 
     // }); 

     // For best browser support, use the following: 
     A[k] = mappedValue; 
     } 
     // d. Increase k by 1. 
     k++; 
    } 

    // 9. return A 
    return A; 
    }; 
} 

我不明白的是这两条线 -

变种O =对象(this);

var len = O.length >>> 0;

有人可以向我解释这个吗?什么是一个对象的调用长度属性(它已经成为一个数组后,通过'this'后,我想),然后零填充右移它0?

+0

它是该对象中存在的元素的总数no –

+1

这是许多问题的副本,请使用搜索。 – Nit

+0

您能否在这里评论其他问题的链接? –

回答

3

显然,它需要长度才能迭代数组的元素。

你并不需要担心Object(this)。如果这是一个数组,它什么都不做。这种类型的编码是处理某些不是数组的对象。例如,我可以调用map作为Array.prototype.map.call(5, function() { }),它将工作(返回[])。在这种情况下,您想知道的行将变成一个对象,其length属性我可以检查(虽然在那种情况下它不存在; >>> 0成语会将undefined转换为0)。