Skip to content

JS 基础

JS 数据类型

原始类型有哪几种?null 是对象嘛?

原始类型 6种基础/原始类型:booleannullundefinednumberstringsymbol

原始类型存储的都是值,是没有函数可以调用的,比如 undefined.toString() 会报错

'1'.toString() 是可以使用的。其实在这种情况下,'1' 已经不是原始类型了,而是被强制转换成了 String 类型也就是对象类型,所以可以调用 toString 函数。

string 类型是不可变的,无论你在 string 类型上调用何种方法,都不会对值有改变。

另外对于 null 来说,很多人会认为他是个对象类型,其实这是错误的。虽然 typeof null 会输出 object,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。

对象类型

对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?

对象类型和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址(指针)。当你创建了一个对象类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)

JS 数据类型判断

typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?

  • typeof 判断基础/原始类型,null 会判断成obj, 其他都能正确
  • typeof 判断对象类型,函数会判断成 function,其他都正确时obj,但是判断不了具体的类型

instanceof 原理:TODO:

数据类型隐式转化

TODO:

this

如何正确判断 this?箭头函数的 this 是什么?

  • 直接调用 foo ,不管 foo 函数被放在了什么地方,this 一定是 window

  • obj.foo() ,我们只需要记住,谁调用了函数,谁就是 this,this 是 obj 对象

  • new 的方式,this 被永远绑定在了 new 出来的变量上面,不会被任何方式改变 this

  • 箭头函数中的 this 只取决包裹箭头函数的第一个普通函数的 this (因为箭头函数没有this,因此对包裹箭头函数的函数使用bind也无法修改this)

  • new 一个class内部的对象的函数的箭头函数,这种情况根据优先级

  • new 的方式优先级最高,接下来是 bind 这些函数,然后是 obj.foo() 这种调用方式,最后是直接调用的方式,同时,箭头函数的 this 一旦被绑定,就不会再被任何方式所改变。

tips: fn.bind(a).bind(b) 不会修改多次this指, 只有第一个会生效, 具体原因请手写bind