2021-03-14 字节商业化技术面试

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] == 0true, [0]会先转为字符串,即‘0== 0

null == undefined ?
JS数据类型转换

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;2new 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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值