声明" undefined"之间的区别是什么?价值和未申报" undefined"值?

时间:2016-06-13 03:57:55

标签: javascript

有人可以解释第一个例子和第二个例子之间的区别吗?

声明" undefined"之间的区别是什么?价值和未申报" undefined"值?

代码

var arr = new Array(4);
arr[0] = "a";
arr[1] = "b";
arr[2] = undefined; //insert undefined here!
arr[3] = "d";
console.log("arr[2] is " + arr[2]); //yes, it is undefined!

arr.forEach(function(value, index) {
    console.log(index + ":" + value);
})

console.log("====================")

var arr = new Array(4);
arr[0] = "a";
arr[1] = "b";
//I don't insert undefined to arr[2] in this case.
arr[3] = "d";
console.log("arr[2] is " + arr[2]); //yes, it is undefined!

arr.forEach(function(value, index) {
    console.log(index + ":" + value);
})

日志

arr[2] is undefined
0:a
1:b
2:undefined
3:d
====================
arr[2] is undefined
0:a
1:b
3:d

附加示例

var arr = new Array(4);
arr[0] = "a";
arr[1] = "b";
arr[2] = undefined; //insert undefined here!
arr[3] = "d";
console.log("arr[2] is " + arr[2]); //yes, it is undefined!

var i = 0;
var max = arr.length;
for(i; i < max; i++) {
console.log(i + ":" + arr[i]);
}

console.log("====================")

var arr = new Array(4);
arr[0] = "a";
arr[1] = "b";
//I don't insert undefined to arr[2] in this case.
arr[3] = "d";
console.log("arr[2] is " + arr[2]); //yes, it is undefined!

var i = 0;
var max = arr.length;
for(i; i < max; i++) {
console.log(i + ":" + arr[i]);
}   

日志

arr[2] is undefined
0:a
1:b
2:undefined
3:d
====================
arr[2] is undefined
0:a
1:b
2:undefined
3:d

2 个答案:

答案 0 :(得分:2)

  

有人可以解释第一个例子和第二个例子之间有什么区别吗?

在第一个例子中:

var arr = new Array(4);

创建一个长度为4的数组,它没有元素。

然后使用直接赋值为索引0到3分配一个值:

arr[0] = "a";
arr[1] = "b";
arr[2] = undefined; //insert undefined here!
arr[3] = "d";

创建属性0到3. undefined 分配给arr[2] forEach 遍历存在的元素,因此您可以看到所有4个元素的结果,每个元素都有一个值。

在第二个示例中,您没有为arr[2]分配值。当访问对象的不存在的属性(注意Arrays是Objects)时,返回 undefined 值,例如

var obj = {};
console.log(obj.foo) // undefined

使用 forEach 循环遍历属性时,不会访问不存在的属性,因此arr[2]没有输出。这与 for 循环形成对比,循环通常被编写为访问从0到length - 1的所有属性,因此返回该范围内所有属性的值,无论它们是否存在。

答案 1 :(得分:0)

JavaScript数组不是常识中的数组。在大多数语言中,数组(a.k.a.向量)是内存中的连续区域。但在JS中,它们是相当稀疏的容器 - 某些元素可能不存在。

事实上,JS中的数组只是对象(键/值映射),区别在于允许使用整数键:

var arr = {}; // object (key/value map), not array, sic!
arr[0] = "a";
arr[1] = "b"; 
// arr[2] deliberately omitted
arr[3] = "d";
console.log("arr[2] is " + arr[2]); // it is undefined

您甚至可以向JS数组添加非整数键:

var arr = [];
arr[0] = 0;
arr["zero"] = "zero";

这证明数组是引擎盖下的对象。

当您尝试从不存在的键的容器(对象或数组)值获取时,它返回undefined值。通过ECMAScript规范。

arr[2] = undefined将该值分配给键2.

delete arr[2]删除该密钥及其值。