1.原始类型
在JS中存在6种原始类型,分别是:
- boolean
- null
- underfined
- string
- number
- symbol
首先原始类型存储的都是值,是没有函数可以调用的,比如underfined.toString()。
但’1’.toString()却可以使用,是因为’1’被强制转换成了String类型也就是对象类型(包装类型),所以可以调用toString函数。
2.对象类型
对象类型和原始类型有什么不同之处呢?函数参数是对象会发生什么问题呢?
- 对象类型与原始类型的不同之处在于,原始类型存储的使值,而对象类型存储的是地址(指针),当你创建一个对象类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但我们需要找到这个空间,这个空间会拥有一个地址。
- 函数参数是对象的情况
- typeof vs instanceof:typeof是否能正确判断类型?instanceof能正确判断对象的原理是什么?
typeof对于原始类型来说,除了null都可以显示正确的类型,typeof对于对象来说,除了函数都会显示object,所以typeof并不能准确判断变量到底是什么类型。
如果我们想判断一个对象的正确类型,这时候可以使用instanceof,因为内部机制是通过原型链来判断的。对于原始类型来说,想直接通过instance来判断类型是不行的。 - 类型转换
在JS中类型转换只有三种情况,分别是:
1.转换为布尔值
2.转换为数字
3.转换为字符串 - this
1.作为普通函数的this,直接指向window
2.作为构造函数的this,指向实例化的对象
3.作为对象属性的函数内的this,指向调用这个函数的对象
4.作为箭头函数的this,this至取决于包裹箭头函数的第一个普通函数的this。另外对箭头函数使用bind这类函数是无效的。
5.对于bind、apply、call这类改变上下文的API,对于这些函数来说,this取决于第一个参数,如果第一个参数为空,那么this指向window。
以上就是this的规则了,但是可能会发生多个规则同时出现的情况,这时候不同的规则之间会根据优先级最高的来决定this最终指向哪里。
首先,new方式的优先级最高,接下来是bind这些函数,然后是obj.foo()这种调用方式,最好是foo这种调用方式,同时,箭头函数的this一旦被绑定,就不会再被任何其他方式所改变。