js的一些坑

【高频考点精讲】JavaScript中的隐式类型转换,那些坑你踩过几个? 🧑‍🏫:全栈老李📅:2025 年 5 月🧑‍💻:前端初学者、进阶开发者🚀:本文由全栈老李原创,转载请注明出处。大家好,我是全栈老李。今天咱们聊聊JavaScript里那个让人又爱又恨的特性——隐式类型转换。这东西就像是个调皮的孩子,有时候帮你省事儿,有时候却让你抓狂。[] + {}和{} + []的结果一样吗?如果你能立刻答对,那说明你对JS的类型转换已经颇有研究了。不过别急,咱们慢慢来拆解这个"魔法"背后的原理。 阅读详情

本文作者:Aurélien Hervé 
编译:胡子大哈

翻译原文:http://huziketang.com/blog/posts/detail?postId=58e06b98a58c240ae35bb8dd 
英文连接:Who said javascript was easy ?

1. 你是否尝试过对一个数字数组进行排序呢?

JavaScript 中的 sort() 默认是按字母排序的。所以比如你这样 [1,2,5,10].sort(),会输出 [1,10,2,5]。


正确的排序可以使用 [1,2,5,10].sort((a, b) => a — b)。

是不是很简单,这个知识点是告诉你第一种方式排序是有问题的。

2. new Date() 很好用

new Date() 可以接收:

  • 无参数:返回当前时间;
  • 1 个参数 x:返回 1970 年 1 月 1 日 + x 毫秒时间。Unix 的小伙伴知道为什么是这样;
  • new Date(1,1,1) 返回 1901 年 2 月 1 日:第一个 “1” 代表 1900 年以后的第 1 年;第二个 “1” 代表这一年的第 2 个月(并不是像你想象的那样从 1 月开始);第三个 “1” 代表这个月的第 1 天(这个确实是如你想象的那样从 1 开始)。
  • new Date(2017,1,1) :这并不是表示 1900 + 2017了,它就是表示 2017 年 1 月 1 日。


3. 替换,实际上并没有替换

对于原始串不被替换掉,我是双手赞同的,我不喜欢一个函数的输入总是在变化。另外你应该知道 replace 只会替换第一个匹配上的字符。

    let s = "bob"
    const replaced = s.replace('b', 'l')
    replaced === "lob" // 只替换第一个匹配上的
    s === "bob" // 原始串始终没变

如果你想替换所有的,那就是用正则符 /g:

    "bob".replace(/b/g, 'l') === 'lol' // 替换所有串

4. 小心使用比较

    // These are ok
    'abc' === 'abc' // true
    1 === 1         // true

    // These are not
    [1,2,3] === [1,2,3] // false
    {a: 1} === {a: 1}   // false
    {} === {}           // false

原因:[1,2,3] 和 [1,2,3] 是两个数组,它们只是恰巧值相等罢了,他们的引用是不同的,所以不能用简单的 === 来比较。

5. 数组不是原始类型

    typeof {} === 'object'  // true
    typeof 'a' === 'string' // true
    typeof 1 === number     // true
    // But....
    typeof [] === 'object'  // true

想知道你的变量是不是数组,仍然可以使用 Array.isArray(myVar)。

6. 闭包

这是很出名的一道 JavaScript 面试题:

    const Greeters = []
    for (var i = 0 ; i < 10 ; i++) {
      Greeters.push(function () { return console.log(i) })
    }

    Greeters[0]() // 10
    Greeters[1]() // 10
    Greeters[2]() // 10

你预期的是输出:0,1,2...吗?你知道这是为什么吗?你知道怎么 fix 吗?

我来提两种可能的解决方案来解决这个问题:

  • 第一种:使用 let,不用 var。Duang!解决了~

let 和 var 的区别是作用域。var 的作用域是最近的函数块。而 let 的作用域是最近的封闭块。如果两个都是在块外的,那两个都是全局的。最近的封闭块,要比最近的函数块范围小。这里是源码。

  • 第二种:使用 bind。
    Greeters.push(console.log.bind(null, i))

还有很多方法可以解决这一问题,这里列出了我个人的两种最优选择。

7. 聊一聊 bind

你觉得下面的代码会输出什么?

    class Foo {
      constructor (name) {
        this.name = name
      }

      greet () {
        console.log('hello, this is ', this.name)
      }

      someThingAsync () {
        return Promise.resolve()
      }

      asyncGreet () {
        this.someThingAsync()
        .then(this.greet)
      }
    }

    new Foo('dog').asyncGreet()

给你点提示,你认为是否会抛出异常呢?Cannot read property 'name' of undefined。

原因:greet 没有在恰当的上下文中执行。依旧,有很多种方法解决这个问题。

  • 第一种:我个人比较喜欢如下解决方法。
    asyncGreet () {
      this.someThingAsync()
      .then(this.greet.bind(this))
    }

