美文网首页
js基础知识点

js基础知识点

作者: 拾钱运 | 来源:发表于2019-02-22 14:27 被阅读3次

    一、函数立即执行和自执行
    立即执行
    在声明类似function foo(){}或var foo = function(){}函数的时候,通过在后面加个括号就可以实现自执行
    代码:

    foo()
    
    (function foo (){
      cosnole.log('我是一个可以自动执行的函数')
    }())  推荐使用
    (function foo(){})()    //这样写也是可以的
    //错误写法
    function foo(){
      console.log('直接+()这样会报错的,需要在整个函数外加括号')
    }
    

    自执行:

    //自执行  函数内部执行自身  递归
    function foo() { foo(); } 
    

    二、js的原始类型
    1.null 对象类型
    2.undefined
    3.string
    4.number
    5.boolean
    6.symbom
    原始类型是不可以toString() 的
    string和String是不一样的类型

            "1".toString()
            console.log("1".toString())
            console.log(typeof String)
            console.log(typeof string)
            console.log(typeof "string")
    

    这个时候的“”1“”是String类型对象类型,可以调用toString
    必要的时候会强转类型。

    原始类型有一些坑,number是浮点类型

     console.log(0.1+0.2!==0.3)//输出结果是true
    

    null是对象类型 当输出类型的时候,会输出object

    console.log(typeof null)
    

    这是js存在的一个悠久的bug。在js的最初版本中使用的是32位系统,为了性能考虑使用地位存储变量的类型信息,000开头代表是对象,然而null,表示为全零,所以将他错误判断为object。现在内部类型判断代码已经改变了,但是对于这个bug确实一直流传下来了

    对象类型:

    涉及面试题:对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?
    答:对象类型存储的是地址(指针)原始类型存储的是值。
    当你创建一个对象类型的时候,计算机会在内存中开辟一个空间来存放值,我们找到这个空间,需要一个地址(指针)
    数组是一个对象类型

    const a=[]
    const b=a
    b.push(1)
    console.log(a)  //输出[1]
    console.log(b)  //输出[1]
    

    数组(对象类型)赋值的时候,赋值的不是值,是指针,当a放生变化的时候,b的值就会发生变化

    函数参数为一个对象的时候

     function test(person){
                person.age=26
                person={
                    name:'yyy',
                    age:30
                }
                return person
               }
               const p1={
                name:'yck',
                age:25
               }
               const p2=test(p1)
               console.log(p2)
               console.log(p1)
    

    输出

    image.png
    解析:传进函数的person是一个副本,指向的内存地址相同,当改变具体的属性的时候,p1中的属性也会改变,当person={} 这个时候意义就不同了重新定义了一个对象,重新开了一个对象,地址不再是p1了,所以p1和p2的值不相同了
    三、typeof vs instanceof
    涉及面试题:typeof 是否能正确判断类型?
    instanceof 能正确判断对象的原理是什么?
    答:typeof不能准确判断变量到底是什么类型?
    解析:typeof对于原始类型来说,除了null都可以显示正确的类型输出null为对象类型,typeof对于对象来说,除了函数都会显示object。[] {} 判断出来的都是object
     console.log(typeof "1")   //string
            console.log(typeof 1)      //number
            console.log(typeof true)    //boolean
            console.log(typeof  undefined)      //undefined    
          // 可以进行判断变量是否存在  if判断  if(typeof a!=undefined){ console.log('成功')}    如果没有定义的    //变量 if(a){}  会报错
            console.log(typeof null)            //object
            console.log(typeof Symbol())        //symbol
            console.log(typeof [])              //object
            console.log(typeof {})              //object
            console.log(typeof console.log)     //function
    

    所以如果想判断一个对象的正确类型,可以考虑instanceof
    instanceof 内部机制是通过原型链判断的。instanceof运算符用来测试一个对象在其原型链这种是否存在一个构造函数 prototype属性
    语法:object instanceof constructor
    参考:object (要检测的对象) constructor (某个构造函数)
    描述:instanceof 运算符用来检测 construtor.prototype 是否存在于参数object的原型链上

    function C(){}
         var a=new C()
         console.log(a instanceof C)
         console.log(a)
         console.log(a  instanceof Object)
    

    //输出结果

    image.png
    更多分解:https://www.cnblogs.com/Trr-984688199/p/6180040.html
    instanceof 也不是百分百相信的
    三、箭头函数中的this
    箭头函数本来是没有this,她的this的指向是包裹这个箭头函数的第一个普通的函数
    例如:
    function Counter() {
      this.num = 0;
      this.timer = setInterval(() => {
        this.num++;
        console.log(this.num);
      }, 1000);
    }
    var b = new Counter();
    // 1
    // 2
    // 3
    // ...
    

    普通函数 这个时候的this指向的window

    function Counter() {
      this.num = 0;
      this.timer = setInterval(function add() {
        this.num++;
        console.log(this.num);
      }, 1000);
    }
    var b = new Counter();
    // NaN
    // NaN
    // NaN
    // ...
    

    相关文章

      网友评论

          本文标题:js基础知识点

          本文链接:https://www.haomeiwen.com/subject/bzheyqtx.html