1.原始数据类型和引用数据类型有哪些?
string number boolean null undefined symbol
![7149c0afdd0d2083e9433fd98113cafb.png](https://i-blog.csdnimg.cn/blog_migrate/96ca0c51dec5b16f835f760f7b48f584.png)
symbol是ES6新引入的一种数据类型,表示独一无二的值。
![c02290abe211b0b8592fdda1704d6f8e.png](https://i-blog.csdnimg.cn/blog_migrate/1e173ec1e41171512e076e9e115bb2d8.png)
注意,Symbol函数不能使用new生成实例,否则会报错。因为Symbol是一种原始数据类型的值,不是对象。也就是说 ,Symbol的值不是一个对象所以不能添加属性,是一种类似于字符串的数据类型。
2.typeof Array 和 typeof Array()?
![aff40269110272145d97bcae4d8e40b1.png](https://i-blog.csdnimg.cn/blog_migrate/e4847959ab0bc8b5ea96a619bd12105b.png)
Array本身是js内置的一个构造函数,构造函数不实例化也就是个函数。
当它在调用或实例化的时候typeof 才会成对象。
3.null是一个对象吗?为什么typeof null 为object?
null表示一个空指针,它不是一个对象。
因为js在最初的版本出于性能考虑使用的是低位存储变量的类型信息,000 开头代表是对象,而 null 全部表示为全0,所以会错误的判断为 object 。
接下来灵魂拷问篇 - 1:
相信大家在面试中、高级前端的时候经常会问到关于原型、原型链、作用域、作用域链、eventLoop机制、this指向等问题,结合这些知识点我们来分析下面的面试题:
NO.1
![5df9a06db15bcdcc1d7853669c608872.png](https://i-blog.csdnimg.cn/blog_migrate/8b0aaf87b6a202d5270bae1b3777b5fe.png)
答案是:"local scope" 简单的闭包使用相信大家都知道结果,内层函数f()访问到了外层函数checkscope()内的scope值为“local scope”的变量,最终返回执行后的scope值。
闭包真好用,避免变量全局污染,对于闭包内未使用的变量要及时清除,垃圾回收机制GC不会对闭包内的变量进行回收, 滥用闭包会造成内存溢出,非常消耗性能的,这可是大忌。
NO.2
![78d15dbe208a05601e5a68cf03286764.png](https://i-blog.csdnimg.cn/blog_migrate/d91b39cf9b590a6b761e7cd3f53d6619.png)
会输出什么呢? 咦~ 貌似和上面的题一样,结果还是会输出"local scope" 和上一题不同之处在于第一题返回执行后的结果,而这题返回一个未执行的函数,这个函数在checkscope函数外部调用的。
NO.3
![05cd6cc807d0ec168276b7d057f2e61f.png](https://i-blog.csdnimg.cn/blog_migrate/bfef558e02213e422e1ed790a347baf0.png)
执行结果会是什么呢?
答案:
undefined
1
undefined
undefined
执行fn(),第一个会输出全局变量的1吗?no,使用var定义的变量存在变量提升,在函数体内变量a未定义就使用首先会输出 undefined,接下来代码走到this.a,这时this指向全局的window,也就是 this.a 等价于 window.a , 此时会打印1。
执行new fn(),fn函数被实例化,构造函数fn在创建时确定this指向,此时this会指向fn,第一个输出的变量a未声明就使用还是会输出 undefined,当代码执行到this.a ,fn.a找不到所以输出undefined。
NO.4
![72f3189c33201c5a328e1f7fcc8edd42.png](https://i-blog.csdnimg.cn/blog_migrate/83f7f0a202b166b28033b4c4d71bdd11.png)
这道题很简单,相信大家都能答对,希望大家也能知道是什么原因?
在函数传参的时候传递的是对象在堆中的内存地址值,fn函数中的实参obj是obj对象的内存地址,通过调用obj.a= 2就改变了它在堆内存中的值。
对上一题做一个扩展,直接上代码
![02ff7d83bc70cdbc758d70ce115e0a9d.png](https://i-blog.csdnimg.cn/blog_migrate/1ff98643956ea3c5819361fb9e7641ce.png)
答案:
p1:{name: “lisi”, age: 21}
p2:{name: “zhangsan”, age: 12}
fn函数中的实参person是p1对象的内存地址,通过调用person.age = 21改变了p1的值,但随后person变成了另一块内存空间的地址,并且在最后将另外一份内存空间的地址返回,赋给了p2,所以p2是一个新返回的对象。
看完上面的题感觉怎么样?自己是否答对了,前端知识体系是一个积累、沉淀和不断学习的过程,希望每一位前端工程师能做到知其然,知其所以然,路漫漫其修远兮,大家加油吧!~
---作者:Eiji