js面试题2(es6,原型)

es6
const,let,var的区别?
const定义的变量不可修改,定义时必须初始化;const一般在require一个模块的时候用或者定义一些全局常量
let声明的变量是块级作用域,不能重复声明;
var 声明的变量是全局作用域,有变量提升(声明提到了最前面),可以重复声明。

const对象的属性可以修改吗?
可以;const 指针指向的地址不可以变化,指向地址的内容可以变化。

new一个箭头函数会怎么样?
会抛出错误。
箭头函数不可以使用new实例化,这是因为因为箭头函数没有prototype也没有自己的this指向并且不可以使用arguments。

箭头函数和普通函数的区别?
箭头函数不能用于构造函数,不能使用new,没有原型,不能使用arguments
this指向不同:普通函数this指向调用它的对象,箭头函数本身没有this,只能向外层代码捕获this

箭头函数的this指向哪里?
1.箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象);箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。

扩展运算符的作用及使用场景?
扩展运算符就是三个点“…”,就是将对象中的每个元素都一个个的迭代并取出来使用
使用场景:
1.合并数组
b = […a1,…a2,…a3]
2.给函数传参
fun1(…arguments)
3.与解构配合赋值
let [var1,…arr5] = [1,2,3,4,5,6]
var1–1
arr5–[2,3,4,5,6]
(注意,扩展运算符只能用在最后一个;
let […a]=[1,2,3]这样也可以,同let a=[1,2,3])

Proxy可以实现什么功能?
它可以实现数据响应式。
Proxy 是 ES6 中新增的功能,它可以用来自定义对象中的操作。
他可以做什么?
代理类
深层取值
管道

对对象和数组的解构的理解?
数组结构,赋值一一对应,结构必须保持一致;
对象解构的赋值结构可以不一致,通过对象的属性名取值
const obj = {name:‘100’,age:‘30’,size:‘M’}
const { Size,name,myAge } = obj
console.log(name) //100
console.log(myAge) //undefined

(了解)如何提取高度嵌套的对象里面的指定属性?
写一个 safeGet 函数来更好的handle这种问题,我们可以用 Array.reduce 来完成这个函数:
const safeGet = (obj, path) => (
path.reduce((obj, key) => (
(obj && (typeof obj[key] !== ‘undefined’)) ? obj[key] : undefined
), obj);
)
// 我们可以用 safeGet 函数来获取任意层次的嵌套对象了
const user = {
id: 100,
email: ‘troy@google.com’
};
safeGet(user, [‘id’]); // 100
safeGet(user, [‘email’]); // ‘troy@google.com’
safeGet(user, [‘info’]); // undefined
safeGet(user, [‘info’, ‘name’]); // undefined
safeGet(user, [‘info’, ‘name’, ‘fly’, ‘whatever’]); // undefined
// 我们同样能够用 safeGet 函数来获取嵌套对象里的数组元素
const anotherUser = {
id: 101,
email: ‘dev@google.com’,
info: [‘Living in USA’, ‘she is 18’]
};
safeGet(anotherUser, [‘info’, 0]); // ‘Living in USA’
safeGet(user, [‘info’, 1]); // ‘she is 18’
safeGet(user, [‘info’, 2]);//undefined

对rest参数的理解?
所谓的rest,顾名思义就是获取剩余的参数,函数中所有多余的参数都会放进数组中然后赋值给这个rest参数。
rest参数必须放最后。
若没有剩余参数,则rest为[]。
rest可以使用数组方法。
function foo(a1,…args){
console.log(args);
}
foo(1,2,3,4,5,6); //a1值为1,rest为2,3,4,5,6

es6中模板语法与字符串处理?
模板字符串使用 `` 反引号表示,需要使用变量时,通过 ${} 插入变量。

原型
对原型,原型链的理解?
原型是定义了一些公用的属性和方法的类(对象模板),利用原型创建出来的新对象实例会共享原型的所有属性和方法。

每个对象拥有一个原型对象,通过 proto 指针指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null(Object.proptotype.__proto__指向的是null)。这种关系被称为原型链(简要概述:原型对象也可能有原型,像一条链子一样)

原型链解决的主要是继承问题。

prototype 和 proto 区别是什么?
1)prototype是构造函数的属性
2)__proto__是每个实例都有的属性,可以访问 [[prototype]] 属性
3)实例的__proto__与其构造函数的prototype指向的是同一个对象

hasOwnProperty 函数:可以用来检查对象自身是否含有某个属性,返回值是布尔值,当属性不存在时不会向上查找对象原型链,hasOwnProperty是 JavaScript 中唯一一个处理属性但是不查找原型链的函数
4)getOwnPropertyNames 函数:可以获取对象所有的自身属性,返回值是由对象自身属性名称组成的数组,同样不会向上查找对象原型链

隐式原型(proto):上面说的这个原型是JavaScript中的内置属性[[prototype]],此属性继承自object对象,在脚本中没有标准的方式访问[[prototype]],但Firefox、Safari和Chrome在每个对象上都支持一个属性_proto_,隐式原型的作用是用来构成原型链,实现基于原型的继承
显示原型(prototype):每一个函数在创建之后,便会拥有一个prototype属性,这个属性指向函数的原型对象,显示原型的作用是用来实现基于原型的继承与属性的共享

原型修改和重写?
给原型添加一些新的属性,对象实例仍然能继承到原型新添加的属性,原因是我们只是给原型添加了新的属性,但是原型还是那个原型,所以可以向上访问到原型的新添加属性。

重写也就是说将构造函数的prototype指针从原来的原型对象指向了新的原型对象,实例对象将访问不到原来的原型对象的属性和方法。

原型链最终指向?怎么打印?
原型链最终的指向是Object的prototype, 而Object中的__proto__是null
console.log(Object.prototype.proto)

如何获得对象非原型链上的属性?
getOwnPropertyNames 函数:可以获取对象所有的自身属性,返回值是由对象自身属性名称组成的数组,同样不会向上查找对象原型链

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值