这种方式可以保证 greet 是在类已经实例化以后被调用。

  • 第二种:如果你想确保 greet 始终可以正确调用,可以绑定到构造函数中。
    class Foo {
      constructor (name) {
        this.name = name
        this.greet = this.greet.bind(this)
      }
    }
  • 第三种:你还应该知道箭头函数(=>)可以保护上下文,也可以解决这个问题。
    asyncGreet () {
      this.someThingAsync()
      .then(() => {
        this.greet()
      })
    }

这些年遇到的js的坑 NULL 博文链接:https://hw1287789687.iteye.com/blog/2184379 立即下载

相关推荐

CMakeTestCCompiler.cmake错误解决

CMakeTestCCompiler.cmake错误解决欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近编译项目的时候,遇到一个cmake的错误,具体错误信息如下: /path-to-pr

昨夜星辰的博客 2万+

JS——10大陷阱

因为[1,2,3]和[1,2,3]是两个不同的数组,只是它们的元素碰巧相同。因此,不能简单的通过`===`来判断。3>2>1 返回值为false(原因:3>2为true,会默认转成数字1,1>1为false)1

zhanglongfei1016的专栏 1197

逆变器专题(6)-正负序分离(二阶广义积分器DSOGI)

相应仿真原件请移步资源下载DSOGI作为一种常用的正负序分离方法,其可以在电压三相不平衡的状态下实现较为精准的锁相环。

cyc19980105的博客 8806

JavaScript几个坑

坑之作用域JavaScript的函数定义先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部,所以下面的程序并不会报错,而是会弹出 Hello, undefinded 变量 b 成了undefinded: (如果是Python一定会报local variable … referenced before assignment,因为变量未赋值前就引用了)'use strict';functio

Muge 578

RV1126双摄IMX577驱动移植避坑:从RK3588到RV1126的dts配置与内存崩溃解决实录

本文详细记录了在RV1126平台上移植RK3588的IMX577双摄驱动的完整过程,重点解决了dts配置与内存崩溃问题。通过分析硬件架构差异、驱动移植关键点及CMA内存越界问题,提供了两种有效解决方案,并分享了双摄同步优化与网络调试的实战经验,为嵌入式视觉系统开发提供实用参考。

weixin_42641741的博客 405

Unity ProBuilder(自己创建斜面、拐角)

ProBuilder基础实例

weixin_56537692的博客 1551

JavaScript中常见的坑有哪些?

