JavaScript易错知识点整理

Verdi原理图(nSchema)不只是看图:手把手教你用它做设计审查与理解 本文深入探讨了如何将Verdi原理图工具(nSchema)从基础的看图功能升级为高效的设计审查系统。通过信号追踪、层次解构、动态过滤等高级功能组合,工程师可以全面分析结构拓扑、数据流向、控制逻辑和异常路径。文章提供了实战技巧,包括交互式设计理解工作流、高级审查技巧和定制化审查环境搭建,帮助提升数字设计模块的分析效率与准确性。 阅读详情

(点击上方公众号,可快速关注)

前言

本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点。

JavaScript知识点

1.变量作用域

var a = 1;

function test() {
    var a = 2;

    console.log(a); // 2
}

test();

上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2。

var a = 1;

function test2() {
    console.log(a); // undefined

    var a = 2;
}

test2();

上方的函数作用域中虽然声明并赋值了a,但位于console之下,a变量被提升,输出时已声明但尚未被赋值,所以输出“undefined”。

var a = 1;

function test3() {
    console.log(a); // 1

    a = 2;
}

test3();

上方的函数作用域中a被重新赋值,未被重新声明,且位于console之下,所以输出全局作用域中的a。

let b = 1;

function test4() {
    console.log(b); // b is not defined

    let b = 2;
}

test4();

上方函数作用域中使用了ES6的let重新声明了变量b,而let不同于var其不存在变量提升的功能,所以输出报错“b is not defined”。

function test5() {
    let a = 1;

    {
        let a = 2;
    }
    
    console.log(a); // 1
}

test5();

上方的函数作用域中用let声明了a为1,并在块级作用域中声明了a为2,因为console并不在函数内的块级作用域中,所以输出1。

2.类型比较

var arr = [],
    arr2 = [1];

console.log(arr === arr2); // false

上方两个不同的数组比较,console为false。

var arr = [],
    arr2 = [];

console.log(arr === arr2); // false

上方两个相同的数组比较,因为数组与数组比较恒为false,所以console为false。

var arr = [],
    arr2 = {};

console.log(typeof(arr) === typeof(arr2)); // true

上方利用typeof比较数组和对象,因为typeof获取NULL、数组、对象的类型都为object,所以console为true。

var arr = [];

console.log(arr instanceof Object); // true
console.log(arr instanceof Array); // true

上方利用instanceof判断一个变量是否属于某个对象的实例,因为在JavaScript中数组也是对象的一种,所以两个console都为true。

3.this指向

var obj = {
    name: 'xiaoming',
    getName: function () {
        return this.name;
    }
};

console.log(obj.getName());  // 'xiaoming'

上方对象方法中的this指向对象本身,所以输出”xiaoming”。

var obj = {
    myName: 'xiaoming',
    getName: function () {
        return this.myName;
    }
};

var nameFn = obj.getName;console.log(nameFn()); // undefined

上方将对象中的方法赋值给了一个变量,此时方法中的this也将不再指向obj对象,从而指向window对象,所以console为”undefined”。

var obj = {
    myName: 'xiaoming',
    getName: function () {
        return this.myName;
    }
};

var obj2 = {
    myName: 'xiaohua'
};
    
var nameFn = obj.getName;console.log(nameFn.apply(obj2)); // 'xiaohua'

上方同样将obj对象中的方法赋值给了变量nameFn,但是通过apply方法将this指向了obj2对象,所以最终console为’xiaohua’。

4.函数参数

function test6() {
    console.log(arguments); // [1, 2]
}

test6(1, 2);

上方利用函数中的arguments对象获取传入函数的参数数组,所以输出数组[1, 2]。

function test7 () {
    return function () {
        console.log(arguments); // 未执行到此,无输出
    }
}

test7(1, 2);

上方同样利用arguments获取参数,但因test7(1, 2)未执行return中的函数,所以无输出,若执行test7(1, 2)(3, 4)则会输出[3, 4]。

var args = [1, 2];

function test9() {
    console.log(arguments); // [1, 2, 3, 4]
}

Array.prototype.push.call(args, 3, 4);

test9(...args);

上方利用Array.prototype.push.call()方法向args数组中插入了3和4,并利用ES6延展操作符(…)将数组展开并传入test9,所以console为[1, 2, 3, 4]。

5.闭包问题

var elem = document.getElementsByTagName('div'); // 如果页面上有5个div

for(var i = 0; i < elem.length; i++) {
    elem[i].onclick = function () {
        alert(i); // 总是5
    };
}

上方是一个很常见闭包问题,点击任何div弹出的值总是5,因为当你触发点击事件的时候i的值早已是5,可以用下面方式解决:

var elem = document.getElementsByTagName('div'); // 如果页面上有5个div

for(var i = 0; i < elem.length; i++) {
    (function (w) {
        elem[w].onclick = function () {
            alert(w); // 依次为0,1,2,3,4
        };
    })(i);
}

在绑定点击事件外部封装一个立即执行函数,并将i传入该函数即可。

6.对象拷贝与赋值

var obj = {
    name: 'xiaoming',
    age: 23
};
    
var newObj = obj;

newObj.name = 'xiaohua';

console.log(obj.name); // 'xiaohua'
console.log(newObj.name); // 'xiaohua'

上方我们将obj对象赋值给了newObj对象,从而改变newObj的name属性,但是obj对象的name属性也被篡改,这是因为实际上newObj对象获得的只是一个内存地址,而不是真正 的拷贝,所以obj对象被篡改。

var obj2 = {
    name: 'xiaoming',
    age: 23
};
    
var newObj2 = Object.assign({}, obj2, {color: 'blue'});

