首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

避免那些可恶的cannot read property of undefined 错误

是一个我们在 JavaScript 开发中都遇到过的可怕错误。或许是某个 API 返回了意料外的空值,又或许是其它什么原因,这个错误是如此的普遍而广泛以至于我们无法判断。...不论什么原因,放着这个错误不处理都会是灾难性的。所以我们该怎么从源头阻止这个问题发生呢? 让我们一起来找出解决方案。...使用 && 短路 JavaScript 里有一个关于逻辑运算符的有趣事实就是它不总是返回布尔值。根据说明,『&& 或者 || 运算符的返回值并不一定是布尔值。而是两个操作表达式的其中之一。』...运算符的左侧计算值为 null 或者 undefined,则整个表达式会返回 undefined 并且右侧不会被计算。 为了有一个自定义的默认值,我们可以使用 || 运算符以应对未定义的情况。...然而,如果你不来自未来,那么你有更多需要考虑的。你在使用工具库吗?你的对象嵌套有多深?你是否需要指定默认值?我们需要根据不同的场景采用不同的方法。

15.7K20

一劳永逸地搞懂 JavaScript中‘this’

准备深入了解吗?无论你是编写脚本多年还是刚开始JavaScript之旅,让我们携手共进,一起解开this的神秘面纱!...}; greet.call(person, “Hello”); // “Hello, Alice” bind返回一个带有绑定上下文的新函数,但不立即执行它。...箭头函数就像你拥有的那个最喜欢的工具 —— 超级有用,但不适合每一项工作。当你想保持 this不变时,尤其是在回调中,它们是非常有价值的。但是当你需要一些灵活性时?经典函数可能是你的朋友。...你在一个网页上,你最喜欢的歌正在播放,有一个按钮在那里诱惑你点击它。在你知道之前,JavaScript的魔法就活了起来,事情开始发生。但你有没有想过内部工作,使这些DOM元素跳舞的隐藏的木偶线?...这不会按预期工作。 总结:“this”之旅的终点 我们已经走过了一段漫长的旅程,探索了JavaScript中 this 关键字的各个方面。

