JS常见问题总结二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS常见问题总结二相关的知识,希望对你有一定的参考价值。

四、异步

console.log(100)
setTimeout(function(){
     console.log(200)
})
console.log(300)

技术分享

4.1 同步和异步的区别是什么?分别举一个同步和异步的例子。

答:同步会阻塞代码执行,而异步不会;alert是同步,setTimeout是异步

4.2 一个关于setTimeout的笔试题

console.log(1)
setTimeout(function(){
    console.log(2)
},0)
console.log(3)
setTimeout(function(){
    console.log(4)
},1000)
console.log(5)

打印顺序:1,3,5,2,一秒钟之后打印4

4.3 前端使用异步的场景有哪些?

 答:定时任务: setTimeout , setInterval

        网络请求: AJAX请求 , 动态<img>加载

        事件绑定

五、日期和math

知识点:日期

 技术分享

Math:  获取随机数Math.random()

数组API:

   forEach  :遍历所有元素

   every      : 判断所有元素是否都符合条件    

   some       :判断是否有至少一个元素符合条件   

   sort          :排序

   map         :对元素重新组装,生成新数组

   filter         :过滤符合条件的元素

var arr = [‘a‘,‘b‘,‘c‘,‘d‘]
arr.forEach(function(item,index){
    console.log(index,item)
})

var arr = [1.2.3.4]
var result = arr.every(function(item,index){
    if (item<5) {
        return true
    }
})
console.log(result)

var arr = [1.2.3.4]
var result = arr.some(function(item,index){
    if (item<3) {
        return true
    }
})
console.log(result)

var arr = [1.2.3.4]
var arr2 = arr.sort(function(a,b){
    //从小到大排序
    return a-b

    //从大到小排序
    return b-a
})
console.log(arr2)

var arr = [1,2,3,4]
var arr2 = arr.map(function(item,index){
    return ‘<b>‘+item+‘<b>‘
})
console.log(arr2)

var arr = [1,2,3,4]
var arr2 = arr.filter(function(item,index){
if (item<3) {
return true
}
})
console.log(arr2)

 

 

5.1 获取2017-06-10格式的日期

 

function formatDate(dt){
    if (!dt) {
        dt = new Date()
    }
    var year = dt.getFullYear()
    var month = dt.getMonth()+1
    var date = dt.getDate()
    if (month < 10) {
        //强制类型转换
        month = ‘0‘+month
    }
    if (date < 10) {
        date= ‘0‘+date
    }
    return year + ‘-‘+month + ‘-‘+date
}
var dt = new Date()
var formatDate = formatDate(dt)
console.log(formatDate)

5.2 获取随机数,要求是长度一致的字符串格式

var random = Math.random()
var random = random + ‘0000000000‘
//后面加上10个0
var random = random.slice(0,10)
console.log(random)

5.3 写一个能遍历对象和数组的通用forEach函数

function forEach(obj,fn){
    var key
    if (obj instanceof Array) {
        obj.forEach(function(item,index){
            fn(index,item)
        })
    }else {
        //不是数组就是对象
        for(key in obj){
            fn(key,obj[key])
        }
    }
}
var arr = [1,2,3]
//参数顺序换了,为了和对象的遍历格式一致
forEach(arr,function(item,index){
    console.log(index,item)
})
var obj = {x:100 , y:200}
forEach(obj,function(key,value){
    console.log(key,value)
})

六、JS-WEB-API

技术分享 

6.1 DOM是哪种基本的数据结构?  树

6.2 DOM操作的常用API有哪些?

var div1=document.getElementById(‘div1‘)
//添加新节点
var p1 - document.createElement(‘p‘)
p1.innerhtml=‘this is p1‘
//添加新创建的元素
div1.appendChild(p1)
//移动已有节点
var p2 = document.getElementById(‘p2‘)
div1.appendChild(p2)

//获取父元素和子元素
var div1 = document.getElementById(‘div1‘)
var parent = div1.parentElement
var child = div1.childNodes
div1.removeChild(child[0])

//获取DOM节点
var div1= document.getElementById(‘div1‘)//元素
var divList = document.getElementsByTagName(‘div‘)//集合
console.log(divList.length)
console.log(divList[0])

var containerList = document.getElementByClassName(‘.container‘)
var pList = document.querySelectorAll(‘p‘) 

6.3 DOM节点的attr和property有何区别?

 答: attr是对html标签属性的修改

        property只是一个JS对象属性的修改

//property
var div1 = document.getElementById(‘div1‘)
console.log(div1.className)
div1.className=‘abc‘
console.log(div1.className)

//attr
var p1 = document.getElementById(‘p1‘)
console.log(p1.getAttribute(‘data-name‘))
p1.setAttribute(‘data-name‘,‘xyz‘)

6.4 如何检测浏览器的类型

Navigator/screen/location/history

//检测浏览器类型,以chrome为例
//navigator
var ua=navigator.userAgent
var isChrome = ua.indexOf(‘Chrome‘)
console.log(isChrome)

6.5 拆解url的各部分

//screen
console.log(screen.width)
console.log(screen.height)

//location
console.log(location.href)
console.log(location.protocol)
console.log(location.host)
console.log(location.ashpathname)
console.log(location.search)
console.log(location.h)

//history
history.back()
history.forward()

 

七、AJAX

XMLHttpRequest

状态码说明

 技术分享

 技术分享

跨域

技术分享

可以跨域的三个标签:<img src=xxx>

                                   <link href=xxx>

                                   <script src=xxx>

 

 

7.1 手动编写一个ajax,不依赖第三方库。

