今天看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