1 数据类型、判断方法
基本类型:Undefined、Null、Boolean、Number、String
引用类型:Object
Ps:特殊对象类型:Array、Function、Math、Date、JSON、RegExp、Error
精确区分数据类型的方法:Object.prototype.toString.call()
console.log(Object.prototype.toString.call("34"));//[object String] console.log(Object.prototype.toString.call(66));//[object Number] console.log(Object.prototype.toString.call(function(){}));//[object Function]
let val1=null; let val2=val1||' '; console.log(val2); //空 let var1=undefined; let val2=var1||''; console.log(val2);//空 let var1="hay"; let val2=var1||''; console.log(val2); //hay
2 执行上下文
当前代码的执行环境
3 this
this的指向是在函数被调用的时候确定的。
(1) 若一个函数中有this,但其没有以对象的形式调用,而是以函数名的形式执行,则this指向全局对象。
function test(){ console.log(this); } test();//window
(2) 若一个函数中有this,且该函数是以对象方法的形式调用,则this指向的是调用该方法的对象。
var obj={ test:function(){ console.log(this); } } obj.test();//obj
(3) 若一个函数中有this,且包含该函数的对象也同时被另一个对象所包含,尽管这个函数是被最外层的对象所调用,this指向的也只是它的上一级对象。
var obj={ test:{ fun:function(){ console.log(this); } } } obj.test.fun();//test
(4) 若一个构造函数或类方法中有this,则其指向由该构造函数或类创建出来的实例对象。
class Test{ constructor(){ this.test = "test"; //类实例 } option(){ console.log(this); //类实例 } }
ps:
-
判断 this 在全局中OR函数中,若在全局中则 this 指向全局,若在函数中则只关注这个函数并继续判断。
-
判断 this 所在函数是否作为对象方法调用,若是则 this 指向这个对象,否则继续操作。
-
创建一个虚拟上下文,并把this所在函数作为这个虚拟上下文的方法,此时 this 指向这个虚拟上下文。
-
在非严格模式下虚拟上下文是全局上下文,浏览器里是 window ,Node.js里是 Global ;在严格模式下是 undefined 。
4 事件绑定的几种方法?
(1)直接在元素上绑定回调函数
<button id="btn" onclick="clickBtn()">click </button>
(2)js获取DOM元素对象后,对onclick属性赋值,绑定事件
document.getElementById('btn').onclick=clickBtn;
(3)js获取DOM对象后,调用对象的addEventListener函数绑定事件
document.getElementById('btn').addEventListener('click',clickBtn);
5 callee、caller
(1)callee,对象的属性,该属性是一个指针,指向参数arguments对象的函数,即用于指向当前对象。
function fac(x){ if(x<=1){ return 1; }else{ return x*fac(x-1); } }
function fac(x){ if(x<=1){ return 1; }else{ return x*arguments.callee(x-1); } }
ps:使用callee之后,无论引用函数的名字是什么,都可以保证递归调用顺利。
(2)caller
函数对象的一个属性,该属性保存着调用当前函数的函数的引用,若在全局作用域中调用当前函数,则其值为null。
function a(){//父函数 b(); }; function b(){ console.log(b.caller); }; a(); //结果就是弹出函数a和内容
(3)callee+caller
由(2)知,当函数名改过时,需要进行替换,比较麻烦。
(function a(){ b(); })(); function b(){ alert(arguments.callee.caller);//用arguments.callee代替了b };
学习 & 感谢 & 推荐
https://mp.weixin.qq.com/s/I7A1iC8Et6uOGZ234DsTlA
https://blog.fundebug.com/2017/07/06/12-tricks-that-js-rocks/
http://www.cnblogs.com/GumpYan/p/5718633.html
https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651552414&idx=2&sn=0436b66836ae9e08f5f86d8626811875&chksm=8025ad5fb7522449870890e6fa11961b78140537624575146de20dc60aa9e71dbd879355b260&mpshare=1&scene=23&srcid=0803gOTp44l8BS4hCDvBSmOH#rd