var rhr = new XMLHttpRequest()
xhr.open("GET","/api",false)
xhr.onreadystatechange = function(){
    if (xhr.readyState == 4) {
        if (xhr.state === 200) {
            alert(xhr.responseText)
        }
    }
}
xhr.send(null)

7.2 跨域的几种实现方式

 答:1.JSONP(JSONP实现原理:比如加载一个网址,但不一定服务器端真的有这样一个文件,服务器可以根据请求,动态生成一个文件返回

返回内容格式如:callback({x:100,y:200}))

        2.服务器端设置http header

7.3 请描述一下cookie,sessionStorage和localStorage的区别?

 答:1.cookie :本身用于客户端和服务器端通信,但是它有本地存储的功能,于是就被“借用”

                          使用document.cookie=.....获取和修改即可,不过只能存4kb,每次都携带到AJAX中,API需要封装才能使用

        2.sessionStorage和localStorage:HTML5专门为存储而设计,最大容量5M,不会携带到AJAXzh中易用,API简单y

                                                              前者会自动清理,后者不会

八、事件

8.1 编写一个通用的事件监听函数

function bindEvent(elem,type,selector,fn){
    if (fn==null) {
        fn=selector
        selector=null
    }
    elem.addEventListener(type,function(e){
        var target
        if (selector) {
            target = e.target
            if (target.matches(selector)) {
                fn.call(target,e)
            }
        }else{
            fn(e)
        }
    })
}

//使用代理
var div1 = document.getElementById(‘div1‘)
bindEvent(div1,‘click‘,‘a‘,function(e){
    console.log(this.innerHTML)
})

//不使用代理
var a = document.getElementById(‘div1‘)
bindEvent(div1,‘click‘,function(e){
    console.log(a.innerHTML)
})

8.2 描述事件冒泡流程

DOM树形结构,事件冒泡,阻止冒泡,冒泡的应用

8.3 对于一个无限下拉加载图片的页面,如何给每个图片绑定事件

使用代理

九、模块化

9.1 window.onload和DOMContentLoaded的区别?

window.addEventListener(‘load‘,function(){
    //页面得全部加载完成才会执行,包括图片、视频等
})
document.addEventListener(‘DOMContentLoaded‘,function(){
    //DOM渲染完即可执行,此时图片、视频可能还没加载完
}) 

过程从输入url到得到html的详细过程:

       1.浏览器根据DNS服务器得到域名的IP地址

        2.向这个IP的机器发送http请求

        3.服务器收到、处理并返回http请求

        4.浏览器得到返回内容

9.2简述如何实现一个模块加载器,实现类似require.js的基本功能。

技术分享

9.3  http协议知识

技术分享

(1)浏览器先搜索自身的DNS缓存
(2)操作系统搜索自身的DNS缓存(浏览器没有找到缓存或者缓存已经失效)
(3)读取本地的HOST文件
(4)浏览器发起一个DNS的一个系统调用
       宽带运营商服务器查看本身缓存
       运营商服务器发起一个迭代DNS解析的请求
       运营商服务器把结果返回操作系统内核同时缓存起来
       操作系统内核把结果返回浏览器
       浏览器就拿到了www.imooc.com的IP地址

(5)浏览器获得域名对应的IP地址后,发起HTTP“三次握手”
(6)TCP/IP链接建立起来后,浏览器就可以向服务器发送HTTP请求了
(7)服务器端接受到了这个请求,根据路径参数,经过后端的一些处理之后,把处理后的结果数据返回给浏览器,比如页面完整的html代码等返回给浏览器
(8)浏览器拿到了完整的html代码后,在解析和渲染这个页面的时候,里面的JS,CSS,图片静态资源,他们同样也是一个个http请求,都要经过上面的主要七个步骤。
(9)浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给了用户。

 

1.回调:将后续逻辑封装在回调函数中作为起始函数的参数

2.同步:只有一个端口每次只处理一件事。
   异步:同样只有一个端口,但这个端口只做分配工作,把事件分配个下面的员工,有上千个员工等着帮你处理事情。

3.事件驱动:为了某个事件而注册的回调函数,但是这个回调函数不是马上执行,当事件发生的时候才会调用 ,这种函数执行的方式就叫做 事件驱动

 

9.5 上线和回滚

 答:1.上线:将测试完成的代码提交到git版本库的master分支 

                      将当前服务器的代码全部打包并记录版本号

                      将master分支的代码提交覆盖到线上服务器,生成新版本号

         2.回滚:将当前服务器的代码打包并记录版本号,备份

                      将备份的上一个版本号解压,覆盖到线上服务器,并生成新的版本号

10.Ajax和Flash

Ajax的优势:1.可搜索性 2.开放性 3.费用 4.易用性 5.易于开发。

Flash的优势:1.多媒体处理 2.兼容性 3.矢量图形 4.客户端资源调度

Ajax的劣势:1.它可能破坏浏览器的后退功能   2.使用动态页面更新使得用户难于将某个特定的状态保存到收藏夹中 ,不过这些都有相关方法解决。

Flash的劣势:1.二进制格式 2.格式私有 3.flash 文件经常会很大,用户第一次使用的时候需要忍耐较长的等待时间  4.性能问题

 

javascript 中包含以下 7 个全局函数

escape( )、eval( )、isFinite( )、isNaN( )、parseFloat( )、parseInt( )、unescape( )。

 

以上。























以上是关于JS常见问题总结二的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL基础学习之二代码基本结构

二代身份证号码编码规则

二代测序技术总结

染色体基因芯片分析和第二代测序应用的区别

php生成各种验证码

Js中String转int