是一个我们在 JavaScript 开发中都遇到过的可怕错误。或许是某个 API 返回了意料外的空值,又或许是其它什么原因,这个错误是如此的普遍而广泛以至于我们无法判断。...不论什么原因,放着这个错误不处理都会是灾难性的。所以我们该怎么从源头阻止这个问题发生呢? 让我们一起来找出解决方案。...使用 && 短路 JavaScript 里有一个关于逻辑运算符的有趣事实就是它不总是返回布尔值。根据说明,『&& 或者 || 运算符的返回值并不一定是布尔值。而是两个操作表达式的其中之一。』...运算符的左侧计算值为 null 或者 undefined,则整个表达式会返回 undefined 并且右侧不会被计算。 为了有一个自定义的默认值,我们可以使用 || 运算符以应对未定义的情况。...然而,如果你不来自未来,那么你有更多需要考虑的。你在使用工具库吗?你的对象嵌套有多深?你是否需要指定默认值?我们需要根据不同的场景采用不同的方法。
准备深入了解吗?无论你是编写脚本多年还是刚开始JavaScript之旅,让我们携手共进,一起解开this的神秘面纱!...}; greet.call(person, “Hello”); // “Hello, Alice” bind返回一个带有绑定上下文的新函数,但不立即执行它。...箭头函数就像你拥有的那个最喜欢的工具 —— 超级有用,但不适合每一项工作。当你想保持 this不变时,尤其是在回调中,它们是非常有价值的。但是当你需要一些灵活性时?经典函数可能是你的朋友。...你在一个网页上,你最喜欢的歌正在播放,有一个按钮在那里诱惑你点击它。在你知道之前,JavaScript的魔法就活了起来,事情开始发生。但你有没有想过内部工作,使这些DOM元素跳舞的隐藏的木偶线?...这不会按预期工作。 总结:“this”之旅的终点 我们已经走过了一段漫长的旅程,探索了JavaScript中 this 关键字的各个方面。
我害怕 JavaScript 的原因,主要是因为很难理解为什么它会以这种方式工作。...将近一年半之后,我才有了信心了,慢慢理解JavaScript的工作方式,希望您在阅读本文后也会更加理解JavaCript。...如果您想过滤数组中的虚假值,这里有一个提示。只需在过滤器函数中提供布尔值即可。...它对数组进行排序,对吗?嗯,不完全是。...11、typeOf 运算符 typeOf 是一个一元运算符,它返回一个字符串,表示变量的原始类型。我们知道 JavaScript 主要的对象,所以在大多数情况下,这会返回 object 。
那么究竟什么是JavaScript的原型?好吧,简单地说,JavaScript中的每个函数都有一个引用对象的prototype属性。 对吗?亲自测试一下。...我们采取的缓慢,有条理的方法有什么好处,现在可以深入了解JavaScript中新关键字的内容。 回顾一下我们的Animal构造函数,最重要的两个部分是创建对象并返回它。...但是,我们只使用常规的旧JavaScript函数来重新创建相同的功能,而不是使用class关键字。当然,它需要一些额外的工作以及一些关于JavaScript引擎运行的知识,但结果是一样的。...但是,如果我们有一个对Class很重要但不需要跨实例共享的方法呢?例如,如果我们有一个函数接受一个Animal实例数组并确定下一个需要接收哪一个呢?我们将其称为nextToEat。...它的工作原理如下 object instanceof Class 如果object是Class的实例,则上面的语句将返回true,否则返回false。回到我们的动物示例,我们会有类似的东西。
阻塞事件循环 任何花费太长时间才能将控制权返回给事件循环的 JavaScript 代码,都会阻塞页面中任何 JavaScript 代码的执行,甚至阻塞 UI 线程,并且用户无法单击浏览、滚动页面等。...你知道在调试器或浏览器控制台中可能熟悉的错误堆栈跟踪吗?...此时,调用堆栈如下所示: 每次迭代中的事件循环都会查看调用堆栈中是否有东西并执行它直到调用堆栈为空: 入队函数执行 上面的示例看起来很正常,没有什么特别的:JavaScript 查找要执行的东西,并按顺序运行它们...例如,如果将 setTimeout 的超时设置为 2 秒,但不必等待 2 秒,等待发生在其他地方。...有个游乐园中过山车的比喻很好:消息队列将你排在队列的后面(在所有其他人的后面),你不得不等待你的回合,而工作队列则是快速通道票,这样你就可以在完成上一次乘车后立即乘坐另一趟车。
有一些检测方法很接近,但你不能完全相信它们。 JavaScript原生函数 在JavaScript中,原生函数指的是其源代码已经被编译进原生机器码的函数。...通过对原生函数进行猴子补丁,它的toString()将停止返回"[native code]"字符串,而是返回字符串化的函数体。...isNativeFunction(window.fetch); // → false 这种方法在大多数情况下都能正常工作。...但这值得吗?你真的能覆盖所有的边缘情况吗? 从iframe中抓取干净函数 如果你需要调用一个"干净"函数,而不是检查一个原生函数是否被猴子补丁过,另一个潜在的选择是从一个同源的iframe中抓取它。...否则,考虑到JavaScript的动态性质,你可以使用简单的toString().includes("[native code]")检查,或者添加大量的安全检查来覆盖大多数(但不是全部)边缘情况。
BOM使JavaScript能够与浏览器进行交互,而不仅仅是操作网页内容。它包括多个对象,最常用的有: Window:代表整个浏览器窗口,也是JavaScript全局对象的代名词。...if (window.confirm("你确定要继续吗?"))...; window.confirm() 显示一个确认框,用户点击“确定”返回true,点击“取消”返回false。 window.confirm("您确认吗?")...page=1"); history.replaceState() 修改当前历史记录条目的URL,但不会重新加载页面。...以上就是关于【前端基础篇】JavaScript之BOM介绍的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️
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 [] 这是多重继承吗?不是。 ?
前言 今天下午,在我们微信群里,学弟突然发出来这样一个图: 我点开一看,这不是函数声明跟函数表达式的知识点吗?前一阵子还看过相关文章。 看了几眼,我说到:「第一个输出应该是最后的函数声明」 然后呢?...❝如果你不知道为什么调用函数可以在函数声明之前,看这里: 是因为javascript代码是一段一段预载的,在一段代码预载完成后,会把函数声明提前到代码段的前面执行,以便在代码段的任何地方调用,所以前面的代码无错...这是因为有「多个函数声明的时候,是由最后的函数声明来替代前面的」 ❝这也是我上文中读了几眼代码直接说第一个输出为最后的函数声明的原因!...这是什么原因呢?...(foo) 经过了上面的复习,我们知道,JavaScript会将函数声明提前,所以我们来整理一下这段代码: function method(foo){ function foo() { console.log
阅读链接:面试分享:两年工作经验成功面试阿里 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 的区别和关联?
” “JavaScript 中检测数据类型的方法有哪些你知道吗?...“如果我就想用 instanceof 检测原始类型,你能满足我的需求吗? ” 好,满足。 虽然 instanceof 不能检测原始类型,但是有一种方法可以让其用于检测原始类型。...(arr, RegExp)) // false 要理解 instanceof 的工作原理,就必须理解原型链,对 JavaScript 原型链掌握的不够深刻的同学可以戳下面链接学习。...JavaScript深入之从原型到原型链[3] 如何回答面试中的JavaScript原型链问题[4] “constructor 怎么样,好用吗?...如果你觉得哪里有遗漏,欢迎在评论区补充。 最后一个易老师的问题留给大家: “你,喜欢 JavaScript 吗?
新的 dynamic import 语法看起来像一个函数(但不是),它返回 promise,这也意味着可以将其与 async/await一起使用。...,该运算符的工作原理与其类似,但仅在初始值为 null 或 undefined 时才赋值为右手。...const tags = [...tweet.matchAll(/(#\w+)/g)] matchAll 返回一个迭代器。...Promise.allSettled 还记得 Promise.all 函数吗?它仅在所有的 Promise 均得到解决时才会被解决。...中,总是有一个包含所有内容的大型上下文对象。
在本文中,我将向你展示 12 个你可能从未使用过或觉得学习 JavaScript很有趣的功能。 1 、短循环 你知道在 JavaScript 中你可以在一行中缩短循环吗?...JavaScript length方法调整数组的大小吗?...中我们有很多方法可以使用 Date 方法来获取日期吗?...因为我们有更好的方法来做同样的工作。使用include方法而不是indexOf返回布尔值的结果。...//True console.log(array.includes("C#")) // false 10、重定向到 URL JavaScript 有一些方法可以在你执行代码后,将你重定向到浏览器中的网站
JavaScript 是一种非常优秀的编程语言,但与此同时,它也常常让我感到困惑。...有时我真的想不通它是如何工作的,看完这5个奇怪的问题,你就知道我为啥这么说了,你知道这些古怪问题的正确答案吗? 我们现在开始吧。 1、为什么“false == []”和“false == !...[]”都返回true? 朋友们,请不要惊讶这确实是正确答案。 只要我们有了相等比较和相同的知识,我们就能完全理解它是怎么一回事了。...console.log(false == []) // true console.log(false == ![]) // true 让我简要解释一下它是如何工作的。...const fn = () => {} console.log(fn()) // ? 请问‘{}’是最终结果吗? 不幸的是,这不是我们想象的那样。未定义的是最后的赢家。
JavaScript 真的有那么糟糕,以至于没有更简单的方法来完成同样的事情吗?正如你可能已经猜到的那样,现在已经有了,它是通过使用new关键字来实现的。...当然,它需要一些额外的工作以及了解一些 JavaScript “底层” 发生的事情,但结果是一样的。 这是个好消息。 JavaScript 不是一种死语言。 TC-39委员会不断改进和补充。...在另一篇文章中,我们将研究如何利用这些基本原理,并使用它们来理解JavaScript中的继承是如何工作的。...只要有一个特定于类本身的方法,但不需要在该类的实例之间共享,就可以将其定义为类的静态属性。...它的工作方式如下 object instanceof Class 如果 object 是Class的实例,则上面的语句将返回 true,否则返回 false。
let str = ' Hello JavaScript '; str.trimLeft(); //'Hello JavaScript ' str.trimRight(); //' Hello JavaScript...如果你想提高所有级别,你可以写一个更大的数字,但不建议这样做。该 flatMap () 方法首先使用 map 函数映射每个元素,然后将结果展平到一个新数组中。...当左操作数为 null 或未定义时,它返回右操作数。否则,它返回左边的操作数。 const str = null ??...返回未定义 let obj = {}; console.log(obj.person.name) // Cannot read properties of undefined (reading 'name...(entries); console.log(object); 对你有用吗?
尤其是有了 NodeJS 之后,JavaScript 更是无孔不入。 Atwood 定律:“任何可以使用 JavaScript 来编写的应用,最终会由 JavaScript 编写。”...即便如此,JavaScript 还是有一些鲜为人知的特性和技巧,不太常见,但是非常有用。本文不打算介绍那些稀奇古怪的特性,因为除了作为茶余饭后的谈资,没什么卵用实际用途。...逗号操作符让多个表达式按顺序执行,并返回最后一个表达式的值。这有什么用呢?可以让代码更简洁。...有一道很常见的面试题,就是数组去重问题。当然,面试题的本意可能不是让你直接用 Set,而是自己实现去重的逻辑。但是在实际工作中用来去重,它不香吗?...不是说不能用,但是如果只是少数地方用了少数几个 API,比如简单的格式化,有必要引入一个库吗?再说了,如果碰到一些自定义需求,API 不支持怎么办?
2. void 运算符的“秘密” 你可能见过 void 运算符,很多人都知道它返回 undefined,但你知道吗?这只是其中的一个方面,它背后其实有个不为人知的秘密。...比方说,你正在开发一个网站,需要在某个地方打印出“欢迎回来”,但又不希望这个打印操作返回任何值。正常情况下,console.log() 会打印出内容,但它实际上会返回 undefined。...void console.log("欢迎回来"); // 打印 "欢迎回来",但是返回 undefined 那么,void 是怎么工作的呢?...void 运算符的作用是“评估一个表达式,但不返回其值”。换句话说,它执行了 console.log("欢迎回来") 这个操作,让它正常输出,但却不会返回任何值。...想象一下,你有一个简单的函数,它的作用是打印“Hello”。在常规情况下,这个函数只会返回一个字符串:“Hello”。但如果你想赋予这个函数一些“个性”,也就是给它加上一些额外的属性呢?
在 JavaScript 中,闭包会随着函数的创建而被同时创建 确实不是很好理解,那么我来通俗讲一下。...但是这里面也没有修改函数 只有一个获取函数,它可以返回对象内属性的值。 我们通过这个函数可以得到对象内属性的值。...像这样 console.log(o.get('valueOf')()); //不过结果报错了 并没有获取到,能看出是什么原因嘛,如果不能看出。...//修改试题中的获取函数,就能获取到结果,现在能看出什么原因了嘛。...//我们只需要执行就能得到原对象, 也就是return obj['getThis'] 函数内返回的this就是obj,这样就得到了对象。
type=single'); const json = await res.json(); console.log(json.joke); } 这将以与我们之前的代码完全相同的方式工作。...让我们更详细地看一下这个问题,因为更好地理解内部发生的事情将对理解async/await的工作方式有很大帮助。...一旦promise是fulfilled或者rejected,但不是pending,它也被认为是settled。...还记得这个错误吗?...总结 在这篇文章中,我们研究了如何使用async/await来管理你的JavaScript程序的控制流。我们讨论了语法、async/await如何工作、错误处理,以及一些问题。
领取专属 10元无门槛券
手把手带您无忧上云