JavaScript知识点小记2

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

宝剑锋从磨砺出,梅花香自苦寒来。
原文地址:https://www.cnblogs.com/haimengqingyuan/p/7237134.html