前言

本文是我学习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

上方两个相同的数组比较,因为两个单独的数组永不相等,所以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(Array.prototype.slice.call(arguments)); // [1, 2] } test6(1, 2);

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

function test7 () {return function () { console.log(Array.prototype.slice.call(arguments)); // 未执行到此,无输出 } } test7(1, 2);

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

var args = [1, 2];function test9() { console.log(Array.prototype.slice.call(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个divfor(var i = 0; i < elem.length; i++) { elem[i].onclick = function () { alert(i); // 总是5 }; }

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

var elem = document.getElementsByTagName('div'); // 如果页面上有5个divfor(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的语法,少走弯路。

转载于:https://www.cnblogs.com/wangzhenhai/p/6537947.html

JavaScript 易错知识点整理相关推荐

  1. JavaScript易错知识点整理

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

  2. 苏大计算机考研 操作系统常见易错知识点整理

    苏大计算机考研 操作系统常见易错知识点整理   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地 ...

  3. Linux - 易错知识点整理(待更新)

    Linux - 易错知识点整理(待更新) 本文根据CSDN Linux进阶技能树整理的易错知识点(带练),参考资料Linux常用命令大全(非常全!!!),Linux面试题(2020最新版)(带问/练) ...

  4. Java进阶3 - 易错知识点整理(待更新)

    Java进阶3 - 易错知识点整理(待更新) 该章节是Java进阶2- 易错知识点整理的续篇: 在前一章节中介绍了 ORM框架,中间件相关的面试题,而在该章节中主要记录关于项目部署中间件,监控与性能优 ...

  5. MySQL初阶 - 易错知识点整理(待更新)

    MySQL初阶 - 易错知识点整理(待更新) Note:这里根据 CSDN Mysql技能树 整理的易错题,可参考MySQL 有这一篇就够,MySQL详细学习教程(建议收藏),MySQL 菜鸟教程 文 ...

  6. 浮点数不能全等比较吗php,php的一些易错知识点整理 | 木凡博客

    1. 取模运算结果的正负仅取决于被除数 被除数为正,结果为正:被除数为负,结果为负. echo ((-8)%3);     // 将输出-2 echo (8%(-3));      // 将输出2 2 ...

  7. 南理工计算机考研877专业课——操作系统易错知识点整理

    虚拟存储部分 页面分配策略: 局部置换 全局置换 固定分配 Y N 可变分配 Y Y 页面置换算法: 简单的CLOCK算法: 增加一个使用位,置换时扫描使用位为0的帧,并将使用位为1的置0. 改进的C ...

  8. 信号与系统第四章-第六章习题易错点整理

    信号与系统第四章-第六章习题易错点整理 鄙人学疏才浅,资料仅供自己学习 留意书上蓝色圈的题目 第四章-傅里叶变换 注意基波角频率为全部Ω的最大公约数 在计算傅里叶的An.Bn时,需要额外考虑n=0的情 ...

  9. 初中数学分几个模块_【初中数学】8大模块61个必考易错知识点!

    今天,酒窝老师给大家带来的是初中数学8大类61点易错知识点,考试就不要再在这些点上扣分啦,快来看看. 数与式 易错点1:有理数.无理数以及实数的有关概念理解错误,相反数.倒数.绝对值的意义概念混淆.以 ...

最新文章

  1. 关于idea打开项目没有目录
  2. 安卓手机指纹解锁linux电脑,【果核干货应用篇-06】使用手机指纹解锁电脑
  3. c# 四舍五入、上取整、下取整
  4. java文件传输之文件编码和File类的使用
  5. django 学习 (四) 模板标签
  6. 云原生时代微服务的高可用架构设计
  7. Codeforces Round #232 (Div. 1) 解题报告
  8. mapbox symbols 层级设置_mapboxgl实现带箭头轨迹线的代码
  9. SharePoint 2013 Error - File names can't contain the following characters: ? # {} % ~ / \.
  10. 2014/2015年Mac Pro连接LG Ultra HD显示器刷新率低(30Hz)问题解决
  11. 一位大佬对于 Qt 学习的最全总结(三万字干货)
  12. 初识人工智能,机器学习,深度学习的关系(概念)
  13. eleme饿了么vue项目随笔,随时更新,想到哪里写到哪里比较凌乱一直更新
  14. 使用linux内核仿真ZNS(zoned namespace SSD)
  15. openCV图片倾斜矫正(java版)
  16. 移动OA,为企业提供更高效的办公模式
  17. 如何低成本搭建dnslog服务器
  18. 异步传输模式 Asynchronous Transfer Mode
  19. 如何让iPad变成Mac的扩展屏幕
  20. 黄陈晨,你可以陪着我么

热门文章

  1. 在派生类中引发基类事件
  2. vue 动态设置页面title
  3. Hadoop 故障整理
  4. slor6.6 在linux下的安装以及启动失败解决办法
  5. 玲珑杯 ACM Round #10
  6. Android 开发工具类 13_ SaxService
  7. nodejs async
  8. [projectEuler.net]12
  9. WebLogic自带的Web Service测试工具
  10. v系列服务器cpu,服务器cpu v什么意思