js常见面试题及简单回答
一 h5新特性:
1, 新增了语义化标签
header,footer,article,aside,section,nav,hgroup,time,main等
2,新增表单控件
email,tel,url,number,range,search,color,
3 表单属性
palceholder 输入框提示
autofocus 表单获取输入焦点
required 必填字段
4 本地存储
4.1localStorage
储存时间:除非手动清除,永久保存,
大小:20MB
4.2 sessionsStorage
储存事件:关闭页面则消失
大小:5MB
二 css3新特性
1圆角
border-radius
2 阴影
bos-shadow
3 盒子模型
border-box:border-box(高宽不再受内边距和边框的影响)
4 过渡,动画
transform(旋转),scale(缩放),translate(定位) transition(过渡)
5,flex伸缩盒子
6 新增属性选择器
E[data] —— 选择带有data属性的元素对象
E[data=“one”] —— 选择带有data属性的元素对象且属性值为one
E[data^=“o”] —— 选择带有data属性的元素对象且属性以o开头
E[data$=“e”] —— 选择带有data属性的元素对象且属性以e结尾
E[data*=“n”] —— 选择带有data属性的元素对象且属性包含n
三 es6语法
es6新增了块级作用域,let声明的变量只能在作用域内使用,取消了变量提升
const 用来声明常量,声明后不可更改 新增箭头函数(变量1,变量2)=>{};
3.1解构数组和对象:
let arr = [2, 3, 5];
let [a, b, c] = arr;
console.log(a); //2
console.log(b);//3
let obj = {
uname: ‘张三’,
age: 23,
sex: ‘男’
}
let {
uname: a1,
age: b1,
sex: c1
} = obj;
console.log(a1); //张三
console.log(b1);//23
console.log(c1);//男
3.2快速为对象赋值
let uname = ‘张三’
let sex = ‘男’
let age = 19;
let obj = {
uname,
age,
sex
};
console.log(obj);打印结果:
四 this指向问题
五 js继承的方式
1,类的继承(使用extends关键字)
class Father {constructor(x, y) {this.x = x;this.y = y;}sum() {console.log(this.x + this.y);}}class Son extends Father {constructor(x, y) {super(x, y); //调用了父类中的构造函数}}var son = new Son(1, 2);var son1 = new Son(11, 22);son.sum();son1.sum();
2,子构造函数继承父构造函数中的属性和方法
// 借用父构造函数继承属性// 1. 父构造函数function Father(uname, age) {// this 指向父构造函数的对象实例this.uname = uname;this.age = age;}// 2 .子构造函数 function Son(uname, age, score) {// this 指向子构造函数的对象实例Father.call(this, uname, age);this.score = score;}var son = new Son('刘德华', 18, 100);console.log(son);
使用父构造函数继承属性,使用原型对象继承方法:
通过call改变this的指向,将this指向为子构造函数本身
function Father(uname, age) { //this指向父构造函数的对象实例 this.uname = uname; this.age = age; } Father.prototype.money = function () { //父构造函数的原型对象上面增加的方法 return 11111111111 } //2,子构造函数 function Son(uname, age, sore) { //this指向子构造函数的实例对象 Father.call(this, uname, age) //先调用父,将指向改为子 this.sore = sore; //子构造函数自身属性 }Son.prototype = new Father(); //利用对象的方式改变了原型对象,需要利用constructor指回原对象Son.prototype.constructor = Son; //指回原对象Son.prototype.exat = function () {console.log('考试');}let son = new Son("刘德华", 23, 99)console.log(son.money());console.log(son);console.log(Father.prototype);
六 浅拷贝和深拷贝
浅拷贝:只拷贝第一层属性,更深层次的属性是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。注意:当内存销毁的时候,指向对象的指针,必须重新定义,才能够使用;改变更深层次赋值对象的属性时,原对象的属性也会改变
方法一:遍历对象for (var k in obj){}
let obj = {uname: 'zs',age: 22,msg: {sex: '男'}}let o = {}for (let k in obj) {o[k] = obj[k]}// o.msg.sex = '女'console.log(o);
改变o.msg.sex时,obj里面的值也会变
方法二:Object.assign(o, obj); assign es6新增语法糖,第一个参数为拷贝后的对象,第二个参数为要拷贝的对象,
let obj = {uname: '张三',age: 18,msg: {sex: '男'}}let o = {}Object.assign(o, obj); //ES6新增语法糖 console.log(o);o.uname = '李四'o.msg.sex = '女'console.log(o);console.log(obj); //浅拷贝会改变原来的数据 有就覆盖,没就添加
打印结果:
因为uname属性是第一层的,因此修改uname属性后并没有改变原对象的uname值,但是sex属性在msg对象中,属于深层次的,由于浅拷贝只拷贝了地址,因此改变了msg里面的sex后,原对象中的sex属性值也发生了变化;
深拷贝:拷贝多层,开辟一个独立的空间,将所有东西都拷贝进来,
方法:
let o1 = {}deepCopy(o1, obj)o1.msg.sex = '女'console.log(o1);console.log(o);function deepCopy(newobj, oldobj) {for (let k in oldobj) {//先判断数据类型//1,获取属性值 oldobj[k]let item = oldobj[k];//2先判断是否为数组if (item instanceof Array) {newobj[k] = [];deepCopy(newobj[k], item) //再次遍历,遍历的是数组 把值给属性// 3,判断是否为对象} else if (item instanceof Object) {newobj[k] = {};deepCopy(newobj[k], item) //再次遍历,遍历的是对象 把值给属性 } else {//简单数据类型newobj[k] = item;}}}
由于是深拷贝,所以改变深层的属性值也不会对原对象内容进行改变;
七 闭包的理解 应用场景
闭包:指有权访问另一个函数作用域中变量的函数
在当前作用域内使用了其他作用域中的局部变量
闭包的主要作用: 延伸了变量的作用范围
在js中,子函数可以使用父函数中的局部变量,因为子函数依赖父函数而存在;这样子函数就形成了闭包
八 原型链
原型链 由 构造函数,原型对象,实例对象组成,实例对象通过对象原型使用原型对象中的方法,
如果没有就通过原型对象中的__proto去Object原型对象中查找,一层层向上查找;
就是一个函数调用它本身不存在的方法,通过原型链一层层向上查找;
kk可以调用Object原型对象和Star原型对象中的方法;
详细说明:https://blog.csdn.net/weixin_44134588/article/details/108101633
九 数组去重
这里提供三种方法
var arr = [1, 2, 3, 6, 7, 4, 2, 5, 8, 4, 3, 6, 5];var newarr = [];// 传统遍历for (var n = 0; n < arr.length; n++) {if (newarr.indexOf(arr[n]) === -1) {newarr.push(arr[n]);}}console.log(newarr);//set数据结构var newArr = new Set(arr); //set数据结构实现快速去重let newArr2 = [...newArr] //存入数组中console.log(newArr2);// filter方法let newArr1 = arr.filter(function (value, index, self) {return self.indexOf(value) === index //判断索引值是否===在数组中的索引值,如果等,则返回,后面的重复元素因为返回的索引值不等,所以不被返回})console.log(newArr1);
十 js中的三个包装对象
String、Number、Boolean 可以通过new创建
十一 在数组中查找某一个值,可以用哪些方法?
find ,filter some
js常见面试题及简单回答相关推荐
- vue.js 常见面试题_使用Vue.js时应避免的常见错误
vue.js 常见面试题 Looking for a front-end framework to try out, I started with React and then tried Vue.j ...
- Node.js常见面试题
Node.js常见面试题 1.NodeJS中的this为什么是一个空对象? 2.NodeJS中为什么可以直接使用exports.require.module.__filename.__dirname? ...
- JS 常见面试题 - 事件循环机制
一.浏览器JS异步执行的原理 一般常说js是一门单线程语言,那为什么可以异步执行且不发生阻塞呢? 常说的JS是单线程语言,是因为执行JS的引擎是单线程的,而浏览器本身是多线程的 浏览器主要含有: js ...
- js常见面试题(二)
原型和原型链 原型链:当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造 ...
- List集合中的常见面试题以及简单思路
1.集合框架(简介.Collection方法.迭代器) Collection就是相当容器 特殊的方法有iterator;相当于抓娃娃机中的夹子,把容器的元素取出的工具 <面试题 一.集合的rem ...
- 使用原生JS求一段字符串出现最多的次数和最少的次数,最大值和最小值(JS常见面试题)
直接看代码(一把梭也可以): let strings = 'aqqwwqqaaasddvvccxxxx..........' let obj = {}; for (let i = 0; i < ...
- 前端常见面试题 - JS篇
以下会是JS常见面试题: 面试题将会以系列不定时更新,编写不宜,如有用到,请动动小手关注一下. 1. 简述ES6 1. let: 块级作用域. 2. const: 常量; 块级作用域; 一旦声明, 则 ...
- SpringMVC常见面试题总结(超详细回答)
1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,C ...
- 前端常见面试题之----js单线程,微任务宏任务
js单线程,微任务宏任务 前言 一.什么是单线程? 二.为什么JS是单线程? 三.任务队列 1. 什么是任务队列 2. 什么是微任务宏任务 四.常见面试题例子 总结 前言 他来了他来了,前端必问题之一 ...
最新文章
- 《Total Commander:万能文件管理器》——第2.3节.下载与安装
- Java中的队列同步器AQS
- 修复bug的12个关键步骤:
- FFT C语言 修改了matlab
- POJ1330-Nearest Common Ancestors【tarjan,LCA】
- centos ping不通百度 ping不通外网
- python3萌新入门笔记_我的Python3萌新入门笔记
- MySQL有什么新功能?
- linux下qt生成dll,Qt 创建和使用动态链接库 - cibiren2011的专栏
- 博客频道 - CSDN.NET...
- TSynDBDataSet内存表
- Python存储和读取数据
- c语言对字符串逆序,【C语言】 字符串逆序
- 如何使用加密狗加密自己程序
- 稳压二极管工作原理与使用
- Python —— excel 创建 复制 删除,获取最大行列
- 通过nginx实现线上页面访问本地接口
- keras 自定义Layer
- 超强 SVN 对比 excel 工具 Spreadsheet Compare使用方法
- input 使用outline属性去掉淡蓝色边框不生效
- C++鲜为人知的符号