递四方面试题

1、vue中可以使用箭头函数吗?

methods中不可以使用箭头函数

methods:{
    test: () => {
        console.log(this)  //undefined(不是vue实例)
    }
}

2、遍历数组有哪些方法?

1)forEach()

遍历数组,没有返回值,默认返回undefined

var arr = [1,2,3,4,5]
arr.forEach(function(value, index, array) {
    console.log('数组元素' + value);
    console.log('数组索引' + index);
    console.log('原数组' + array)
})

2)map()

遍历数组,返回一个新数组,新数组中的元素是判断旧数组中每个元素是否满足条件的结果

var arr = [1,2,3,4,5]
var newArr = arr.map(function(value) {
    console.log('数组元素' + value);    
    return value > 3
})
console.log(newArr)  //[false,false,false,true,true]

map.has(key)

判断map中是否有指定的键,返回bool值

map.set('key','value')

为Map对象添加一个指定键(key)和值(value)的新元素

let mymap = new Map();
mymap.set('key', 'value')
console.log(mymap)  //{'key' => 'value'}
console.log(mymap.has('key'))  //true
console.log(mymap.has('value'))  //false

3)filter()

遍历数组,筛选出满足条件的项,将满足条件的项放到新数组中并返回

var arr = [1,2,3,4,5]
var newArr = arr.filter(function(value, index, array){
    return value > 3      
})
console.log(newArr)  //[4,5]

4)some()

遍历数组,判断数组中是否有满足条件的元素,有则返回true,没有则返回false

var arr = [1,2,3,4,5]
var result = arr.some(function(value, index, array){
    return value > 3
})
console.log(result)  //true

5)every()

遍历数组,判断数组中的每个元素是否都满足条件,是则返回true,不是则返回false

var arr = [1,2,3,4,5]
var result = arr.every(function(value){
    return value > 0
})
console.log(result)  //true

3、一些数组的API

1)arr1.concat(arr2,arr3)

合并多个数组,将数组arr2、arr3与arr1合并到一个新数组中,并返回

var arr1 = [1,2,3]
var arr2 = [4,5,6]
var arr3 = [7,8,9]
var newArr = arr1.concat(arr2,arr3)
console.log(newArr)  //[1,2,3,4,5,6,7,8,9]

2)arr.join()

用不同的分隔符将数组中的元素组成一个字符串,返回值是字符串 

var arr = ["2022", "09", "28"]
var str1 = arr.join()
console.log(str1)  //“2022,09,28”
var str2 = arr.join("")
console.log(str2)  //"20220928"
var str3 = arr.join("-")  
console.log(str3)  //“2022-09-28”

  3)arr.unshift()

在数组开头添加元素,返回值是添加元素之后数组的长度

var arr = [1,2,3,4,5]
var result = arr.unshift(-1,0)
console.log(arr)  //[-1,0,1,2,3,4,5]
console.log(result)  //7

 4)arr.shift()

删除数组的第一个元素,返回值是删除的元素

var arr = [6,2,3,4,5]
var result = arr.shift()
console.log(arr)  //[2,3,4,5]
console.log(result)  //6

5)arr.push()

在数组的末尾添加元素,返回值是添加元素之后数组的长度

var arr = [1,2,3,4,5]
var result = arr.push(7,8)
console.log(arr)  //[1,2,3,4,5,7,8]
console.log(result)  //7 

6)arr.pop()

删除数组的最后一个元素,返回值是删除元素

var arr = [1,2,3,4,5]
var result = arr.pop()
console.log(arr)  //[1,2,3,4]
console.log(result)  //5

7)arr.reverse()

反转数组,将数组中元素的顺序反转

var arr = [1,2,3,4,5]
console.log(arr.reverse())  //[5,4,3,2,1]

8)arr.sort()

 数组排序(按字母升序)、数字排序(按数字升序 / 降序)

//按字母顺序升序
var arr1 = ["Banana", "Orange", "Apple", "Mango"]
console.log(arr1.sort())  //["Apple", "Banana", "Mango", "Orange"]


var arr2 = [66, 46, 52, 28, 79]
//按数字顺序升序
console.log(arr2.sort(function(a,b){ return a-b })) //[28, 46, 52, 66, 79]
//按数字顺序降序
console.log(arr2.sort(function(a,b){ return b-a })) // [79, 66, 52, 46, 28]

 9)arr.slice(start,end)

截取数组中的元素,放到一个新数组中,并返回

var arr = [1,2,3,4,5]
var newArr1 = arr.slice(1,3)  
console.log(newArr1)  //[2,3]
var newArr2 = arr.slice(1)
console.log(newArr2)  //[2,3,4,5]
var newArr3 = arr.slice(-3,-1)
console.log(newArr3)  //[3,4]
console.log(arr)  //[1,2,3,4,5]

10)arr.splice()

 添加或删除数组中的元素

var arr = [1,2,3,4,5]

