它们的核心区别在于:判断“空”的标准不同。
1. lon: data.lon ?? 0 (空值合并运算符)
?? 运算符的逻辑是:只有当左侧的表达式的值为 null 或 undefined 时,才返回右侧的默认值。
换句话说,它对“空”的定义非常严格,只认 null 和 undefined。
工作原理:
- 如果
data.lon的值是null或者undefined,那么data.lon ?? 0的结果就是0。 - 否则,结果就是
data.lon本身的值。
示例:
let data;
// 情况 1: data.lon 是 undefined
data = { lon: undefined, lat: undefined };
console.log(data.lon ?? 0); // 输出: 0
// 情况 2: data.lon 是 null
data = { lon: null, lat: null };
console.log(data.lon ?? 0); // 输出: 0
// 情况 3: data.lon 是 0
data = { lon: 0, lat: 0 };
console.log(data.lon ?? 0); // 输出: 0 (因为 0 不是 null 或 undefined)
// 情况 4: data.lon 是 "" (空字符串)
data = { lon: "", lat: "" };
console.log(data.lon ?? 0); // 输出: "" (因为 "" 不是 null 或 undefined)
// 情况 5: data.lon 是 false
data = { lon: false, lat: false };
console.log(data.lon ?? 0); // 输出: false (因为 false 不是 null 或 undefined)
2. lat: data.lat || 0 (逻辑或运算符)
|| 运算符的逻辑是:当左侧的表达式的值为“ falsy”(假值)时,就返回右侧的默认值。
它对“空”的定义宽泛得多,只要值能被当作 false 来对待,它就认为是“空”。
JavaScript 中的 Falsy 值包括:
false0(数字零)-0(负零)0n(BigInt 零)""(空字符串)nullundefinedNaN(Not a Number)
工作原理:
- 如果
data.lat的值是上面列表中的任何一个,那么data.lat || 0的结果就是0。 - 否则,结果就是
data.lat本身的值。
示例:
let data;
// 情况 1: data.lat 是 undefined
data = { lon: undefined, lat: undefined };
console.log(data.lat || 0); // 输出: 0
// 情况 2: data.lat 是 null
data = { lon: null, lat: null };
console.log(data.lat || 0); // 输出: 0
// 情况 3: data.lat 是 0
data = { lon: 0, lat: 0 };
console.log(data.lat || 0); // 输出: 0 (因为 0 是 falsy 值)
// 情况 4: data.lat 是 "" (空字符串)
data = { lon: "", lat: "" };
console.log(data.lat || 0); // 输出: 0 (因为 "" 是 falsy 值)
// 情况 5: data.lat 是 false
data = { lon: false, lat: false };
console.log(data.lat || 0); // 输出: 0 (因为 false 是 falsy 值)
总结与对比
|
运算符 |
判断标准 |
左侧值为 |
左侧值为 |
左侧值为 |
适用场景 |
|
|
仅 |
返回 |
返回 |
返回右侧值 |
优先推荐,用于获取可能为 |
|
` |
` |
任何 falsy 值 |
返回右侧值 |
返回右侧值 |
对你的代码的分析
你的代码 lon: data.lon ?? 0, lat: data.lat || 0 存在一个潜在的不一致性:
- 对于
lon:如果data.lon的值是0,最终结果会是0(这通常是正确的,因为经度可以是 0)。 - 对于
lat:如果data.lat的值是0,最终结果会是0(这通常是正确的,因为纬度可以是 0)。
但是,如果 data.lon 是 "",你的代码会接受它作为经度值,而如果 data.lat 是 "",则会被替换为 0。这可能导致潜在的 bug。
最佳实践
在处理像经纬度这样的数值类型时,几乎总是应该使用 ?? 0。因为:
0是一个有效的地理坐标(赤道或本初子午线),不应该被随意替换。- 你通常只希望在坐标未定义(即
null或undefined)时,才提供一个默认值0。
因此,更稳健和一致的写法是:
const result = {
lon: data.lon ?? 0,
lat: data.lat ?? 0
};

6009

被折叠的 条评论
为什么被折叠?



