31.Void(0)的作用是什么?
- Void(0)用于防止页面刷新,并在调用时传递参数"zero"
- Void(0) 用于调用另外一种方法而不刷新页面
32.箭头函数和普通函数的区别
- 箭头函数是匿名函数不能作为构造函数,不能使用new操作符
- 箭头函数不绑定arguments获取实参的类数组,取而代之的是es6中的rest参数也就是…表示的拓展运算符解决
function fn1(x){
console.log(arguments)
}
var fn2=(...x)=>{
console.log(x)
}
var fn3=(x)=>{
console.log(arguments)
}
fn1(10); //[Arguments] { '0': 10 }
fn2(100) //[ 100 ]
fn3(10) //报错arguments is not defined
- 箭头函数没有原型属性
var fn1=()=>{
return 1;
}
function fn2(){
return 2;
}
console.log(fn1.prototype); //undefined
console.log(fn2.prototype) //fn2 {}
- 箭头函数的this永远指向其上下文的this,如使用call()、bind()、apply()只是传入了参数而已,对 this并没有什么影响也没有办法改变其指向,普通函数的this指向调用它的对象
var obj={
name:'zhangsan',
fn1:()=>{
console.log(this.name); //undefined
console.log(this) //在浏览器中指向的是window这个全局对象
},
fn2:function (){
console.log(this.name); //zhangsan
console.log(this) //{ name: 'zhangsan', fn1: [Function: fn1], fn2: [Function: fn2] }
},
fn3:function (){
return ()=>{
console.log(this.name) //zhangsan
}
}
}
obj.fn1()
obj.fn2()
fn1是一个箭头函数,然后它的 this是指向window,这是为什么呢?因为箭头函数捕获的是obj{}这个对象的环境,然后这个环境的this指向的是window,在fn3方法里面return的那个箭头函数捕获的是fn3:function(){}这个环境的this,而这个环境的this是obj
33.怎么获取对象的key值
- 通过
for in
遍历对象的所有的key值
function fn(){
const obj={
name:'zhansan',age:15};
for(let key in obj){
console.log(key) //遍历的是原型链中的
//obj3.hasOwnProperty()判断是否是该对象自己本身的属性
if(obj.hasOwnProperty(key)){
console.log(obj[key])
}
}
}
/*
name
age
*/
fn()
- 通过es6中的对象的构造函数的Object.keys()方法
function fn(){
const obj={
name:'zhansan',age:15};
console.log(Object.keys(obj)) //[ 'name', 'age' ]
}
fn()
34. 谈谈你对原型和原型链的理解
- js里所有的对象都有__proto__属性,对象的__proto__属性的值就是它所对应的原型对象。也可以说对象的__proto__指向自己构造函数的prototype
- 对于函数而言,只有函数才具有prototype属性,这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。而原型对象有两个属性,一个是constructor指针指向其构造函数,一个是__proto__属性:是一个对象,指向上一层的原型。
注意点:
Function.prototype
和Function.__proto__
为同一个对象。Oject/Array/String等等构造函数本质上和Function一样,均继承于Function.prototype
- 所以原型链就是由__proto__串起的路径就是原型链。原型链的尽头是Object