14310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript原型-进阶者指南

    那么究竟什么是JavaScript的原型?好吧,简单地说,JavaScript中的每个函数都有一个引用对象的prototype属性。 对吗?亲自测试一下。...我们采取的缓慢,有条理的方法有什么好处,现在可以深入了解JavaScript中新关键字的内容。 回顾一下我们的Animal构造函数,最重要的两个部分是创建对象并返回它。...但是,我们只使用常规的旧JavaScript函数来重新创建相同的功能,而不是使用class关键字。当然,它需要一些额外的工作以及一些关于JavaScript引擎运行的知识,但结果是一样的。...但是,如果我们有一个对Class很重要但不需要跨实例共享的方法呢?例如,如果我们有一个函数接受一个Animal实例数组并确定下一个需要接收哪一个呢?我们将其称为nextToEat。...它的工作原理如下 object instanceof Class 如果object是Class的实例,则上面的语句将返回true,否则返回false。回到我们的动物示例,我们会有类似的东西。

    1.3K50

    Node.js的事件循环

    阻塞事件循环 任何花费太长时间才能将控制权返回给事件循环的 JavaScript 代码,都会阻塞页面中任何 JavaScript 代码的执行,甚至阻塞 UI 线程,并且用户无法单击浏览、滚动页面等。...你知道在调试器或浏览器控制台中可能熟悉的错误堆栈跟踪吗?...此时,调用堆栈如下所示: 每次迭代中的事件循环都会查看调用堆栈中是否有东西并执行它直到调用堆栈为空: 入队函数执行 上面的示例看起来很正常,没有什么特别的:JavaScript 查找要执行的东西,并按顺序运行它们...例如,如果将 setTimeout 的超时设置为 2 秒,但不必等待 2 秒,等待发生在其他地方。...有个游乐园中过山车的比喻很好:消息队列将你排在队列的后面(在所有其他人的后面),你不得不等待你的回合,而工作队列则是快速通道票,这样你就可以在完成上一次乘车后立即乘坐另一趟车。

    2.7K20

    检查原生 JavaScript 函数是否被覆盖

    有一些检测方法很接近,但你不能完全相信它们。 JavaScript原生函数 在JavaScript中,原生函数指的是其源代码已经被编译进原生机器码的函数。...通过对原生函数进行猴子补丁,它的toString()将停止返回"[native code]"字符串,而是返回字符串化的函数体。...isNativeFunction(window.fetch); // → false 这种方法在大多数情况下都能正常工作。...但这值得吗?你真的能覆盖所有的边缘情况吗? 从iframe中抓取干净函数 如果你需要调用一个"干净"函数,而不是检查一个原生函数是否被猴子补丁过,另一个潜在的选择是从一个同源的iframe中抓取它。...否则,考虑到JavaScript的动态性质,你可以使用简单的toString().includes("[native code]")检查,或者添加大量的安全检查来覆盖大多数(但不是全部)边缘情况。

    59520

    JavaScript 的花式玩法

    JavaScript 是一个伟大的语言。它有简单的语法,完善的生态系统,更重要的,有一个庞大的社区。 ? 同时我们都知道,JavaScript 是一个有很多有趣的“潜规则”的语言。...例如: 1 + 1 // -> 2 // ->表示 console.log 或着其他什么输出。例如: console.log('hello, world!') // > hello, world!...在 'falseundefined'里取到了索引为10. []为真,但不是true 数组为真值,但是它不等于true。 !!...这个问题是众所周知的,这里有一个名为0.30000000000000004.com的网站。它发生在使用浮点数的每种语言中,而不仅仅是JavaScript。...惊讶吗? ?说明: 这是多重继承吗? 看下面的例子: new (class F extends (String, Array) { }) // -> F [] 这是多重继承吗?不是。 ?

    1.5K50

    学弟的一张图,让我重学了一遍函数声明和函数表达式!

    前言 今天下午,在我们微信群里,学弟突然发出来这样一个图: 我点开一看,这不是函数声明跟函数表达式的知识点吗?前一阵子还看过相关文章。 看了几眼,我说到:「第一个输出应该是最后的函数声明」 然后呢?...❝如果你不知道为什么调用函数可以在函数声明之前,看这里: 是因为javascript代码是一段一段预载的,在一段代码预载完成后,会把函数声明提前到代码段的前面执行,以便在代码段的任何地方调用,所以前面的代码无错...这是因为有「多个函数声明的时候,是由最后的函数声明来替代前面的」 ❝这也是我上文中读了几眼代码直接说第一个输出为最后的函数声明的原因!...这是什么原因呢?...(foo) 经过了上面的复习,我们知道,JavaScript会将函数声明提前,所以我们来整理一下这段代码: function method(foo){ function foo() { console.log

    36020

    手撕钉钉前端面试题

    阅读链接:面试分享:两年工作经验成功面试阿里 P6 总结[2] - 了解 Event Loop 吗? 9、ES6 Modules 相对于 CommonJS 的优势是什么?...#### 59、 React 如何发现重渲染、什么原因容易造成重渲染、如何避免重渲染? #### 60、 React Hook 中 useEffect 有哪些参数,如何检测数组依赖项的变化?...两者在一起工作时会产生问题吗? #### 106、如何有效的识别 ESLint 和 Prettier 可能产生冲突的格式规则?如何解决此类规则冲突问题?...#### 111、VS Code 配置中的用户和工作区有什么区别? #### 112、VS Code 的插件可以只对当前项目生效吗? #### 113、你所知道的测试有哪些测试类型?...#### 122、Cookie 可以在服务端生成吗?Cookie 在服务端生成后的工作流程是什么样的? #### 123、Session、Cookie 的区别和关联?

    3K21

    假如易立竞问你如何判断 JavaScript 中的数据类型?

    ” “JavaScript 中检测数据类型的方法有哪些你知道吗?...“如果我就想用 instanceof 检测原始类型,你能满足我的需求吗? ” 好,满足。 虽然 instanceof 不能检测原始类型,但是有一种方法可以让其用于检测原始类型。...(arr, RegExp)) // false 要理解 instanceof 的工作原理,就必须理解原型链,对 JavaScript 原型链掌握的不够深刻的同学可以戳下面链接学习。...JavaScript深入之从原型到原型链[3] 如何回答面试中的JavaScript原型链问题[4] “constructor 怎么样,好用吗?...如果你觉得哪里有遗漏,欢迎在评论区补充。 最后一个易老师的问题留给大家: “你,喜欢 JavaScript 吗?

    49860

    面试官:为什么“false == ”都返回true?

    JavaScript 是一种非常优秀的编程语言,但与此同时,它也常常让我感到困惑。...有时我真的想不通它是如何工作的,看完这5个奇怪的问题,你就知道我为啥这么说了,你知道这些古怪问题的正确答案吗? 我们现在开始吧。 1、为什么“false == []”和“false == !...[]”都返回true? 朋友们,请不要惊讶这确实是正确答案。 只要我们有了相等比较和相同的知识,我们就能完全理解它是怎么一回事了。...console.log(false == []) // true console.log(false == ![]) // true 让我简要解释一下它是如何工作的。...const fn = () => {} console.log(fn()) // ? 请问‘{}’是最终结果吗? 不幸的是,这不是我们想象的那样。未定义的是最后的赢家。

    97010

    JavaScript 原型的深入指南

    JavaScript 真的有那么糟糕,以至于没有更简单的方法来完成同样的事情吗?正如你可能已经猜到的那样,现在已经有了,它是通过使用new关键字来实现的。...当然,它需要一些额外的工作以及了解一些 JavaScript “底层” 发生的事情,但结果是一样的。 这是个好消息。 JavaScript 不是一种死语言。 TC-39委员会不断改进和补充。...在另一篇文章中,我们将研究如何利用这些基本原理,并使用它们来理解JavaScript中的继承是如何工作的。...只要有一个特定于类本身的方法,但不需要在该类的实例之间共享,就可以将其定义为类的静态属性。...它的工作方式如下 object instanceof Class 如果 object 是Class的实例,则上面的语句将返回 true,否则返回 false。

    1.1K20

    自从知道了这几个 JavaScript 技巧,下班都变早了!

    尤其是有了 NodeJS 之后,JavaScript 更是无孔不入。 Atwood 定律:“任何可以使用 JavaScript 来编写的应用,最终会由 JavaScript 编写。”...即便如此,JavaScript 还是有一些鲜为人知的特性和技巧,不太常见,但是非常有用。本文不打算介绍那些稀奇古怪的特性,因为除了作为茶余饭后的谈资,没什么卵用实际用途。...逗号操作符让多个表达式按顺序执行,并返回最后一个表达式的值。这有什么用呢?可以让代码更简洁。...有一道很常见的面试题,就是数组去重问题。当然,面试题的本意可能不是让你直接用 Set,而是自己实现去重的逻辑。但是在实际工作中用来去重,它不香吗?...不是说不能用,但是如果只是少数地方用了少数几个 API,比如简单的格式化,有必要引入一个库吗?再说了,如果碰到一些自定义需求,API 不支持怎么办?

    41520

    2024即将结束,看看这10个你可能错过的JavaScript怪异现象

    2. void 运算符的“秘密” 你可能见过 void 运算符,很多人都知道它返回 undefined,但你知道吗?这只是其中的一个方面,它背后其实有个不为人知的秘密。...比方说,你正在开发一个网站,需要在某个地方打印出“欢迎回来”,但又不希望这个打印操作返回任何值。正常情况下,console.log() 会打印出内容,但它实际上会返回 undefined。...void console.log("欢迎回来"); // 打印 "欢迎回来",但是返回 undefined 那么,void 是怎么工作的呢?...void 运算符的作用是“评估一个表达式,但不返回其值”。换句话说,它执行了 console.log("欢迎回来") 这个操作,让它正常输出,但却不会返回任何值。...想象一下,你有一个简单的函数,它的作用是打印“Hello”。在常规情况下,这个函数只会返回一个字符串:“Hello”。但如果你想赋予这个函数一些“个性”,也就是给它加上一些额外的属性呢?

    7310
    领券