Javascript数组并将它们赋值给变量,但第一个值为未定义.为什么
Javascript Array and assign them to variable, but first value as undefined. why?
在JS中使用Array创建无序列表时,第一个值是未定义的。
var list; //box for accumulating list tags
var arr = ['menu1', 'menu2', 'menu3', 'menu4'];
for(var i = 0; i < arr.length; i++) {
list += '<li>' + arr[i] + '</li>';
}
document.getElementById('menu').innerHTML = list;
结果:<ul id="menu">
undefined
<li>menu1</li>
<li>menu2</li>
<li>menu3</li>
<li>menu4</li>
</ul>
但是一开始赋空值就可以了
var list = "";
所以我想知道它们的区别是什么
如果这个问题是多余的,我很快就会删除它。
感谢您的来访。
不,错误在这里
list +=
假设list之前有某个值,但在第一次运行时没有,并且未定义,这就是为什么第一行未定义。您应该在那里添加一个检查来赋值,而不是在第一次迭代时进行连接。
不像其他地方建议的那样用空字符串初始化列表(用空字符串连接没有任何意义),您应该真正使用
for(var i = 0; i < arr.length; i++) {
if(i==0)
list = '<li>' + arr[i] + '</li>';
else
list += '<li>' + arr[i] + '</li>';
}
在JavaScript中,值在初始化之前是未定义的。
让我们通过例子来分析这些情况,以便更清楚地说明。
引用未声明的变量
在JavaScript中,你必须在引用一个变量之前声明它。例如,
var x;
console.log(x);
如果你只输入下面的代码,就会出现引用错误。
console.log(x);
引用未初始化变量
使用var
关键字声明变量后,它可以用于任何表达式,但初始值为undefined
。例如
var x;
x === undefined; // true
通过给一个值来给一个变量类型
一旦你给一个变量一个值,或者给它一个新的值,你本质上让解释器知道了变量的值和类型。例如, 在JavaScript中,如果表达式是混合类型,解释器将强制其中一个值为另一个值的类型。 类型强制转换在所有表达式上执行,而不仅仅是var x;
typeof x; // undefined
x = 1;
typeof x; // number
x = 'a';
typeof x // string
混合类型表达式
var x = 1;
var y = 'a';
z = x + y; // '1a'
typeof z // string
+
,并且并不总是直接的。例如,[] == false // true
问题部分
这是因为当你定义一个变量&不要初始化,它将未定义。
var list; //list is undefined here
所以当你第一次说
的时候list += arr[i]
基本上就是
list = undefined + arr[0];
所以最后的输出将是
'undefined<li>...'
<标题> 工作部分你在说
var list = '';
第一次是
list = '' + arr[0];
所以最后的输出将是
'<li>...'
标题>声明list
变量时指定空字符串
当你使用list+=
时,意味着你已经在列表变量中有了值,但是你没有
var list=""; //box for accumulating list tags
var arr = ['menu1', 'menu2', 'menu3', 'menu4'];
for(var i = 0; i < arr.length; i++) {
// here is `list` is undefined when loop execute first time
list += '<li>' + arr[i] + '</li>';
}
document.getElementById('menu').innerHTML = list;
JS是一种动态语言,所以如果你只是定义一个var,没有办法知道它将是哪种类型。如果您使用var list = "";
,则是另一种情况。您显式地告诉类型将是字符串,并且连接将以所需的方式运行!
这是因为当您像这样定义变量时:
var list;
是undefined
。要解决这个问题,只需使其为空字符串,正如您所说的。
var list = "";
正如几个答案已经提到的。当您将undefined
变量与字符串连接时,undefined
将变成字符串'undefined' + ...
。
- 为什么当我上传文件并点击更多上传另一个文件的第一个删除
- 为什么 .on() 方法不执行第一个处理程序
- 为什么在文本框内按回车键,单击第一个按钮并提交表单
- 为什么嵌入式下拉列表只选择第一个选项
- 为什么第一个将其视为布尔值,其次不将其视为布尔值
- 为什么在给出第一个结果后仍然调用此方法
- 基于第一个淘汰教程,为什么我的代码没有运行
- 为什么只有我的切换列表的第一个案例工作正常
- 为什么我的第一个标签出现在饼图后面
- 为什么不't此循环返回到第一个索引
- jQuery函数:为什么第一个事件的完成延迟到第二个事件完成
- 为什么是Backbone.Collection为第一个查看器显示了两次
- 为什么当我调用 Meteor.setTimeout() 时,我后续的 Meteor 方法调用不会等待第一个方法完成
- 为什么选择只显示IE 9中选项文本的第一个字符
- 为什么.replace 方法使用正斜杠字符将第一个参数括起来
- 为什么第一个日期没有添加到数组中
- 为什么我只能在嵌套闭包链的第一个实例中声明变量
- 为什么 CSS 选择器只设置第一个匹配 svg 路径的样式
- 为什么扩展必须是mootools类定义中的第一个属性
- 为什么 AJAX 对第一个函数的响应“_blank”有效,但对第二个函数无效