1.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数二分查找 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
当时写的代码如下,没想到一次就写出来能跑的了(牛客网的编辑器一生黑)
function test(arr,target,low,high){
if(low>=high){
return -1
}
if(arr[low]===target){
return low
}
if(arr[high]===target){
return high
}
let mid=Math.floor((low+high)/2)
if(arr[mid]===target){
return target
}
//中间值小于target
if(arr[mid]<target){
low=mid+1
}
if(arr[mid]>target){
high=mid-1
}
return test(arr,target,low,high)
}
2.判断变量是否为数组
1.Array.isArray()
2.Object.prototype.toString.call(obj)==='[object Array]'
问:其中第二种为什么必须要访问Object的原型对象
答:因为对象的实例可能会重写toString()方法,比如[12].toString()==='12' 所以只能去原型上找方法
后面查资料 补充:
3. [] instanceof Array ===true
typeof 为什么不能判断数组?
答:因为typeof只能判断Object,undefined等等,不能判断Array
4.[123].constructor===Array 通过实例的constructor属性指向构造函数来判断,缺点是可能被重写覆盖掉
3.说出下面的输出结果
null==undefined
[0]==0
1.true 简单来说null和undefined ==的时候不能进行类型转换,而是相等的。明显不全等 因为不是一个数据类型
2.true 会进行类型转换 [0] == 0为true, [0]会先转为字符串,即‘0’ == 0
4.for in,Object.keys 和 Object.getOwnPropertyNames的区别
for..in 遍历自身属性+ _proto_原型链上的可枚举属性
Object.keys() 只遍历自身的可枚举属性
补:Object.getOwnPropertyNames()可以遍历自身所有属性,包括不可枚举的
问:说一下对象的descriptor里可以定义哪几种属性?
答:可以通过Object.defineProperty() 定义 enumable getter setter writable
补:还有value、configurable
5.说出下面的输出结果并分析
function Foo () {
getName = function () {
console.log(1)
}
console.log(‘this is’ + this)
return this
}
Foo.getName = function () {
console.log(2)
}
Foo.prototype.getName = function () {
console.log(3)
}
var getName = function () {
console.log(4)
}
function getName () {
console.log(5)
}
// 请写出一下的输出结果
Foo.getName()
getName()
Foo().getName()
getName()
new Foo.getName()
new Foo().getName()
2
4 知识点 函数声明会提升,所以变量声明函数会覆盖掉
1 首先先判断这里的this指向哪儿,根据非箭头函数指向调用时的上下文,此时this指向全局window 同时在调用的时候函数内部的getName覆盖了全局的getName,所以输出1
1 同上
以下两个未答出来
new Foo.getName();//2
解析:执行顺序 1、a=Foo.getName;2、new a();
第一步执行得到一个函数,但是它内部没有提供任何构造器属性,
所以第二步new这个方法只能得到一个空属性的实例。
new Foo().getName();//3
解析:执行顺序1、a = new Foo();2、a.getName();
第一步得到一个实例,this指向新建的对象
第二步调用实例对象原型上的getName方法。
5.说一下position的有几种值?分别含义和应用场景。line-height的应用场景以及单位,为什么要初始化全局样式。line-height是可继承的属性吗
static relative absolute fixed
px em rem %
因为由于浏览器的差异,对于初始margin等属性需要做统一处理,同时可以设置默认值比如字体行高等 方便开发
是可继承的
CSS position(定位)属性
真正的能理解CSS中的line-height,height与line-height
6.说一下vue3和vue2的不同,setup函数的含义。在哪个生命周期执行
es6 Proxy getter setter $set
setup()
取不到this 在created之前执行
7.实现一个大数相加函数
浏览器值的运算有上限值,假如两个很大的数相加,该如何运算
/* 实现一个大数相加函数
浏览器值的运算有上限值,假如两个很大的数相加,该如何运算
*/
function add(num1, num2) {
//类型判断是数字 否则throw error
if(typeof num1!=="number"||typeof num2!=="number"){
return `error type`
}
let arr1 = `${num1}`.split('');
let arr2 = `${num2}`.split('');
let result = [];
let temp = [];
let maxLength = Math.max(arr1.length, arr2.length);
// 必须缓存下初始长度 不然后面补位的时候会变
let arr1Length=arr1.length
let arr2Length=arr2.length
// 应该先补位0 然后再相加最简单
if (arr1Length >arr2Length) {
for (let i = 0; i < maxLength -arr2Length; i++) {
arr2.unshift(0);
}
} else if (arr2.length > arr1Length) {
for (let i = 0; i < maxLength - arr1Length; i++) {
arr1.unshift(0);
}
}
temp[maxLength - 1] = 0;
for (let i = maxLength - 1; i >= 0; i--) {
let num = Number(arr1[i]) + Number(arr2[i]) + temp[i]
if (num >= 10) {
result.push(num - 10);
temp[i - 1] = 1;
} else {
result.push(num);
temp[i - 1] = 0;
}
}
result.reverse();
return Number(result.join(''));
}
console.log(add(1234567867867, 12345678));