1. Js的Typeof返回类型有那些?
string;undefined;number; function;object;boolean;symbol(ES6)
2. null和undefined的区别?
null是Js的关键字,表示空值。可作为object的一个特殊值,如果object值为null,表示该对象不是一个有效对象。
undefined不是Js的关键字,是一个全局变量,是Global的一个属性。
- 类型不一样;typeof(null) == "object",typeOf(undefined) == "undefined"
- 转化为值时不一样:undefined为NaN ,null为0, 即Number(null)==0,Number(undefined) == NaN
相同点:
都是原始类型的值,保存在栈中变量本地
3. 闭包的特性,闭包解决了什么问题?
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
特性
1、函数嵌套函数。
2、函数内部可以引用外部的参数和变量。
3、参数和变量不会被垃圾回收机制回收。
用途
1、闭包可以读取函数内部变量
2、将函数内部变量的值始终保存在内存中
优势
1、保护函数内的变量安全。
2、在内存中维持一个变量。
3、通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)。
4、避免全局变量的污染。
4. 数组方法pop() push() unshift() shift()
push()尾部添加 pop()尾部删除
unshift()头部添加 shift()头部删除
5. ”==”和“===”的不同
答案:前者会自动转换类型,再判断是否相等
后者不会自动类型转换,直接去比较
6. 说说对 prototype和 __proto __ 的理解
prototype是函数才有的属性,prototype本身也是个函数对象;__proto __是所有对象都有的属性,__proto __指向构造它的对象的对象的prototype。
7. 使用构造函数实现一个类Foo,需要有属性 count, 方法bar(), 并且写出创建该类对象的方法
function Foo(){ this.count = 0; } Foo.prototype.bar = function(){ } var foo = new Foo(); foo.bar();
8. 说说ES6为什么要引入let关键字
因为要解决var声明对象产生的问题。var是函数级作用域,而let是块作用域。var存在变量提升,即变量可以在声明之前使用,值为undefined,而let声明的变量如果在声明之前使用会抛出一个错误。另外let不允许重复声明变量。ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。