前端基础题

234 阅读9分钟

JavaScript中如何检测一个变量是一个String类型?请写出函数实现

function isString(obj){
    return typeof(obj) === "string"? true: false;
    // returntypeof obj === "string"? true: false;
}
function isString(obj){
    return obj.constructor === String? true: false;
}
function isString(obj){
     return Object.prototype.toString.call(obj) === "[object String]"?true:false;
}
如:
var isstring = isString('xiaoming');
console.log(isstring);  // true

如何获取浏览器URL中查询字符串中的参数?

function showWindowHref(){
    var sHref = window.location.href;
    var args = sHref.split('?');
    if(args[0] == sHref){
        return "";
    }
    var arr = args[1].split('&');
    var obj = {};
    for(var i = 0;i< arr.length;i++){
        var arg = arr[i].split('=');
        obj[arg[0]] = arg[1];
    }
    return obj;
}
var href = showWindowHref(); // obj
console.log(href['name']); // xiaoming

js 字符串操作函数

concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串。
indexOf() – 返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回 -1 。
charAt() – 返回指定位置的字符。
lastIndexOf() – 返回字符串中一个子串最后一处出现的索引,如果没有匹配项,返回 -1 。
match() – 检查一个字符串是否匹配一个正则表达式。
substr() 函数 -- 返回从string的startPos位置,长度为length的字符串
substring() – 返回字符串的一个子串。传入参数是起始位置和结束位置。
slice() – 提取字符串的一部分,并返回一个新字符串。
replace() – 用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配的字符串。
search() – 执行一个正则表达式匹配查找。如果查找成功,返回字符串中匹配的索引值。否则返回 -1 。
split() – 通过将字符串划分成子串,将一个字符串做成一个字符串数组。
length – 返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。
toLowerCase() – 将整个字符串转成小写字母。
toUpperCase() – 将整个字符串转成大写字母。

怎样添加、移除、移动、复制、创建和查找节点?

 1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点

2)添加、移除、替换、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替换
insertBefore() //插入

3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性

比较typeof与instanceof?

相同点:JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。

不同点:
typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")}

function test(){};
var a = new test();
alert(a instanceof test)   // true

如何理解闭包?

var count=10;   //全局作用域 标记为flag1
function add(){
    var count=0;    //函数全局作用域 标记为flag2
    return function(){
        count+=1;   //函数的内部作用域
        alert(count);
    }
}
var s = add()
s();//输出1
s();//输出2

使用闭包的注意点

1)滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

什么是跨域?跨域请求资源的方法有哪些?

由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。存在跨域的情况:
网络协议不同,如http协议访问https协议。
端口不同,如80端口访问8080端口。
域名不同,如qianduanblog.com访问baidu.com。
子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com。
域名和域名对应ip,如www.a.com访问20.205.28.90.

跨域请求资源的方法

1、porxy代理
2、后端人员在处理请求数据的时候,添加允许跨域的相关操作
3、jsonp。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会立即执行
<script>
    function testjsonp(data) {
       console.log(data.name); // 获取返回的结果
    }
</script>
<script>
    var _script = document.createElement('script');
    _script.type = "text/javascript";
    _script.src = "http://localhost:8888/jsonp?callback=testjsonp";
    document.head.appendChild(_script);
</script>

缺点:
1、这种方式无法发送post请求(这里)
2、另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定。

什么是盒子模型?

内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分

行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

行内元素:a、b、span、img、input、strong、select、label、em、button、textarea
块级元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote
空元素:即系没有内容的HTML元素,例如:br、meta、hr、link、input、img

CSS实现垂直水平居中

简述同步和异步的区别

同步是阻塞模式,异步是非阻塞模式。
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

sessionStorage 、localStorage 和 cookie 之间的区别