//删除数组中的元素,返回值是删除元素的数组
var newArr1 = arr.splice(4,0) //从数组索引为4的位置开始,删除0个元素
console.log(newArr1)  //[]
var newArr2 = arr.splice(4,1)  //从数组索引为4的位置开始,删除1个元素
console.log(newArr2)  //[5]
console.log(arr)  //[1,2,3,4]

11)arr.includes() 

判断数组中是否存在指定值,是则返回true,否则返回false

arr = [1,2,3,4,5]
console.log(arr.includes(arr[1]))  //true

12)arr.reduce(callback(accumulator,currentValue[,index[,array]])[,initailValue])  

对数组中每个元素执行回调函数,将其结果汇总为一个返回值并赋值给accumulator

① reduce函数的参数一般有两个,回调函数callback()和accumulator初始值initialValue

② callback():作为一个累加器存在,accumulator是callback() 累计处理返回的值

③ accumulator:上一次callback()运行完成后返回的累计值

④ currentValue:当前数组下标对应的元素

⑤ index:当前数组下表

⑥array:对arr数组的引用

⑦initialValue:accumulator初始值

var arr = [1, 2, 3, 4, 5]
arr.reduce((accumulator, currentValue) => {
    console.log('accumulator', accumulator)
    return accumulator
}), 10)

//accumulator 10
//accumulator 11
//accumulator 12
//accumulator 13
//accumulator 14
//accumulator 15

13)arr.indexOf()

14)arr.lastindexOf() 

4、Map和WeakMap区别 

通俗易懂,直接上链接

map.has(key)

判断map中是否有指定的键,返回boolean值

map.set('key','value')

为Map对象添加一个指定键(key)和值(value)的新元素

let mymap = new Map();
mymap.set('key', 'value')
console.log(mymap)  //{'key' => 'value'}
console.log(mymap.has('key'))  //true
console.log(mymap.has('value'))  //false

5、数组去重

11、数组去重(十个方法)

6、伪数组转换成数组

方法1、方法2、方法4

7、普通函数和箭头函数的区别

1)箭头函数语法更加简洁、清晰

2)箭头函数没有自己的this,而是继承外部的执行上下文中的this,所以箭头函数不能作构造函数

      普通函数的this是“谁调用它,就指向谁”,普通函数可以作为构造函数

var a = 0
var obj = {
    a: 1,
    b: () => {
       console.log(this.a)  // 0
       console.log(this)  // Window 
       },
    c: function() {
       console.log(this.a)  // 1
       console.log(this)  // {a: 10, b: ƒ, c: ƒ}
       }
    }
obj.b()
obj.c()

     具体详解: 

//[new 构造函数]时做了什么
var obj = new Object()  //创建空对象
obj.__proto__ = 构造函数.prototype //将空对象的__proto__属性链接至构造函数的原型
obj = this //将对象实例作为函数执行上下文中的this
return obj  //返回对象实例

3)箭头函数没有prototype

var a = () => {}
console.log(a.prototype)  //undefined

var b = function{}
console.log(b.prototype)  //{constructor:f} 

4)箭头函数没有arguments,可以用扩展符来获取箭头函数的参数列表

//普通函数
function A(a) {
    console.log(arguments);
}
A(1,2,3,4,5);  //  [1, 2, 3, 4, 5,  callee: ƒ, Symbol(Symbol.iterator): ƒ]

// 箭头函数
var B = (b) => {
    console.log(arguments);
}
B(1,2,3,4);   // Uncaught ReferenceError: arguments is not defined

// 扩展符获取箭头函数的参数列表
let C = (...c) => {
  console.log(c);
}
C(1,2,3,4);  // [1,2,3,4]

5)箭头函数不能使用yield关键字,不能用作Generator函数

8、普通函数和构造函数的区别

1)命名方式不同

为了区分,一般构造函数名首字母都要大写

2)调用方式不同

 普通函数不需要new关键字调用,而构造函数需要

3)this指向不同

普通函数的this指向调用函数的对象,而构造函数的this指向创建的对象实例 

4) 返回值不同

普通函数返回值由return语句决定,而构造函数默认返回值是创建的对象实例

9、 四个未知宽高元素水平垂直居中的方法

1)设置元素相对父级元素绝对定位

position: absolute;
left: 50%;
right: 50%;
transform: translate(-50%,-50%)

2)设置元素的父级元素为弹性盒子

display: flex;
justify-content: center;
align-items: center

 3)设置元素的父级元素为网格元素

display: grid;
justify-content: center;
align-items: center

4)设置元素为行内块元素,父级元素为表格元素

//子元素
display: inline-block

//父元素
display: table-cell;
text-align: center;
vertical-align: middle

10、JS数据类型隐式转换三条转换规则

1)转换为string类型

基本数据类型转换之后的值
undefined’undefined‘
null’null‘
boolean’true‘和’false‘
number'具体数字类型值’

2)转换为number类型

