原始(primative)类型
在js中,存在着6种原始值:
- boolean
- null
- undefined
- string
- number
- symbol
原始值类型存储的都是值,是没有函数可以调用的。
null并不是对象,虽然typeof null会输出object,但其只是js存在的一个历史悠久的bug,如果修改这个bug的话会导致之前已有的项目出现更大的bug,所以大概率这个bug是不会修复了。
对象(Object)类型
在 JS 中,除了原始类型那么其他的都是对象类型。
对象类型和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址(指针)。
typeof vs instanceof
typeof 对于对象来说,除了函数都会显示 object ,所以说 typeof 并不能准确判断变量到底是什么类型。
对于原始类型来说,你想直接通过 instanceof 来判断类型是不行的。
类型转换
- 转换为布尔值
- 转换为数字
- 转换为字符串
this
- 对于直接调用 foo 来说,不管 foo 函数被放在了什么地方, this 一定是 window
- 对于 obj.foo() 来说,我们只需要记住,谁调用了函数,谁就是 this ,所以在这个场景下 foo 函数中的this 就是 obj 对象
- 对于 new 的方式来说, this 被永远绑定在了 c 上面,不会被任何方式改变 this
- 不管我们给函数 bind 几次, fn 中的 this 永远由第一次 bind 决定,
- 箭头函数其实是没有 this 的,箭头函数中的 this 只取决包裹箭头函数的第一个普通函数的 this 。
优先级
首先, new 的方式优先级最高,接下来是 bind 这些函数,然后是 obj.foo() 这种调用方式,最后是 foo 这种调用方式,同时,箭头函数的 this 一旦被绑定,就不会再被任何方式所改变。