js基础知识点

JavaScript组件包括DOM、BOM和ECMAScript。
DOM和BOM用于操作浏览器环境,ECMAScript是JavaScript的核心语言规范。
在JavaScript执行的三个步骤中,函数声明优先于变量声明。
当声明一个函数时,它的定义立即提升到全局范围。
栈遵循LIFO(先进后出)原则,新添加或删除的元素都放置在栈顶。
主要存储基本类型变量和对象引用,例如数组。
队列遵循FIFO(先进先出)原则,新元素在末尾,旧元素在开头。
用于存储基本类型变量和对象引用。
作用域定义了变量和函数的可访问范围,分为全局作用域和局部作用域。
变量和函数在全局作用域中公开,并且只能在本地作用域中访问本地作用域的变量和函数。
分配和操作字符串包括原始类型和包装类型。
基本类型,如数字、字符串等。
没有属性或方法。
操作过程中会创建对应的包装类型对象。
预编译涉及在全局范围内创建全局对象,提升变量和函数,然后将它们存储在全局变量中。
此过程包括四个步骤,涉及初始化和提升变量和函数。
每次执行函数时都会创建一个执行环境,并且具有唯一的上下文。
一旦执行完成,环境就会被破坏,作用域链包含函数运行时所有活动的对象。
更改范围字符串的方法位于JavaScript引擎访问的内部[[Scope]]属性中,该属性包含函数内的对象集合。
块级作用域通过解析函数创建AO上下文。
提升变量和函数驻留在变量环境中,块作用域变量存储在词法环境的单独区域中。
词法环境的内部结构维护了一个用于查找变量的小堆栈。
ES6引入了let和const关键字,提供了JavaScript块级作用域并提高了代码的可读性和可维护性。

[译]“移除对象属性”能告诉我们哪些JavaScript知识点

删除对象的属性可能不是JavaScript中最有趣的事情,但是以多种方式实现它可以让您深入了解JavaScript的基础知识。
在本文中,我们将探讨每项技术,并从参赛者的答案中揭示JavaScript的本质。
一组玩家被要求完成使对象1和对象2相似的任务。
这是一个简单的任务,只需删除匹配的object2的c属性即可。
然而,玩家们给出的答案却截然不同。
让我们仔细看看每种方法。
玩家A:“我将c设置为未知。
”在JavaScript中,访问不存在的属性将返回未知。
将属性设置为未定义可能看起来会从对象中删除该属性,但事实并非如此。
当我尝试运行它时,我发现一个重要的细节:Premier未定义,但仍然存在于对象内。
此方法实际上修改属性值而不是删除它。
玩家B:“你使用了delete操作符。
”delete作符专门用于删除对象的属性,如果删除成功则返回true。
但是,在使用删除运算符之前应考虑一些注意事项。
首先,从数组中删除一个元素会留下一个空槽,并且length属性不会更新,这可能会导致意外行为。
其次,当您使用delete运算符删除嵌套对象的属性时,您经常会错误地认为该对象的内存被释放,但事实并非如此。
参与者C:“我使用代理对象Proxy来删除一个属性。
”代理对象Proxy提供了一种在对象的常见操作过程中注入逻辑的法。
定义一个拦截器,通过处理程序对象修改原始操作。
您可以使用代理和deleteProperty拦截器记录已删除的属性。
但是,如果处理程序不返回值,严格模式将引发错误。
玩家D:“我使用对象结构来避免突变。
”对象结构是一种赋值语法,允许您从对象中提取属性。
这可以让您避免由对象突变引起的潜在副作用。
这种方法对于处理某些特殊情况特别有用,例如删除具有未定义值的属性。
玩家E:“我使用了JSON.stringify和JSON.parse。
”通过将属性重新分配给unknown,您可以使用JSON.stringify()来跳过无效值并删除该属性。
然后使用JSON.parse()将JSON文本解析回JavaScript对象。
这种方法的一个限制是JSON.stringify()不支持函数和BigInt值,并且在发生循环引用时可能会抛出错误。
参赛者F:“我们公司依赖Lodash。
”Lodash.js、Underscore.js、Ramda等实用程序。
该库提供了从对象中删除或选择属性的方法。
每个库都有详细的文档。
回到原来的场景,哪个玩家的答案是正确的?将属性设置为未定义并不是删除对象属性的合理方法。
每个方法背后都有对JavaScript的深入了解,包括内存管理、垃圾收集、代理、JSON和对象修改。
即使是看似无聊和琐碎的任务也能揭示编程和JavaScript的丰富性。

JavaScript知识点系列之Call、Apply、Bind

大家好,欢迎来到猿猴镇,今天我们来看看JavaScript中处理函数上下文的三个主要方法:call、apply和bind。
它们在改变这个指标方面都有各自的特点,下面我们就来揭秘它们的功能和使用场景。

Call&Apply

Call和apply允许您在特定上下文中调用函数,但调用接受两个参数:目标对象和参数集。
但调用参数的处理是有限制的,如果参数超过JS核心规定的65535个,可能会丢失部分数据。

要解决这个问题,您可以使用call或apply来扩展Math.max或min等内置函数,例如借用它们来处理数组大小。

可以通过比较对象的toString结果来检查对象是否是数组,但这种方法取决于toString对象的具体实现。

Bind

bind方法使用指定的上下文(this值)创建一个新函数,但不会立即执行它。
这对于预设该值很有用,例如实现类似数组的对象传递或构造函数继承。

模拟实现

尽管我们在这里不详细介绍模拟实现,但它们可用于为特定场景提供这种灵活控制。

概述与参考

深入理解调用、应用、绑定的基本原理,将有助于你在实际编程中更好地处理函数上下文。
如需更深入的研究,您可以查看以下资源:

更多详情:[更多链接]

感谢您的阅读,请点赞分享,您的支持是我的动力前进的动力。
更多前沿知识请关注我们的公众号:猿猴镇。