1.数据类型转换
其他类型转string
1)+号拼接''
2)toString()函数,除了null和defined,其他的都有
3)String()包装器
其他类型转Boolean
1)!!
2)Boolean()包装器
转换为false的值是:'' 0 NaN null undefined 假性值
' ':空格字符串——true
其他类型转number
1)+-,+'123' 一元运算符,本质上是Number包装器
2)Number()包装器
2.在函数内不加var声明时,是全局变量,当用var声明变量时,在函数体内则为局部变量
3.this:谁调用指向谁
单独使用this时,指向全局:node环境——global,浏览器环境——Windows
在函数中,函数的所属者默认绑定this
在事件中,this指向了接收事件的HTML元素
改变this指向:call,apply
- .call(执行环境对象,实参列表);
- .apply(执行环境对象,实参列表数组);
- .bind(执行环境对象)(实参列表);(不常用)
4.闭包
为什么产生闭包?可以在一个函数内部访问另一个函数的变量
闭包:在函数内部包裹着函数,作用域链得不到释放,造成消耗内存
作用域链:自由变量由内向外逐级查找
在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有权限访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
优点:
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)。
③匿名自执行函数可以减少内存消耗。(function(){}){}
坏处:
①被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
解决方法:
立即执行函数,创建函数后就立即执行且只执行一次
IIFE(立即执行函数)
- 页面加载完成后只执行一次的设置函数。
- 将设置函数中的变量包裹在局部作用域中,不会泄露成全局变量。
5.构造函数、实例、原型对象
https://www.cnblogs.com/liyusmile/p/8820443.html
每创建一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向一个对象,该对象称之为原型对象(后期我们可以使用这个原型对象帮助我们在js中实现继承).
原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。
Js中new一个构造函数时,通过调用构造函数产生的实例对象,都拥有一个内部属性,指向了原型对象。其实例对象能够访问原型对象上的所有属性和方法。