字节跳动2017笔试 (2) --- 解析

前面的话

这套题考点包括html/css 、js、跨域问题、计组、计网、数据结构、操作系统、算法、概率论,都比较基础。题目来源牛客。

解析
(1) 变量a是一个64位有符号的整数,初始值用16进制表示为:0Xf000000000000000; 变量b是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF。 则a-b的结果用10进制表示为多少?()
A: 1
B:-(2^62+2^61+2^60+1)
C:2^62+2^61+2^60+1
D:2^59+(2^55+2^54+…+2^2+2^1+2^0)

计算机采用补码来存数据,即:

  • a的补码: 1111(后面60个0)
  • b的补码: 0111(后面60个1),是整数,其原码一样
  • -b的补码:1000(后面59个0,最后一个1)
  • (a - b)补 = (a补 + (-b)补) = 0111(后面59个0,最后一个1)高位溢出,舍去
  • 结果为2^62+2^61+2^60+1
(2) 下面代码打印结果?
console.log(([])?true:false); 
console.log(([]==false?true:false)); 
console.log(({}==false)?true:false) 
  • 第一题 Boolean([]) 返回true

    布尔类型只有这几个参数返回false:

    	Boolean(undefined) // false
    	Boolean(null) // false
    	Boolean(0) // false
    	Boolean(NaN) // false
    	Boolean('')// false 
    
  • 第二题Number([]) // 0
    false转为number类型 0

  • 第三题Number({}) // NaN
    Number转换类型的参数如果是对象就是NaN

所以结果为true、true、false

(3) 哪些是块级元素
A: input
B: ul
C: hr
D: li
E: div
F: form
  • 块级元素有: ul、hr、li、fiv、form(hr是空标签,是一条水平线)
  • input是行内替换元素。
(4) 关于跨域问题下面说法正确的是?()
A: 可以利用flash的http请求,来处理跨域问题
B: 通过iframe设置document.domain可以实现跨域
C: 一般情况下,m.toutiao.com可以ajax请求www.toutiao.com域名下的接口并获得响应
D: 通过jsonp方式可以发出post请求其他域名下的接口
  • flash不能解决跨域问题
  • document.domain:这种方式用在主域名相同子域名不同的跨域中
  • 域名不同的情况下不可以是ajax
  • jsonp: 利用<script>标签解决跨域,但是只支持GET请求。
(5) 以下符合 ES6 写法的有:()

A:

class Foo
{
	constructor() {return Object.create(null);}
}
Foo()

B:

var m=1;
export m;

C:

export var firstName=’Michael’;

D: 在A模块中export{readFile}后,在B模块中import readFile from ‘A’可以获取到readFile

  • Foo(),将class当为普通方法,new Foo()才正确
  • export m,m要加{}
  • 正确,使用var或者let不需要{}
  • readFile要加{}
(6) http 请求方式 get 和 post 的区别包括()
A: get和post的可传输内容大小不一样,一个有限制一个没有限制
B: get和post传输的内容存放的位置不一样,一个放在header,一个放在body
C: get请求Content-type只能是text/html
D: get请求可以跨域、post请求不能跨域
  • 首先说明一点: GET与POST的表现不同,是由于浏览器与服务器限制导致的。其本质: HTTP协议是基于TCP/IP的应用层协议,而GET与POST是HTTP协议上的两种请求方式,所以无论是GET还是POST,都是基于TCP连接,用的都是同一个传输层的协议,在传输上没有区别。
  • 由于浏览器与服务器的限制:get将参数放在header的url上(长度有限制),post将参数放在body中(长度无限制)
  • get请求Content-type除了text/html还有其他
  • get请求可以跨域、post请求也能跨域
(7) 下面哪些属于JavaScript的typeof运算符的可能结果:()
A:symbol
B:NaN
C: boolean
D: null
E:array
F: undefined
G:string

typeof运算符的结果只有6种:undefined、Object、symbol、boolean、string、number

