js基础知识点

一、函数立即执行和自执行
立即执行
在声明类似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)

//输出结果

js基础知识点_第1张图片
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基础知识点)