竞猜排行 / 2026-07-12 07:19:22

先说结果, 请避免返回 null.

null 是如何产生的

根据 为何后端经常会将一个空数组返回为 null ? 帖子里描述的示例:

这个应该是后端代码不够严谨吧。比如后端可以加一个判断,如果 applies 是一个array,但是没有值,也需要用array,不能使用NULL 等。

测试代码:

$c;

$arr = array(

'status' => 1,

'data' => array(

'a' => 111,

'b' => array(),

'c' => $c,

'd' => (empty($c) ? array() : $c)

)

);

echo json_encode($arr);

输出

{

"status": 1,

"data": {

"a": 111,

"b": [],

"c": null,

"d": []

}

}

关于返回 null 的相关讨论

https://stackoverflow.com/questions/1274792/is-returning-null-bad-design

https://www.zhihu.com/question/282946327

https://segmentfault.com/q/1010000002903542

为什么不要返回 null

文章 不要再返回Null了 详细描述了原因. 认为:

Null值不应该由程序员在方法中返回,因为这样做,一是违背了方法名的语意。二是由于我们返回null值,更加增加了系统的不稳定性;因为在调用者忘记做null检查时,就一定会因为我们的方法出错。最后,null值所充斥的系统模型违反了OOP原则。

阿里巴巴 《Java开发手册》第十章《前后端规约》(第28页)明确规定:

【强制】前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合{}。 说明:此条约定有利于数据层面上的协作更加高效,减少前端很多琐碎的 null 判断。

对于便于前后端协作开发, 我们有了接口文档来规定数据的类型. 前端按规定的类型来操作数据, 例如 array 类型会进行递归遍历操作. 但不知道何时何地会或不会突然变成 null, 那这时候 null 的类型是 array 类型吗?

抛开 null 会造成语义和类型混乱这些问题, 在前端出会造成数据错误, 例如:

/**

* 获取数组的长度

* @param {array} arr 数组

* @returns {number}

*/

function getLength(arr = []) { // 前端已经做了默认值处理

return arr.length

}

getLength([1,2,3]) // 3

getLength(null) // 但还是导致程序崩溃 Uncaught TypeError: Cannot read property 'length' of null

/**

* 获取数据中两个整数的和

* @param {object} param0 {data: {a, b}}

* @param {number} param0.data.a 整数a

* @param {number} param0.data.b 整数b

* @returns {number}

*/

function add({data: {a = 0, b = 0}} = {}) { //

return parseInt(a) + parseInt(b)

}

add({data: {a: 1, b: 2}}) // 3

add({data: {a: null, b: 2}}) // NaN 不符合预取的 0+2

/**

* 获取两个对象的 key

* @param {*} param0 {obj1, obj2}

* @returns {array}

*/

function getKeys({obj1 = {}, obj2 = {}}) {

return Object.keys(obj1).concat(Object.keys(obj2))

}

getKeys({obj1: {a: 1}, obj2: {b: 2}}) // ["a", "b"]

getKeys({obj1: {}, obj2: {b: 2}}) // ["b"]

getKeys({obj1: undefined, obj2: {b: 2}}) // ["b"]

getKeys({obj1: undefined, obj2: {b: 2}}) // ["b"]

getKeys({obj2: {b: 2}}) // ["b"]

getKeys({obj1: null, obj2: {b: 2}}) // Uncaught TypeError: Cannot convert undefined or null to object

function getStr(str = ``) {

return str + `你好`

}

getStr(null) // "null你好"

参考:

为什么NULL是错误的?

Elegant Objects (Volume 1) 书中的 4.1 章节 Never return NULL

// JSON.parse(JSON.stringify({

// a: 1,

// b: undefined,

// c: {

// a: null,

// b: [null],

// c: {

// a: null,

// b: 134,

// }

// },

// }), (key, value) => {

// return value === null ? undefined : value

// }

// )

人民日报关注“打火机之乡”湖南邵东:好产品到哪里都会有好市场
和平精英转区官方指南,安全便捷迁移游戏数据全解析