js 面试题第一部分

1,用js实现数组反转

方法一:
var arr = [1,2,3,3,4]
arr.reverse();
方法二:
var arr    = [1,2,3,3,4]
var newArr = Array()
for(var i = 0;i<arr.length;i++){
    newArr.unshift(arr[i])
}
console.log(newArr)
方法三:
a      = [1,2,3]
newarr = [...a].map(a.pop,a)
console.log(newarr)
//pop从后面删除元素,只能是一个,返回值是删除的元素

方法四:
var arr = new Array(1, 2, 3, 4, 5);
var res = new Array();
for (var i = arr.length-1; i >= 0; i--) {
    res.push(arr[i]);
}
arr = res;
console.log(arr);

方法五:
var a = new Array(1, 2, 3, 4, 5);
var b =new Array();
while(a.length){
    b.push(a.pop())
}
console.log(b);
方法六:
for(var i=0;i<arr.length;i++){
   //元素下标的长度=长度-1-i
    arr1[i]=arr[arr.length-1-i];
}
console.log(arr1)

注:引申问题,数组的去重,es6,原生方法等。。。

2, 用es6一行代码实现数组去重

   var arr=[1,2,4,5,7,4,1,4,2,21,4]
   var set=[...new Set(arr)]//转换数组
   var set=Array.from(set)//非数组转换数组
   console.log(set)
   
   1,用es6的Set的唯一特性这玩意,实现去重,当然他生成的是为数组,所以要用Array.from

3,typeof可以检测哪些数据类型

number Boolean string object undefined function

4,从一个 url地址输入到页面呈现在用户面前发什么了什么?

答:
DNS解析:将域名解析为IP地址
Tcp的三次连接:tcp的三次挥手{
	浏览器是否可以发送请求
	服务端浏览段可以发送请求
	浏览器端向服务器发送请求
}
发送HTTP请求,请求头
服务器处理请求返回HTTP报文,响应头
浏览器解析渲染页面
断开连接tcp四次挥手

三次握手:

	1,告诉服务端我要请求了,就问你允许不
	2,服务端收到访问响应一下说“可以”
	3,客服端说“那好我来了”
	
四次挥手:
	1,客户端说我不想和你合作了,想结束咱俩的关系
	2,服务端收到,表示说知道并且确认了,这个时候客户端就是等待状态离婚
	3,服务端,发送请求告诉客户端说完成财产分割,可以关闭了
	4,客户端收到,就给服务器说确认了没问题,然后就关了

5,js 数组常用方法

	   1.pop() 删除并返回数组的最后一个元素
       2.push()    表示向数组的末尾添加一个或多个元素
       3.shift()    表示删除并返回数组的第一个元素
       4.splice()   删除一个元素并且向删除的元素位置添加一个新元素
       5.unshift()  表明向数组的开头添加一个元素或多个元素并且返回新的长度
       6.sort()    表明对数组的元素进行排序,一般是升序排列
       7.reverse()   表示颠倒数组中元素的顺序
       8.toString()    表示把数组转化为字符串并返回结果
       9.slice()    表示从某个已有的数组返回选定的元素
       10.join()     把数组的所有元素放入一个字符串
       11.indexOf(el)   从头(序号0)开始查找元素 
       12.lastIndexOf(el)   从尾部(序号1)开始查找元素

6,js常用的字符串方法

`toUpperCase` :把小写字母转成大写 
`toLowerCase` 把大写转小写 
`charAt` :通过索引获取字符 
`charCodeAt` :通过索引获取对应字符的Unicode编码; 
`substr` :截取 substr(m,n) 从索引m开始,截取n个字符; 
`substring`: substring(m,n):从索引m开始,截取到索引n,不包含n; (不支持负数) 
`slice(m,n)`:substring; 从索引m开始,截取到索引n,不包含n (支持负数) 
`indexOf` :检测字符在字符串中第一次出现的索引位置; 
`lastIndexOf` :检测字符在字符串中最后一次出现的索引位置; 
`split`: 把字符串按照特定的字符分隔数组中的每一项; 
`replace`:替换;原有字符串不变;用新字符替换旧的字符 
`concat` :拼接 
`trim` :去空格 : 去除字符串中左右的空格;

7,深拷贝,浅拷贝

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

我的回答是:浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化;深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发生变化;

但是面试官给我说:浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来;

浅拷贝实现:
(1)手动赋值
(2)Object.assign()
深拷贝方法:

(1)递归
(2)JSON.stringify结合JSON.parse
(3)递归拷贝
(4)...a

例如1:
var test={
    a:"ss",
    b:"dd",
    c:[
        {dd:"css",ee:"cdd"},
        {mm:"ff",nn:"ee"}
    ]
};
var test1 = JSON.parse(JSON.stringify(test));//拷贝数组,注意这行的拷贝方法

test1.c[0].dd="change"; //改变test1的c属性对象的d属性
console.log(test);  //不影响test
console.log(test1);

注: jquery extend方法实现深拷贝浅拷贝

8,Es6有哪些新特性

答:
1) let声明变量和const声明常量,两个都有块级作用域
2)模板字符串字符串方法扩展(startsWith()  判断字符串是否以特定的字串开始,endsWith()   判断字符串是否以特定的字串结束,还有字符串拼接 `` 反引号)
3)数组扩展方法
4) ... 展开运算符;结构赋值[a,b]=[b,a]
5) class类和继承
6) Promise 解诀异步回调async await
7)新增数据类型map set symbol(数据类型)
8)模块化expot导出 import导入 
9>箭头函数
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值