(8) TCP断开连接的四次挥手中,第四次挥手发送的包会包含的标记,最正确的描述是?()
A: FIN
B: FIN,PSH
C: ACK
D: FIN,ACK

在这里插入图片描述
详细:tcp的三次握手与四次挥手

(9) 假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是()
boolean isOdd = false;

for(int i=1;i<=2;++i)
{
if(i%2==1)isOdd = trueelse isOdd = false;
a+=i*(isOdd?1:-1)}
A:-1
B:-2
C:0
D:1

两个线程对a的操作都是1或-2,共有四种情况:

  • 如果线程A循环两次之后,结果为-1;此时如果该结果线程B是可见的,再执行循环结果就是-2
  • 如果线程A循环两次之后,结果为-1;此时如果该结果线程B不可见,再执行循环还是从a=0开始,则结果为-1;无论A和B谁的结果被最后刷新到内存,结果都是-1
  • 如果线程A做了+1的操作,该结果立即被B看到,B开始执行两次循环+1和-2。如果B的结果晚于A计算的结果刷新到内存中,那么结果就是0.
  • 如果线程A线程B同时做了+1操作,线程A做-2操作,a = -1; 线程B将这个结果带入-2操作,a的最终结果为-3。
(10) 使用HTML+CSS实现如图布局,border-width:5px,格子大小是50px*50px,hover时边框变成红色,需要考虑语义化。

在这里插入图片描述

 <style>
        .container{
            width: 170px;
            height: 170px;
        }
        .box {
            width: 50px;
            height: 50px;
            line-height: 50px;
            border: 5px solid blue;
            text-align: center;
            float: left;
             /* z-index只对定位的元素有效 */
            position: relative;
        }

        .box:hover{
            cursor: pointer;
            /* 将边框的层级增大*/
            z-index: 999;
            border-color: red;
        }
         .box2,.box3,.box5,.box6,.box8,.box9 {
            margin-left: -5px;
        }
        
        .box4,.box5,.box6,.box7,.box8,.box9 {
            margin-top: -5px;
        }
    </style>
<body>
    <div
     class="container">
        <div class="box1 box">1</div>
        <div class="box2 box">2</div>
        <div class="box3 box">3</div>
        <div class="box4 box">4</div>
        <div class="box5 box">5</div>
        <div class="box6 box">6</div>
        <div class="box7 box">7</div>
        <div class="box8 box">8</div>
        <div class="box9 box">9</div>
    </div>
</body>

在这里插入图片描述

(11) 给出一个上传文件时不用刷新页面的方案,要求写出关键部分的js代码。
  • 使用ajax来实现部分刷新功能:

    <input type="file"  id="file"/>
    <button id="upload">点击上传</button>
    
     var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("POST", url, true);
        xml.onreadystatechange = function () {
            if(xmlHttp.readyState === 4 && xmlHttp.status === 200) {
                // xxx
            }else{
                alert("Ajax服务器返回错误")
            }
        }
        xmlHttp.send(file.value);
    
    
  • 使用fetch实现

    
    <input id="upload" type="file" />
    <button id="upload-btn"> upload </button>
    <script>
    document.getElementById('upload-btn').onclick = function(){  
        var input = document.getElementById('upload');
        //选取文件;
        var file = input.files[0];
        //创建表单数据对象;
        var formData = new FormData();
        //将文件添加到表单对象中;
        formData.append('file',file);
        //传输;
        fetch({
        url:'',
        mothod:'POST',
        body:formData 
        }) 
        .then((d)=>{
        console.log('result is',d);
        })
    }
    </script>
    
  • 使用axios实现

    <input id="upload" type="file" />
    <button id="upload-btn"> upload </button>
    <script src="https://unpkg.com/axios/dist/axios.min.js">
     var file = document.getElementById("unload").files[0]
     var formData = new FormData();
     formData.append('file',file);
     axios.post('/',{formData})
       .then(function (response) {
       console.log(response);
     })
       .catch(function (error) {
         console.log(error);
       });
    </script>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值