“null 作为函数的参数,表示该函数的参数不是对象”,如何理解?

image.png

这个话啥意思,函数实参为null,就说明该函数接受的不是对象?

阅读 3.1k
3 个回答

JavaScript 设计者 Brendan Eich 设计 “无” 或者说是 “空” 这个概念的时候,思考处理的结果,没有什么特殊的含义。
一开始,他“借鉴”其他语言,统一用 null 表示空,但是呢,JavaScript 中设计了2种数据类型:引用数据类型 与 原始数据类型。他想玩点不一样的,创新嘛,给这两个数据类型设计“无”的值,把它们区分开来,于是灵机一动,给引用数据类型弄了个值“null”,给原始数据类型弄了个值“undefined”。
“作为函数的参数,表示该函数的参数不是对象”——这句话如果翻译成:“作为函数的参数,表示该函数的参数不是一个有内容的对象”可能更好理解一点。

const obj1 = {}
const obj2 = {name:'segmentfault'}

以上这些都算有内容的对象。


基于以上的“巧妙”的历史设计呢,其实还有些很有意思的东西:

  1. null 这个值本身啊,其实被归为原始数据类型,但是它是用来表述“空”对象的
  2. typeof null 的值是'object',老生常谈的一个现象了,因为 null 的存值是低3位是 000,JavaScript中认为它是一个对象类型,溯源的话,这其实也没错,毕竟人家一开始就是被当成对象“借鉴”过来设计的。

了解一下这些混乱的设计即可,大厦已经建立起来了,再去改地基不现实了,送你2张图,娱乐下,哈哈。

e7117f1dcf813f1298de4d5eecedda0.jpg

这里语义应该是指该函数参数没有值

虽然原贴是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 作为参数,表示本次函数调用的参数没有值(没有内容)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题