微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript 未捕获的类型错误:无法将 undefined 或 null 转换为对象

如何解决JavaScript 未捕获的类型错误:无法将 undefined 或 null 转换为对象

我有个问题,

// case 1
const stack = [];
[1,2,3].forEach(stack.push);

这会抛出错误

Uncaught TypeError: Cannot convert undefined or null to object
    at push (<anonymous>)
    at Array.forEach (<anonymous>)
    at <anonymous>:1:9

不过这样就好了,

// case 2
const stack = [];
[1,3].forEach(element => stack.push(element));
console.log(stack); // [1,3]

如果你用 this 来绑定堆栈,引用它自己,

// case 3
const stack = [];
[1,3].forEach(stack.push.bind(stack));
console.log(stack); // (9) [1,Array(3),1,3,Array(3)]

它也有其他作用。

这些怎么会发生?方法(案例 1)和箭头函数(案例 2)有什么区别?

解决方法

stack.push 引用 Array.prototype.push。这:

const stack = [];
[1,2,3].forEach(stack.push);

不起作用,因为它相当于:

const stack = [];
[1,3].forEach(Array.prototype.push);

const callback = Array.prototype.push;
callback(1,[1,3]);
callback(2,1,3]);
callback(3,3]);

这不起作用,因为没有要推送到的数组的 this 上下文。

方法 2 之所以有效,是因为您正在执行 => stack.push(element) - .push 是使用 stack 的调用上下文调用的,而不是作为回调传递的 stack.push。 (当作为回调传递时,调用上下文会丢失,除非你绑定函数,你在第三个方法中这样做)。

再举个例子:

const obj = {
  fn() {
    console.log('fn. this is:',this);
  }
};

const callback = obj.fn;
// this does not refer to the object now:
callback();

// but this will:
obj.fn();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。