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

本日看Array.prototype.map() 在 MDN 的条目的时刻发明

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).

写了以下代码来测试了一下

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("---");
});

获得

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 也被以为是给予了值

new Array(2) 建立一个长度为 2 的,然则没有 properties 的数组。[undefined,undefined] 返回一个长度为 2 的,有 2 个 properties 的数组(离别叫做 "0", "1" 的,值为 "undefined""undefined"

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

delete a.x vs a.x = undefined

a = {
    x: 'boo'
};

两种操纵的效果是差别的,然则不能用===来推断
两种操纵都邑获得

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

    原文作者:vanisseg
    原文地址: https://segmentfault.com/a/1190000005589761
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