本文和大家分享的主要是javascript中常见的一些陷阱,一起来看看吧,希望对大家学习javascript有所帮助。   1. 你是否尝试过对数组元素进行排序?   JavaScript默认使用字典序(alphanumeric)来排序。因此, [1,2,5,10].sort() 的结果是 [1, 10, 2, 5] 。   如果你想正确的排序,应该这样做: [1,2,5,10].sort(

qq_32506555的博客 441

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 407

JavaScript 常见 “坑” 与避坑指南

JS 常见陷阱:== 隐式转换(0=='0' 为真)、const 数组可修改(push 生效)、NaN 自反性为假。建议用 === 替代 ==,配合 Object.freeze 和 Number.isNaN 提升代码安全性。

2403_84691304的博客 541

YOLO11的持续学习:如何在不遗忘旧数据的情况下学习新类别

类增量学习(Class-Incremental Learning, CIL)是持续学习(Continual Learning)的一个重要分支,它指的是模型在不遗忘已学旧类别知识的前提下,逐步学习新类别的能力。与传统机器学习假设所有数据一次可用不同,类增量学习更贴近现实世界应用场景——新的类别数据往往会随着时间推移逐步出现。 举个例子,假设我们已经训练好一个YOLOv11模型用于检测"猫"和"狗"两种动物,现在需要让模型新增识别"兔子"的能力。传统方法需要收集所有类别(猫、狗、兔子)的数据重新训练,而类增量

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1966

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

专注于编程、AI、人工智能等多个领域内容研究和分析 641

Javascript踩坑记录

在使用JS进行程序设计时,往往最终的结果会事与愿违,我将导致这种情况的因素称为坑点。 1、Array.prototype.sort([fn]) 需要对数组原地稳定排序时,可以使用 arr.sort(fn), 但别忘了指定排序规则函数fn(a,b),否则会按元素的unicode码大小升序排序,如[1,2,10] => [1,10,2] 2、Number类型运算 js中无整数,只有IEEE754标准的双精度64位浮点数,因此做加减乘除运算的时候会很坑: // 第一个坑点 0.1 + 0.2 不等于 0.3

m0_57376385的博客 590

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 229

【javascript】js动态生成keyframe的坑

前言 有些稍微复杂的动画效果不能单单通过transition解决,需要使用animation。一般情况keyframe都是自己早在css写好的,那么如果需要动态写keyframe呢? 解决方法 大家都百度到了,在document.stylesSheets里,里面有很多CSSStyleSheet。其中的rules存放着用户定义的keyframes。 但是坑在这,写项目很多用的别人的组件,你不知...

不忘初心,坚定道路! 3740

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JavaScript 所谓的坑

JS中的let和var的区别:https://www.cnblogs.com/fly_dragon/p/8669057.html 主要是: 1.在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。 2.let定义的更像一个正常的 变量,不存在变量提升、未定义前就能使用(变量提升)、不允许重复定义等现象! ...

wangyihero8的专栏 475

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JavaScript 总崩?this 指向 + 闭包技巧终结 JS 玄学坑

解决办法特简单,要么用箭头函数 —— 箭头函数的 this 是 “继承自外层作用域” 的,写 setTimeout (() => {console.log (this.name)}, 1000),this 就跟着外层方法的 this 走了;亲测有效,这俩招我写项目时天天用。这不是循环有问题,是 var 声明的变量没有块级作用域,所有按钮的点击事件都共享同一个 i,循环结束后 i 已经变成最大值了。你是不是也写过 “先调接口拿数据,再渲染页面” 的代码,结果数据还没回来,页面就先渲染了,导致一片空白?

思索的涟漪,突破自我 291

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

我趟过javascript(js)文件不执行的坑

由于刚写h5没多久,很多基础知识不太扎实,导致入坑 html文件如下 <!DOCTYPE html> <html> <head> <title>秒杀详情页</title> </head> <body> <div class="container"> <div class="pan...

SeaLong_的博客 1822

90%前端都踩过的JS内存黑洞:从《你不知道的JavaScript》解锁底层逻辑与避坑指南

JS内存管理的核心,从来不是“记住栈堆区别”,而是理解《你不知道的JavaScript》反复强调的:“内存是有限资源,开发者的责任是让无用的内存‘可达性消失’”。全局变量“少而精”,使用后主动置空避免稀疏数组,警惕V8快慢数组切换闭包不背锅,控制引用周期是关键(弱引用兜底)Worker/定时器等“独立执行单元”,必须显式终止。

2501_92234528的博客 1036

JavaScript操作DOM的那些坑

参考: JavaScript操作DOM的那些坑

初漾的博客 288

彻底搞懂 JS 闭包各种坑

闭包是js开发惯用的技巧,什么是闭包?闭包指的是:能够访问另一个函数作用域的变量的函数。清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。eg: function outer() { var a = '变量1' var inner = function () { console.info(a) } retur...

ppxin的专栏 169

js splice坑_JavaScript绕坑走 - 强大的splice()方法

JavaScript数组的splice()方法很强大,我们知道,JavaScript数组中没有专门方法来移除元素(类似Array.delete或Array.remove这样的方法),但通过splice()方法,我们能轻而易举地完成移除元素操作。先来看看splice()方法的说明(引自w3school说明):1. 定义和用法splice()方法用于插入、删除或替换数组的元素。2. 语法arrayOb...

weixin_35665083的博客 283

js创建二维数组遇到的坑

前言 JavaScript如何创建二维数组呢?遇到个方法,看起来很酷,但实际上,有坑 有坑的方法 代码如下所示: var arr = new Array(10).fill(new Array(10).fill(0)) 控制台打印arr 这时候,若你想设置,arr[0][0] = 1,你会发现二维数组所有子数组的第一项都被改为1 这便是坑了,你只想改成一个子数组中的第一项,却一下子改变了整个子数组 拒绝坑,从老实码代码做起 var a = new Array(); for(var i=0;i<

zwf193071的专栏 495

《你不知道的JavaScript》:js常见值类型的坑

再来看下js中的值类型。 常见的值类型有数组(array)、字符串(string)、数字(number)等。 js中的数组可以容纳任何类型的值,可以是字符串、数字、布尔、对象甚至也可以是数组。对数组声明后即可向其中加入值,无需预先设定大小。这里有个小注意点,虽然可以用delete关键字来将单元从数组中删除,但单元删除后,数组的length属性并不会发生变化。 在创建稀疏数组(即含有空白或空缺单元的...

一期一会的博客 304

Vue.js使用sql.js踩坑

sql.js在Vue.js里的使用

xingguangtu的博客 1527

Three.js系列之入坑感言

three.js前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np imp

weixin_50077637的博客 1万+

彻底搞懂JS闭包各种坑

闭包是js开发惯用的技巧,什么是闭包?闭包指的是:能够访问另一个函数作用域的变量的函数。清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。eg: function outer() { var a = '变量1' var inner = function () { console.info(a) } retur...

Servenity 296
上一篇: 我理解中的“大前端”/“大无线”
下一篇: session, sessionID和cookie
SunsCheung
博客等级 码龄11年 30粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值