数据类型 转换之后的值
undefinedNaN
null0
true1
false0
空字符串0
非空字符串

如果字符串是数字字符串,则转换为相应的数字;

如果字符串中含有非数字字符,则转换为NaN

        [ ]                                                0
        { }                                              NAN

3)转换为boolean类型

数据类型truefalse
string任何非空字符串空字符串
number任何非零数字0或者NaN
undefinedundefined
Object任何非null对象

null

+ 操作符

1)+ 操作符两边有至少一个 string 变量时,两边变量都转换为字符串类型

1 + '23'  //'123'
'1' + false  //'1false'

2)其它情况下,两边变量转换为数字类型

1 + false  //1
false + true  //1
1 + '23'  //23
1 * false  //0

- 、* 、/ 、 == 操作符

两边变量转换为数字类型

1 / 'aa'  //NaN
3 == true  //false
'0' == false  //true
'0'  ==  0  //true

<、>比较符:

1)如果两边都是字符串,则比较字母表顺序

'ca' < 'bd'  //false
'a' < 'b'  //true 

2)其它情况下,转换为数字类型比较

'12' < 13  ///true
false > -1  //false

11、js中如何进行数据类型隐式转换

ToPrimitive方法

这是js中每个值隐含的自带的方法,用来将值(无论是基本类型或是引用数据类型)转换为基本类型。

ToPrimitive(obj,type)  //obj:需要转换的对象  type:要转换的数据类型(String或者Number)

如果值为基本类型,则返回值本身;

如果值为引用数据类型,则:

1) 当 type 为 Number 时:

① 调用 obj 的 valueof() 方法,如果为原始值,则返回,否则下一步;

② 调用 obj 的 toString() 方法,后续同上;

③ 抛出 TypeError 异常

2)当 type 为 String 时:

① 调用 obj 的 toString() 方法,如果为原始值,则返回,否则下一步;

② 调用 obj 的 valueof() 方法,后续同上;

③ 抛出 TypeError 异常

注意:当 obj 为 Date 对象,type 默认为 String,其它情况  type 默认为 Number

valueOf()

Object原型方法,Object.prototype.valueOf()

该方法返回指定对象的原始值,若对象没有原始值,则返回对象本身

//obj 为字符串
var string = new String('12345')
console.log(string.valueOf())  //'12345'

//obj 为数组对象
var arr1 = [1,2,3,4,5]
console.log(arr1.valueOf())  //[1,2,3,4,5]
var arr2 = []
console.log(arr2.valueOf())  //[]

//obj 为普通对象
var obj = {
    a:1,
    b:2,
    c:3
}
console.log(obj.valueOf())  //{a: 1, b: 2, c: 3}

看看别人写的,就懂了

toString()

Object原型方法,Object.prototype.toString()

看至”覆盖默认的 toString方法“

12、flex布局

一 至 三、3.5

13、document.getElementById()、getElementByClassName()、querySelector()的区别

<body>
    <div class = "1"></div>
    <div id = "2"></div>
    <p class = "3"></p>
</body>
<script type="text/javascript">
    var a1 = document.getElementsByClassName("1")
    var a2 = document.getElementById("2")
    var a3 = document.querySelector("p")
    console.log(a1)  //数组  [div.1]
    console.log(a2)  //DOM节点  <div id = '2'></div>>
    console.log(a3)  //DOM节点  <p class = "3"></p>
</script>

14、var、let、const的区别

1)块级作用域

let、const存在块级作用域,而var不存在

2)变量提升

var存在变量提升,即在变量声明前能够使用变量,而let、const不行,会形成暂时性死区

3)给全局添加属性

浏览器的全局对象是window,var声明的变量是全局变量,即会将var声明的变量添加为全局对象的属性,而let、const不会 

let m = 10  //var m = 10 
function fn() {
    return this.m + 1
}
var obj = {
    m: 5,
    test1: function() {
         return fn()
    }
};
obj.test2 = fn;
console.log(obj.test1(), fn(), obj.test2())  //NaN NaN 6  //11 11 6


//理解上面obj.test1()为什么等于11
var obj = {
     m: 5,
     test3: function() {
         console.log(this.m);  // 5
         return function() {
             console.log(this);  //window
             console.log(this.m);  //undefined
             }
     }
}
obj.test3()();

4)重复声明 

var可以重复声明变量,后声明的同名变量会覆盖之前声明的变量,而let、const不行

5)初始值设置

var和let可以先声明而不赋值,const不行,const在声明变量时必须设置初始值且不能改变

//关于const声明的变量设置初始值后不能改变

const保证的是变量指向的内存地址不能动

如果const声明的变量是基本数据类型, 其值就保存在变量所指向的内存地址,等同于常量

如果const声明的变量是引用数据类型,变量指向的地址保存的是一个指针,const只能保证该指针不改变,至于其指向的数据结构是无法保证的

15、钩子函数

16、vue2 和 vue3 的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值