为什么我的字符串开头有“未定义”文本?

IT技术 javascript
2021-02-24 14:40:02

我有一个函数将来自 AJAX 请求的结果连接在一起。

出于某种原因,我的最后一个字符串以“undefined”开头。

这是一个重现问题的简化示例:

    // In practice, fetched via AJAX from a server
    var vendors = [{ id_vendor: 'V0001' }, { id_vendor: 'V0002' }];

    var row_vendor;

    vendors.forEach(function (value) {
      row_vendor += value.id_vendor;
    });
	
    alert(row_vendor); // undefinedV0001V0002

为什么警报值显示前导“未定义”?

3个回答

你没有初始化你的变量,所以它的值是undefined. 连接字符串会将其强制转换"undefined"为连接之前的字符串。

考虑:

var x
alert(x + "test") // undefinedtest

相反,在执行串联之前将变量初始化为空字符串:

var x = ""
alert(x + "test") // test

请注意,从功能上讲,首先提取您感兴趣的属性然后将join它们简单地放在一起要干净得多

$.map(vendor, function (v) { return v.vendor_id }).join('')

您的row_vendor变量未分配初始值,因此它开始时undefined使用其+=运算符连接字符串结果undefined成为字符串"undefined"(加上"v0001")。声明它时,只需将其设置为空字符串:

var row_vendor = "";

问题出在这条线上

$.each(vendor, function(i, value) {
  row_vendor += value.id_vendor;
});

为了row_vendor用于连接目的,您首先必须为其分配一个默认值。所以你需要做的是:

var row_vendor = ""; // set it to empty string by default
$.each(vendor, function(i, value) {
   row_vendor += value.id_vendor;
});

在旁注中,您还可以使用数组连接字符串。我更喜欢这种方式,因为它更漂亮和可读。

var row_vendor = []; // empty array
$.each(vendor, function(i, value) {
   row_vendor.push(value.id_vendor);
});
console.log(row_vendor.join(",")); // this will separate each value with a comma