资讯专栏INFORMATION COLUMN

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

zhjx922 / 2637人阅读

摘要:今天看在的条目的时候发现写了以下代码来测试了一下得到以下输出指定也被认为数组的该的元素被指定了值。的函数在这个元素未被赋值的时候,或者是被删除掉的时候不会被调用。不会影响原型链上的参考

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79585.html

相关文章

  • ES5-8 &amp; Polyfilling &amp; Transpilling

    ES7 includes() method Array.prototype.includes(target) determines whether an array includes a certain element, returning True or False as appropriate. String.prototype.includes(targetString) deter...

    chavesgu 评论0 收藏0
  • JavaScript中让x==1&&x==2&&x==3等式成立演示

      要是别人问您:如何让 x 等于 1 且让 x 等于 2 且让 x 等于 3 的等式成立?  咋地,知道如何实现?想骂人有不  现在我们一起来分解思路:  我们先来讲讲宽松相等== 和严格相等 ===,这两个都能用来判断两个值是否相等,但们明确上文提到的等于指的是哪一种,二者的区别看下:  (1) 这两个基础直接的区别:  (1.1) 不同类型间比较,== 比较转化成同一类型后的值看值是否相等,...

    3403771864 评论0 收藏0
  • JavaScript 中的 null undefined NaN 及 &amp;&amp; 与 ||

    摘要:提示函数通常用于检测和的结果,以判断它们表示的是否是合法的数字。与运算多个布尔类型相与,若其中存在一个及以上的,则结果为,否则为。 以下所用测试代码可以访问 RunJS 查看 undefined 与 null 如果定义一个变量却不赋值,则其默认等于 undefined: var foo; console.log(foo); // undefined 也可以对其赋值 undefined:...

    Chao 评论0 收藏0
  • useEffect中不能使用async缘由

      最近尝试在 useEffect 使用 async 的时候会报错,因此,本篇文章就是想喝大家说说为什么?也解读其中缘由。  具体代码分析  执行 mountEffect  当页面中使用 useEffect 的时候,会在初始化的时候执行 mountEffect 如下:  useEffect:function(create,deps){   currentHookNameInDev="us...

    3403771864 评论0 收藏0
  • js中的bool值转换及"&amp;&amp;" 、"||"

    摘要:如果左侧表达式的值为真值,则返回右侧表达式的值否则返回左侧表达式的值。遇到真爱就返回中运算符的运算法则如下返回遇到的第一个真值或者最后一个值。输出为将表达式进行强制转化为值的运算,运算结果为或者。 bool值转换 数据类型 bool值转化 undefined undefined 转化为 false Object null 转化为false,其他为 true Boole...

    hufeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<