经常有同学面对这样一个面试题:JavaScript 中 0.1 + 0.2 === 0.3 吗?答案是 false。...诡异的问题 实际上,不光是 JavaScript,只要是基于IEEE 754标准的语言,都会有这个问题。...实际上,正确的姿势是使用JavaScript 提供的最小精度值: Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON // true 复制代码 检查等式左右两边差的绝对值是否小于最小精度
version=23389"/> 加参数的静态资源有两种可能: 第一、脚本并不存在,而是服务端动态生成的。 因此带上版本号,以示区别。...第二、客户端会缓存这些CSS或JS文件,每次更新了 JS 或 CSS 文件后,改变版本号,客户端浏览器就会重新下载新的JS或CSS文件,起到刷新缓存的作用。...原理: 例如 .htaccess 设置的 CSS、JS 缓存都有一个过期时间,如果在访客的浏览器中已经缓存了这些文件,在这些缓存未过期之前,浏览器只会优先从缓存中读取这些 CSS 和 JS 文件,如果你在服务器上修改了这些文件...如原先 HTML 中的 CSS 调用语句如下: 注意:部分代理缓存服务器不会缓存网址中包含 "?" 的资源,所以方法二可能会导致你原先的缓存功能失效,可以改用第一种方法。
在前面的文章中,我们已经从运行时的角度了解过 JavaScript 的知识内容,在接下来的几节课,我们来了解一下 JavaScript 的文法部分。...概述 我们先来看一看 JavaScript 的词法定义。JavaScript 源代码中的输入可以这样分类: 1. WhiteSpace 空白字符 2. LineTerminator 换行符 3....(或称) 是 U+0009,是缩进 TAB 符,也就是字符串中写的 \t ; 2. 是 U+000B,也就是垂直方向的 TAB 符 \v,这个字符在键盘上很难打出来,所以很少用到; 3. ...是 U+000C,Form Feed,分页符,字符串直接量中写作 \f ,现代已经很少有打印源程序的事情发生了,所以这个字符在 JavaScript 源代码中很少用到; 4. ...这个字符也叫做“bit order mark”; 此外,JavaScript 支持所有的 Unicode 中的空格分类下的空格,我们可以看下表: 很多公司的编码规范要求 JavaScript 源代码控制在
在 JavaScript 中,对象是很方便的。它们允许我们轻松地将多个数据块组合在一起。 在ES6之后,又出了一个新的语言补充-- Map。...因此,Map 在当今的 JavaScript 社区中仍然没有得到充分的使用。 在本文本中,我会列举一些应该更多考虑使用 Map 的一些原因。...为什么对象不符合 Hash Map 的使用情况 在 Hash Map 中使用对象最明显的缺点是,对象只允许键是字符串和 symbol。...性能差异 在 JavaScript 社区中,似乎有一个共同的信念,即在大多数情况下,Map 要比 Object 快。有些人声称通过从 Object 切换到 Map 可以看到明显的性能提升。...图片 虽然我们中的大多数人永远不会在一个 Object 或 Map 中拥有超过1 00 万的条数据。对于几百或几千个数据的规模,Map 的性能至少是 Object 的两倍。
在JavaScript中,可以使用以下方式创建数组和对象: 一:创建数组(Array): 1:使用数组字面量(Array Literal)语法,使用方括号 [] 包裹元素,并用逗号分隔: let array1...Object({ firstName: 'John', lastName: 'Doe', age: 25 }); // 包含三个属性的对象 这些方式都可以创建数组和对象,并根据需要添加、修改或删除元素或属性
我们知道,JavaScript 模块有两种方法来定义导出:默认导出和命名导出。在本节中,我们来看下为什么默认导出是一种糟糕的做法,会导致不好的开发体验。...为什么 subtract 是默认的,而 add 是一个命名的导出? ps:我举的例子,可能有点刻意,但随着模块的复杂,类似这种情况有常有的 考虑到开发人员使用一个他们不熟悉且复杂的模块。...那么,这个下面的列表中没有展示什么呢?没错,就是默认导出。...在命名导出中,如果哪天我们的方法名改了,那么IDE 会提示我们对应的方法不存在,我们可以更好的重构。对于默认导出,IDE 是没有反馈的。...最后,你可能也在想,"我使用的框架或工具几乎要求我们默认导出一个函数或组件"。如果组件很多,我们可以通过使用 "index.js" 来解决这个问题。
jACCJmSYBQAwXyIg 作者:刘洋 在 js 中进行数学的运算时,会出现0.1+0.2=0.300000000000000004的结果,一开始认为是浮点数的二进制存储导致的精度问题,但这似乎不能很好的解释为什么在同样的存储方式下...一、浮点数的二进制存储 JavaScript遵循IEEE754标准,在64位中存储一个数据的有效数字形式。...因此,JavaScript提供的有效数字最长为53个二进制位(尾数部分52位+被省略的1位)。...如图,可以看到近似需要看三位,保留位(近似后的最低位)、近似位(保留位的后一位)、粘滞位(sticky bit 近似位后的所有位进行或运算后看作一位)。...四、总结思考 由于IEEE754标准,这样的“bug”不止在JavaScript中会出现,在所有采用该标准的语言中都会存在,实际编程中可以通过设置精度保留位数等方式解决。
作为强迫症患者,总是见不得MATLAB打开后,命令窗口弹出一堆“警告:名称不存在或不是目录:XXXXXXX”,如图1所示: 图1 警告信息 起初以为是默认搜索路径问题,于是乎打开设置路径对话框,但发现警告信息中的路径并没有相关路径...,如下图2示: 图2 搜索路径 紧接着又用path命令查看pathdef.m中存储的路径,结果发现里面还保留有图1中所警告的所有路径,极有可能是pathdef.m中存储的路径与图2中所显示的路径不一致造成的...于是抱着试一试的心态,尝试删掉pathdef.m中多余的路径,在命令窗口中输入如下命令: edit pathdef.m 随机来到了代码编辑区域,删掉图1中的路径,保存关闭重启MATLAB,警告信息果然不见了...参考资料:mathworks.com/help/matlab/ref/path.html 如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!
所以,我们首先应该形成一个感性的认知:一个 JavaScript 引擎会常驻于内存中,它等待着我们(宿主)把 JavaScript 代码或者函数传递给它执行。...在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起的任务...宏观和微观任务 JavaScript 引擎等待宿主环境分配宏观任务,在操作系统中,通常等待的行为都是一个事件循环,所以在 Node 术语中,也会把这个部分称为事件循环。...在宏观任务中,JavaScript 的 Promise 还会产生异步代码,JavaScript 必须保证这些异步代码在一个宏观任务中完成,因此,每个宏观任务中又包含了一个微观任务队列: 有了宏观任务和微观任务机制...Promise 是 JavaScript 中的一个定义,但是实际编写代码时,我们可以发现,它似乎并不比回调的方式书写更简单,但是从 ES6 开始,我们有了 async/await,这个语法改进跟 Promise
类--是一种代码的组织结构形式,是一种在软件中对真实世界中问题领域的建模方法。类有三个核心概念:封装、继承和多态。...在软件中,对不同的交通工具重复定义载人能力等方法是没有意义的,只要在Vehicle类定义一次,然后在Car类时,只要声明它继承(或扩展)了Vehicle类的基础定义就行。...在javascript中也有类似的语法,但是和传统的类完全不同。 js中只有对象,没有类这个概念。 类意味着复制,传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会被复制到子类中。...javascript设计模式二:策略模式 javascript设计模式三:代理模式 javascript设计模式四:迭代器模式 javascript设计模式五:原型模式 javascript...设计模式六:发布-订阅模式(观察者模式) javascript设计模式七:模板方法模式 javascript设计模式八:职责链模式 javascript设计模式九:中介者模式 javascript
新建项目为类库时,项目不会自动引用System.Windows.Forms,当我们使用命名空间System.Windows.Forms时,就会报这个错误
JavaScript开发者都曾经有过这样的经历——在使用变量之前必须检查它是否为null或undefined。这导致了许多重复的条件检查,可能会使我们的代码变得混乱不堪。...随着在ECMAScript 2020中引入了nullish coalescing(空值合并)操作符,我们现在有了一种更清晰的处理null或undefined值的方式。...在本文中,我将解释nullish coalescing操作符是什么,演示如何使用它,并讨论为什么它是JavaScript语言中如此重要的一个部分。Nullish Coalescing操作符是什么?...是在ECMAScript 2020中引入的逻辑运算符,用于处理null或undefined的默认值。它返回第一个操作数,如果它不是null或undefined。否则,它返回第二个操作数。...在这种情况下,该操作符用于检查数组中特定索引是否为null或undefined,并在是的情况下提供默认值。比较 || 和 ??||(逻辑或)和??
函数试编程范式 为什么学习函数式编程 函数式编程是一个非常古老的概念, 早于第一台计算机的诞生 为什么现在还要学习函数式编程?...有很多库可以帮助我们进行函数式开发, lodash、underscore、ramda 函数式编程概念 函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型...面向对象的思维方式:把现实世界中的事物抽象成程序世界中的类和对象,通过封装继承多态来演示事物事件的关系 函数式的思维方式: 把现实世界中的事物和事物之间的联系抽象到程序世界中(对运算过程进行抽象) 程序的本质...当使用函数式编程的时候一定会有一些函数,这些函数可以无数次的重用,所以函数式编程的好处就是可以让代码进行重用,这些函数可以组合成功能更强大的函数 函数是一等公民 函数是一等公民(英文:First-class citizen) JavaScript...由于函数与其他数据类型地位平等,所以在 JavaScript 语言中又称函数为 第一等公民。
HashMap中的hash方法为什么要右移16位并异或?...所以在hash方法里面,首先使用key的hashCode无符号右移16位,意味着把hashCode的高位移动到了低位,然后再用hashCode与右移之后的值进行异或运算。
解法:位运算 这题和下面两题类似,要想 O(1) 的空间复杂度,就得用位运算: 【LeetCode 136.只出现一次的数字 I】巧用异或运算 【LeetCode 137.只出现一次的数字 II】三种解法...:哈希表、数学技巧和位运算(JavaScript 实现) 解题的关键是:用异或运算,将数组分成两个子数组,然后对于子数组来说,就回到了 leetcode136 这题的解题思路。...整体的算法流程是: 对所有元素进行异或操作,最后的结果就是那两个出现 1 次的数异或的结果 找到上一步异或结果中的第一个非 0 的二进制位 bit 以上一步的二进制位将数组分成 2 个子数组,一个是第...bit 位为 0 的一组,一个是第 bit 不为 0 的一组 将各组的数字重新进行异或运算,最后的 2 个结果,就是题目要求 代码实现如下: // ac地址:https://leetcode-cn.com
阅读更多 在进行Web开发的过程中,各位用什么好工具来编写CSS、HTML、JavaScript或JSP,分享相关的经验出来吧 CSS : UE / Dreamweaver / TopStyle
Javascript语言的设计不够严谨,很多地方一不小心就会出错。 举例来说,请考虑以下情况。 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明。...myObj) { var myObj = { }; } 为什么加了一个var以后,就不报错了?难道这种情况下,if语句做判断时,myObj就已经存在了吗?...Javascript解释器,只"提升"var命令定义的变量,对不使用var命令、直接赋值的变量不起作用,这就是为什么不加var会报错的原因。...this.myObj) { this.myObj = { }; } 在全局变量的层面中,this关键字总是指向顶层变量,所以就可以独立于不同的运行环境。...因为null指的是已经赋值为null的空对象,即这个对象实际上是有值的,而undefined指的是不存在或没有赋值的对象。
即使中间的属性不存在,也不会出现错误。 “不存在的属性”的问题 如果你才刚开始读此教程并学习 JavaScript,那可能还没接触到这个问题,但它却相当常见。...就像你所看到的,在代码中我们仍然重复写了好几遍对象属性名。例如在上面的代码中,user.address 被重复写了三遍。 这就是为什么可选链 ?. 被加入到了 JavaScript 这门编程语言中。...如果我们希望它们中的一些也是可选的,那么我们需要使用更多的 ?. 来替换 .。 不要过度使用可选链: 我们应该只将 ?. 使用在一些东西可以不存在的地方。...来安全地读取或删除,但不能写入: 可选链 ?. 不能用在赋值语句的左侧。 例如: let user = null; user?....,仅在当左边部分不存在也没问题的情况下使用为宜。以保证在代码中有编程上的错误出现时,也不会对我们隐藏。 现代 JavaScript 教程:开源的现代 JavaScript 从入门到进阶的优质教程。
探索JavaScript中Null和Undefined的深渊 本文翻译自: https://modernweb.com/exploring-the-abyss-of-null-and-undefined-in-javascript.../ 在讨论JavaScript中的原始数据类型时,大多数人都了解基本知识,从String,Number和Boolean开始。...了解 null 和 undefined 在JavaScript中,null是语言关键字,不代表可识别的对象值。换句话说,这表示“没有值”。虽然相似,但undefined实际上表示值不存在。...尝试访问不存在值的值时通常会遇到此问题。在这种情况下,JavaScript是一种动态的,弱类型的语言,它将仅默认为一个undefined值,而不会引发错误。...由于它是一个外部API,因此尝试检索不存在的元素会返回一个null值,而不是undefined。 通常,如果您需要为变量或属性分配非值,将其传递给函数或从函数返回,null则几乎总是最佳选择。
如果在函数f()中声明一个局部变量也为g,则全局变量就会被局部变量覆盖 ? 2.作用域和声明提前 看到Javascript作用域这块,可以说颠覆了以前我对作用域的认识。...对于第二次执行结果“check now”没有什么特别的,为什么第一次输出的不是“yoyo”而是“undefined”。 ...每一段Javascript代码(全局代码或函数)都有一个与之相关联的作用域链,这个作用域链就是一个对象列表或链表。...比如当Javascript需要查找变量x的值时,它会从链中的第一个对象开始,如果该对象有一个名为x的属性,则直接使用,如果不存在名为x的属性,则会继续向链上的下一个对象查找,如此递归下去直到找到。...如果整个链上都找不到,则认为不存在x这个属性。
领取专属 10元无门槛券
手把手带您无忧上云