链接:https://www.nowcoder.com/discuss/90910?type=2&order=0&pos=18&page=1
来源:牛客网
2018-08-05拼多多前端笔试题
1.如何改变this的指向?
This对象是在运行时基于函数的执行环境绑定的:
1) 在全局函数中,this等于window(匿名函数的执行环境具有全局性,因此this对象指向window)
2) 当函数被作为某个对象的方法调用时,this等于那个对象
解析思路:如果是全局环境,就是window,如果是对象调用,就是obj,如果不知道上下文环境,还是window吧
详细解析
改变this的指向:通过bind(),call(),apply()改变函数执行环境的情况下,this就会指向其它对象。
2.设计函数输出数组里面的重复元素
先进行第一轮排序,排完之后的结果,就是1,1,2,3,3,3,4,4,5。如果是这样的数组中找重复的就好办了,直接就是 arr[0]与arr[1]比较,依此类推,相等就是重复的.
var arr = [1,2,4,4,3,3,1,5,3];
function duplicates(arr) {
var newArr=[];
arr.sort();
for(var i =0;i
3.undefined和null的区别?
Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined。null是javascript的关键字,可以认为是对象类型,它是一个空对象指针,和其它语言一样都是代表“空值”,不过 undefined 却是javascript才有的。它是一个预定义的全局变量。没有返回值的函数返回为undefined,没有实参的形参也是undefined。
4.foreach和map的区别
forEach()方法:对数组的每一个元素都执行一次提供的函数
返回值: undefined
该方法不会改变原来的数组,只是将数组中的每一项作为callback的参数执行一次。
map()方法:map()方法创建一个新的数组,其结果是该数组中的每个元素都调用一次callback后返回的结果,同样,该方法不改变原有的数组
返回值: 新数组,每个元素都是回调函数的结果。
5.什么是伪数组,把伪数组转换为数组
无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push,pop等方法,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。可以使用Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象。
6.跨域产生的原因及解决办法?
跨域问题来源于JavaScript的同源策略,即只有 协议+域名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。
解决办法:
1) Jsonp 需要目标服务器配合一个callback函数
2) 通过修改document.domain来跨子域
3) 使用window.name+iframe来进行跨域
4) 跨文档消息传输window.postMessage
5) 通过CORS解决AJAX跨域
6) 通过设置Access-Control-Allow-Origin
7) 通过Nginx反向代理
7.CSS实现左边固定右边200px自适应
实现一个div,左边固定div宽度200px,右边div自适应
8. JavaScript里面0.1+0.2!=0.3的原因
在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果为 false
1. CSS实现动画有哪些方式:
2. 题目描述:
let arr1=[1,2,3];
let arr2=[4,5,6];
如何合并这两个数组:
let arr1=[1,2,3];
let arr2=[4,5,6];
// 第一种:
console.log(arr1.concat(arr2))
// 第二种:
Array.prototype.push.apply(arr1,arr2)
console.log(arr1)
3.编写一个输出日志的函数log,在输出内容前面加上前缀(app),如:
关于Array.prototype.slice
log(“Hello world”)返回“(app)Hello world”
log(“Hello”,”world”)返回”(app)Hello world”
function log(){
//Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组
var args = Array.prototype.slice.call(arguments).map(stringify);
// console.log.apply(console,args);
var t=args.toString().replace(',',' ')
console.log('(app)'+t)
}
function stringify(arg) {
return arg;
}
log( 'hello','world');
4.当代码var a=new A(‘testa’)执行时,会发生什么?
5.使用typeof bar===”object”判断bar是不是一个对象有什么弊端?如何避免这种弊端?
用typeof来判断类型,只有‘boolean’、‘number’、’string’、‘function’四种类型是靠谱的
尽管 typeof bar === "object" 是检查 bar 是否对象的可靠方法,令人惊讶的是在JavaScript中 null 也被认为是对象,即console.log(typeof null === 'object'); //true!
typeof bar === "object" 并不能准确判断 bar 就是一个 Object。
可以通过 Object.prototype.toString.call(bar) === "[object Object]" 来避免这种弊端
6. 简述一下什么是浅拷贝,什么是深拷贝,如何实现?
7. 快速排序
function quickSort(arr) {
if(arr.length<=1){
return arr;
}
var pivotIndex=Math.floor(arr.length/2);
var pivot=arr.splice(pivotIndex,1)[0]
var left=[];
var right=[];
for(var i=0;i
8. json转换
将数组obj格式:
var obj = [
{id:1, parent: null},
{id:2, parent: 1},
{id:3, parent: 2},
];
转换为obj2格式:
var obj2 = {
obj: {
id: 1,
parent: null,
child: {
id: 2,
parent: 1,
child: {
id: 3,
parent: 2
}
}
}
}
答案如下:
var obj2 = {};
function createObj2(obj, child){
if(child.parent){
if(obj.obj){
createObj2(obj.obj, child);
}else{
if(obj.id === child.parent){
obj.child = {
id: child.id,
parent: child.parent,
}
}else{
if(obj.child){
createObj2(obj.child, child);
}else{
console.log('obj2未匹配到对应的parent对应关系')
}
}
}
}else{
obj.obj = {
id: child.id,
parent: child.parent,
child: {}
}
}
}
obj.forEach((item, item_i) => {
createObj2(obj2, item)
})
console.log('obj2:', obj2)
other
function arr2obj(obj, parent)
{
let targetObj;
obj.forEach(function(obj) {
if (obj.parent === parent)
{ targetObj = obj; }
});
if (targetObj) {
targetObj.child = arr2obj(obj, targetObj.id);
if (!targetObj.child) { delete targetObj.child; }
if (!targetObj.parent) { targetObj = { obj: targetObj } }
}
return targetObj;
}