共同点:用于浏览器端存储的缓存数据
不同点:
(1)、存储内容是否发送到服务器端:当设置了Cookie后,数据会发送到服务器端,造成一定的宽带浪费;
web storage,会将数据保存到本地,不会造成宽带浪费;
(2)、数据存储大小不同:Cookie数据不能超过4K,适用于会话标识;web storage数据存储可以达到5M;
(3)、数据存储的有效期限不同:cookie只在设置了Cookid过期时间之前一直有效,即使关闭窗口或者浏览器;
sessionStorage,仅在关闭浏览器之前有效;localStorage,数据存储永久有效;
(4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;

document load和document ready的区别?

共同点:这两种事件都代表的是页面文档加载时触发。
异同点:
ready 事件的触发,表示文档结构已经加载完成(不包含图片等非文字媒体文件)。
onload 事件的触发,表示页面包含图片等文件在内的所有元素都加载完成。

vue中key的作用

的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。

vue中兄弟组件的数据传递的方式

子传父,父传子,eventBus,vuex

vue中强制更新一个组件的生命周期的方式

<cmp v-if="reset"></cmp>
this.reset = false
this.$nextTick(() => {
this.reset = true
})

vue中计算属性和watch的区别

计算数据监听多个
watch监听一个

怎么理解vue的响应式数据,怎么讲非响应式数据设置成响应式

在实例前声明:响应式
在实例后声明:非响应
vue.set()

vuex有哪几种属性?

有五种,分别是 State、 Getter、Mutation 、Action、 Module
state
Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。
mutations
mutations定义的方法动态修改Vuex 的 store 中的状态或数据。
getters
类似vue的计算属性,主要用来过滤一些数据。
action 
actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。
Module 
模块化Vuex

css只在当前组件起作用

在style标签中写入scoped即可 例如:<style scoped></style>

v-if 和 v-show 区别

v-if按照条件是否渲染,v-show是display的block或none

route和router的区别

route是一个跳转的路由对象,每一个路由都会有一个route对象,是一个局部的对象,可以获取对应的name,path,params,query
router是VueRouter的一个对象,通过Vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对象,这个对象中是一个全局的对象,他包含了所有的路由包含了许多关键的对象和属性。

vue常用的修饰符?

.prevent: 提交事件不再重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素本身而不是子元素的时候会触发;.capture: 事件侦听,事件发生的时候会调用

vue等单页面应用及其优缺点

优点:Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好。
缺点:不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化

keep-alive的作用是什么?

keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 
例:
<!-- 逗号分隔字符串,只有组件a与b被缓存。 -->
<keep-alive include="a,b">
  <component></component>
</keep-alive>

<!-- 正则表达式 (需要使用 v-bind,符合匹配规则的都会被缓存) -->
<keep-alive :include="/a|b/">
  <component></component>
</keep-alive>

<!-- Array (需要使用 v-bind,被包含的都会被缓存) -->
<keep-alive :include="['a', 'b']">
  <component></component>
</keep-alive>
 

vue生命周期有哪些?

总共分为8个阶段
beforeCreate----创建前	组件实例更被创建,组件属性计算之前,数据对象data都为undefined,未初始化。
created----创建后	组件实例创建完成,属性已经绑定,数据对象data已存在,但dom未生成,$ el未存在
beforeMount—挂载前	vue实例的$el和data都已初始化,挂载之前为虚拟的dom节点,data.message未替换
mounted-----挂载后	vue实例挂载完成,data.message成功渲染。
beforeUpdate----更新前	当data变化时,会触发beforeUpdate方法
updated----更新后	当data变化时,会触发updated方法
beforeDestory—销毁前	组件销毁之前调用
destoryed—销毁后	组件销毁之后调用,对data的改变不会再触发周期函数,vue实例已解除dom监听和数据绑定,但dom结构依然存在

vue的两个核心点

数据驱动:ViewModel,保证数据和视图的一致性。
组件系统:应用类UI可以看作全部是由组件树构成的。

SPA首屏加载慢如何解决

路由懒加载 ;使用CDN资源等。

Vue-router跳转和location.href有什么区别

使用location.href 刷新了页面;
使用Vue-router无刷新页面,静态跳转;

css里加上[v-cloak]的作用

隐藏花括号{{}}

路由懒加载实现方式,注释语法的作用

const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
/* webpackChunkName: "group-foo" */路由下的所有组件都打包在同个异步块 (group-foo) 

vue-router 的全局钩子函数

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  // ...
})
router.afterEach((to, from) => {
  // ...
})

路由的模式(mode)有哪些,作用是什么

history:URL 就像正常的 url
hash:路由带 # 号

axios是什么?拦截器有哪些?拦截器作用是什么?

Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求
request拦截器和response拦截器
request拦截器一般在header里面打上token等逻辑
response拦截器一般根据后端状态码做相应的需求处理

axios发送http请求失败,怎么捕获?

catch捕获

http中content-type 有哪几种,对应的请求get和post请求参数传递具体表现形式?

application/x-www-form-urlencoded 
默认。在发送前对所有字符进行编码(将空格转换为 “+” 符号,特殊字符转换为 ASCII HEX 值)。
application/json
multipart/form-data 
不对字符编码。当使用有文件上传控件的表单时,该值是必需的。
text/xml

application/json时候表现为request payload {key1:value1,key2:value2}
application/x-www-form-urlencoded 表现为key1=value1&key2=value2
和multipart/form-data  表现为formData

qs.stringify的作用

例:{key1:value1,key2:value2} 转化为key1=value1&key2=value2

js中的异步Promise、Generator、async之间的区别

Promise将原来的用 回调函数 的 异步编程 方法转成用relsove和reject触发事件, 用 then 和 catch 捕获成功或者失败的状态执行相应代码的异步编程的方法
Generator函数是将函数分步骤阻塞 ,只有主动调用next()才能进行下一步
例:
function *fetch() {
   yield ajax('XXX1', () => {})
   yield ajax('XXX2', () => {})
   yield ajax('XXX3', () => {})
}
let it = fetch()
let result1 = it.next()
let result2 = it.next()
let result3 = it.next()

async函数就相当于自执行的Generator函数, await 的部分等待返回, 返回后自动执行下一步
await 内部实现了 generator,其实 await 就是 generator 加上 Promise的语法糖,且内部实现了自动执行 generator