newObj2.name = 'xiaohua';console.log(obj2.name); // 'xiaoming'

console.log(newObj2.name); // 'xiaohua'
console.log(newObj2.color); // 'blue'

上方利用Object.assign()方法进行对象的深拷贝可以避免源对象被篡改的可能。因为Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

var obj3 = {
    name: 'xiaoming',
    age: 23
};
    
var newObj3 = Object.create(obj3);

newObj3.name = 'xiaohua';console.log(obj3.name); // 'xiaoming'

console.log(newObj3.name); // 'xiaohua'

我们也可以使用Object.create()方法进行对象的拷贝,Object.create()方法可以创建一个具有指定原型对象和属性的新对象。

结语

学习JavaScript是一个漫长的过程,不能一蹴而就。希望本文介绍的几点内容能够帮助学习JavaScript的同学更加深入的了解和掌握JavaScript的语法,少走弯路。

前端部分常见知识点 关于定位、浮动、常见样式等方面的总结,如有错误之处,欢迎交流。 立即下载

相关推荐

【基于51】红外寻迹智能小车 - 代码篇

这是一个基于C51单片机的红外巡线智能小车,是一个适合嵌入式单片机、C语言初学者练习的小Demo,文章提供完整的项目思路、免费的源代码。

ZER00000001的博客 3万+

前端易错易忘知识点(查缺补漏)

ps。记录自己一些记不太住的知识,但可能笔试之类会考。 = = 其他人也可以看看,测试一下自己有没有忘: 1、HTML5 的标签并不是都必须写结束标签 eg.:p、li 等标签不闭合也能显示 2、大小写敏感 ① HTML中的属性名、标签名对大小写不敏感(浏览器会自动转换成小写) ② CSS ID 和 类 选择器 区分 大小写 标签选择器、属性选择器不区分大小写 ③ Javasc...

Jackie Huang 681

汽车BMS技术分享及其HIL测试方案

在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的市场接受度。而电池管理系统(Battery Management System, BMS)是动力电池安全运行与性能释放的核心技术支撑。

Speedgoat的博客 2683

前端开发最容易出错的基础知识,面试常问!

JavaScript 是目前比较流行的语言,因为前端开发较其他语言相比,简单好学,门槛低,而且现在的互联网公司几乎缺少不了web前端开发,行业的需求致使大量的人转型前端,对于刚学前端的人来讲,他们缺乏开发经验,在项目开发中容...

clhq71932的博客 202

ICS v9.5 OverbyteIcsWSocket.pas 整体架构分析

核心架构:OverbyteIcsWSocket.pas 是 Internet Component Suite (ICS) 的基础网络组件单元,提供跨平台 Winsock API 封装,支持TCP/UDP 客户端/服务器,DNS 解析和Raw Socket。在 v9.5 中,SSL/TLS 代码已分离至 OverbyteIcsSslBase.pas 等单元,使核心单元更精简,专注于非加密 socket 操作。

sonadorje的专栏 992

autoDL算力云装Xinference[坑与步骤]

在页面直接点击下载会出现下着下载进度条消失,试了几次才出现这个报错,现在我们就继续安装缺少的包吧。这一步成功绕开了系统盘空间限制。先租用一个合适的服务器,建议不要选最新版本,跟我选的一样即可,不然后面会出现。最近在 AutoDL 上尝试部署。🚫 不要直接使用以下命令。点击下面链接即可打开。

ngadminq的博客 2382

js易错知识点总结

注:没有标注书名只有页数的参考来源均指代《Javascript权威指南第六版》,其他参考均有书名或网址标注。 一、易产生误区知识点记录 1、[] == ! [] 所有对象都转化为true(P52),数组是对象,因此空数组[]转化为布尔值为真。而空数组转化为数字时为0.因此左式Number([])=0。 “!”运算符首先将操作数转换为布尔值,然后再对布尔值求反(P81),因此右式为!Bool...

riddle1981的博客 973

从零开始用飞牛fnas搭建集成DeepSeek-R1的远程AI工作台

从零开始用飞牛fnas搭建集成DeepSeek-R1的远程AI工作台

AI+全栈,AI+应用,实操落地,前沿技术 3805

javascript语法易错点

1typeof和instanceof  typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number,boolean,string,function(函数),object(NULL,数组,对象),undefined。 正因为typeof遇到null,数组,对象时都会返回object类型,所以当我们要判断一个对象是否是数组时 或者判断某个变量是否是某个对...

tangem的博客 264

YOLOv13改进:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

BiLevelRoutingAttention方法对小目标检测效果比较好。可能是因为BRA模块是基于稀疏采样而不是下采样,一来可以保留细粒度的细节信息,二来同样可以达到节省计算量的目的。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1433

JavaScript 易错知识点整理

前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点。 JavaScript知识点 1.变量作用域 var a = 1; function test() { var a = 2; console.l

不忘初心,方得始终 6862

Unity 实战项目 ☀️| 只用一个脚本做一个 刮刮乐 案例,一不小心刮出来一个女朋友!【学习娱乐一下】

只用一个脚本做一个刮刮乐,一不小心刮出来一个女朋友!【学习娱乐一下!】

努力前行,总会成为自己心中的那道光 23万+

java易错考点,JavaScript 易错知识点整理

原标题:JavaScript 易错知识点整理前言本文是我学习Java过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点。Java知识点 1.变量作用域 上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2。 上方的函数作用域中虽然声明并赋值了...

weixin_36480255的博客 172

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 谈谈React那些小事
下一篇: 杭州SFDC开发者大会精彩片段(前端篇)
劳卜
博客等级 码龄10年 5粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值