Array.prototype.map() & null & undefined & delete

今天看Array.prototype.map() 在 MDN 的條目的時候發現javascript

callback is invoked only for indexes of the array which have assigned values, including undefined. It is not called for missing elements of the array (that is, indexes that have never been set, which have been deleted or which have never been assigned a value).java

寫了如下代碼來測試了一下數組

var a1 = new Array(1);
var a2 = [null];
var a3 = [undefined];

var a4 = [2];
delete a4[0];

var container = [a1,a2,a3,a4];

var container2 = new Array(4);
for (var i = 0, len = container2.length; i < len; i++) {
    container2[i] = container[i].map( (val) => {
    return 1;
    });
    console.log(container2[i]);
    console.log("---");
}

獲得如下輸出函數

[  ]
---
[ 1 ]
---
[ 1 ]
---
[  ]
---

指定 null 也被認爲數組的該 index 的元素被指定了值。
Array.prototype.map()callback 函數在這個元素未被賦值的時候,或者是被刪除掉的時候不會被調用。測試

container.forEach((item, i) => {
    var array = `a` + (i + 1);
    console.log(`${array}[0] === null :`, item[0] === null);
    console.log(`${array}[0] === undefined :`, item[0] === undefined);
    console.log("---");
});

獲得prototype

a1[0] === null : false
a1[0] === undefined : true
---
a2[0] === null : true
a2[0] === undefined : false
---
a3[0] === null : false
a3[0] === undefined : true
---
a4[0] === null : false
a4[0] === undefined : true
---

爲何 a1 和 a3 的結果不同,和 a4 又有什麼聯繫呢?指針

var x = new Array(2) vs var y = [undefined,undefined]

前者 Creates an array with undefined pointers.var x = new Array(2) 就等於 var x = [ , ]
後者 creates an array with pointers to 3 undefined objects,也就是說,這些指針並非 undefined 只是他們指向 undefined
其實 var u = undefined 也被認爲是賦予了值code

new Array(2) 建立一個長度爲 2 的,可是沒有 properties 的數組。[undefined,undefined] 返回一個長度爲 2 的,有 2 個 properties 的數組(分別叫作 "0", "1" 的,值爲 "undefined""undefined"ip

console.log( 0 in x);
// false
console.log( 0 in y);
// true

delete a.x vs a.x = undefined

a = {
    x: 'boo'
};

兩種操做的結果是不一樣的,可是不能用===來判斷
兩種操做都會獲得element

a.x === undefined
// true

應該使用:

// If you want inherited properties
'x' in a

// If you don't want inherited properties
a.hasOwnProperty('x')

delete 刪除的是引用而不是 object 自己

http://stackoverflow.com/questions/742623/deleting-objects-in-javascript

從原型鏈上來講
delete a.x 以後調用 a.x 會從原型鏈上尋找 x
a.x = undefined 以後不會,會直接返回 undefined

var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x  = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype

delete 只會在 extended.hasOwnProperty("x")) 返回 true 的時候起做用,而且會使得 extended.hasOwnProperty("x")) 返回 false
delete 不會影響原型鏈上的 properties

var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype

參考:
delete a.x vs a.x = undefined
JavaScript 「new Array(n)」 and 「Array.prototype.map」 weirdness

相關文章
相關標籤/搜索