这个话啥意思,函数实参为null,就说明该函数接受的不是对象?
虽然原贴是2014年写的http://www.ruanyifeng.com/blo...,不过确实让我想到一个比较蛋疼的情况:
众所周知,我们在编写一个函数的时候,可以给函数参数放上一个默认值:
function MyFunc(params = { a: 1 }) {
console.log("params is ", params);
}
我们以不同的方式调用MyFunc()
,如下:
// 一下两种调用会输出相同的结果
MyFunc(); // params is > { a: 1 }
MyFunc(undefined);
// 当参数为`null`时
MuFunc(null); // params is > null
我碰到这种最常见的情况就是,前后端交互时,后端因为没有undefined
这个值,经常会返回null
给我,于是就出现了下面的情况:
// 后端返回 { user: { id: 1, name: "张三", info: null } }
// 前端处理 user
function formatUserInfo(userInfo = {}) {
return userInfo.bio;
}
formatUserInfo(user.info); // 报错:Cannot read properties of null (reading 'bio')
formatUserInfo(user.info || {}); // undefined
所以"null 作为函数的参数,表示该函数的参数不是对象",可以理解成:调用函数时传入 null 作为参数,表示本次函数调用的参数没有值(没有内容)
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
JavaScript 设计者 Brendan Eich 设计 “无” 或者说是 “空” 这个概念的时候,思考处理的结果,没有什么特殊的含义。
一开始,他“借鉴”其他语言,统一用
null
表示空,但是呢,JavaScript 中设计了2种数据类型:引用数据类型 与 原始数据类型。他想玩点不一样的,创新嘛,给这两个数据类型设计“无”的值,把它们区分开来,于是灵机一动,给引用数据类型弄了个值“null”,给原始数据类型弄了个值“undefined”。“作为函数的参数,表示该函数的参数不是对象”——这句话如果翻译成:“作为函数的参数,表示该函数的参数不是一个有内容的对象”可能更好理解一点。
以上这些都算有内容的对象。
基于以上的“巧妙”的历史设计呢,其实还有些很有意思的东西:
000
,JavaScript中认为它是一个对象类型,溯源的话,这其实也没错,毕竟人家一开始就是被当成对象“借鉴”过来设计的。了解一下这些混乱的设计即可,大厦已经建立起来了,再去改地基不现实了,送你2张图,娱乐下,哈哈。

