资讯专栏INFORMATION COLUMN

前端面试之路二(javaScript基础整理)

AbnerMing / 1264人阅读

摘要:在标签中添加属性,本质上是跟在标签里面写属性时一样的,所以属性值最终都会编译为字符串类型。这个节点包括很多,比如,以及一些方法等方法。一个对象有很多,该集合名字为,里面有其他以及,里面有很多。

一、变量类型和计算 JS中使用typeof能得到哪些类型
变量类型

值类型:变量本身就是含有赋予给它的数值的,它的变量本身及保存的数据都存储在栈的内存块当中

引用类型:引用类型当然是分配到堆上的对象或者数据变量,根据官方一点的解释就是引用类型的变量只包括对其所表示的数据引用

对象、数组、函数

无限扩展属性,可能出现内存占用比较大的情况

typeof abc      //"undefined"
typeof NaN      //"number"
typeof null     //"object"
typeof console.log //"function"

typeof只能区分值类型,对引用类型无能为力,只能区分函数function

NaN表示特殊的非数字值,null是空指针,并没有指向任何一个地址

typeof能区分的五种基本类型:stringbooleannumberundefinedsymbol和函数function

变量计算
可能发生强制类型转换的情况:

字符串拼接

== 运算符

100  ==  "100"  //true
0    ==  ""     //true
null ==  undefined  //true

if语句

    var c = "";
    if(c){
        //....
    }

逻辑运算

 console.log(10 && 0);       //0
 console.log("" || "abc");   //"abc"
 console.log(!window.abc);   //true
 
 
 //判断一个变量会被当做true还是false
 双非判断
 var a = 100;
 console.log(!!a);

在js逻辑运算中,0、NaN、""、null、false、undefined都会判为false,其他都为true

 var add_level = (add_step == 5 && 1)||(add_step == 10 && 2)||(add_step == 12 && 4)||(add_step==15 && 5 )|| 0;
 var add_level = {"5":1,"10":2,"15":5,"12":4}[add_step]||0; //更精简
何时使用 === 何时使用 ==
if(obj.a == null){
    //这里相当于obj.a === null || obj.a === undefined,简写
    //这是jquery源码中推荐的写法,除此之外其他全用 ===
    //主要是用于判断这个属性是否存在
}
//判断函数参数是否存在
function (a,b){
    if(a == null){
        ...
    }
}
//这种写法不能用
 if(xxx == null){
     //可能会报错,这个参数未定义  not defined
 }
JS变量按照存储方式区分为哪些类型,并描述其特点 如何理解json

JSON是一个JS内置对象,常用两个API

 JSON.stringify({a:10,b:20})
 JSON.parse("{"a":10,"b":20}")

同时也是一种数据格式

二、原型和原型链 原型规则

所有的引用类型(数组、函数、对象)都具有对象特性,即可自由扩展属性】

所有的引用类型(数组、对象、函数)有一个__proto__ 属性,属性值是一个普通的对象

所有的函数都有一个prototype属性,属性值也是一个普通的对象

所有的引用类型(数组、对象、函数),__proto__属性指向它的构造函数的prototype属性

当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么回去他的__proto__(即它的构造函数的prototype中寻找)

原型链

instanceof
instanceof:用于判断引用类型属于哪个构造函数的方法

f instanceof Foo的判断逻辑是:

f的__proto__一层一层往上,能否对应到Foo.prototype

再试着判断f instance Object

如何准确判断一个变量是否是数组类型

var arr = []
arr instanceOf Array //true
typeof arr //object,typeof是无法判断是否是数组的

通用判断方法:Object.prototype.toString.call(arr) === "[object Array]"

写一个原型链继承的例子
function Elem (id){ 
    this.elem = document.getElementById(id);
}
Elem.prototype.html = function(val){ 
    var elem = this.elem;
    if(val){ 
        elem.innerHtml = val;
        return this;   //链式操作
    }else{ 
        return elem.innerHtml; 
    }
} 

Elem.prototype.on = function(type,fn){
    var elem = this.elem
    elem.addEventListener(type,fn)
}

var div1 = new Elem("content_wrapper")
//div1.html("

ds

") //div1.on("click",function(){ // alert("clicked") // } //) div1.html("

放大放大放大发范德萨大点的我请萨

").on("click",function(){ alert("clicked"); }).html("

javascript

")
描述创建一个对象的过程

新生成了一个对象

链接到原型

绑定 this

返回新对象

function create() {
    let obj = new Object()
    let Con = [].shift.call(arguments)
    obj.__proto__ = Con.prototype
    let result = Con.apply(obj, arguments)
    return typeof result === "object" ? result : obj
}
zepto源码中如何使用原型链 三、作用域和闭包

题目

说一下对变量提升的理解

说明this几种不同的使用场景

创建10个 < a>标签,点击的时候弹出对应的序号

如何理解作用域

实际开发中闭包的应用

执行上下文

范围:一段

笔试题3:前端使用异步的场景有哪些

需要等待,因为js是单线程语言

五、常见对象

题目

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

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

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

Date
Date.now() //获取当前时间毫秒数
  
var dt = new Date()
dt.getTime()          //获取毫秒数
dt.getFullYear()      //年
dt.getMonth()        //月(0-11)
dt.getDate()        //日(0-31)
dt.getHours()        //小时(0-23)
dt.getMinutes()        //分钟(0-59)
dt.getSeconds()        //秒(0-59)
Math

Math.random():可以用来清除缓存

Array

forEach 遍历所有数据

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

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

sort 排序

map 对元素重新组装,生成新数组>- 过滤符合条件的元素

array.forEach
arr.forEach( function(item,index){ 
    console.log(index,item); 
});
array.every
var arr = [1,2,3,4,5];
var result = arr.every(function(index,item){
//用来判断所有的数组元素,都满足一个条件 
    if(item<6) 
        return true
});
    console.log(result);
array.some
var result = arr.some(function(index,item){ 
    if(item<5) 
        return true;
}); 
console.log(result);
arry.sort
var arr2 = arr.sort(function(a,b){ 
    //从小到大排序 return a-b; 
    //从大到小排序 
    //return b-a;
})
array.map
arr.map(function(item,index){
    return "
"+index+":"+item+"
" })
array.filter
var arr2 = arr.filter(function (item,index){ 
    //通过某一个条件过滤数组 
    if(item >= 2) 
        return true
})
对象API
var obj = {
    x:100,
    y:200,
    z:300
}

var key

for(key in obj){
    if(obj.hasOwnProperty(key)){
        console.log(key,obj[key])
    }
}
面试题 解答1:获取2016-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)
解答2:获取随机数,要求是长度一致的字符串格式
var random = Math.random() + "0000000000";
var random = random.slice(0,10);
解答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[k])
        }
    }
}
五、JS-Web-API:

知识点:

js基础知识:ECMA262标准

JS-Web-API:W3C标准

W3C标准中关于JS的规定有:

DOM操作

BOM操作

事件绑定

ajax请求(包括http协议)

存储

DOM操作

DOM的本质
DocumentObjectModel
浏览器把拿到的html代码,结构化一个浏览器能够识别并且js可操作的一个模型而已

DOM的节点操作

获取DOM节点

Attribute 和 properity

attribute:是HTML标签上的某个属性,如id、class、value等以及自定义属性,它的值只能是字符串,关于这个属性一共有三个相关的方法,setAttribute、getAttribute、removeAttribute;

注意:在使用setAttribute的时候,该函数一定接收两个参数,setAttribute(attributeName,value),无论value的值是什么类型都会编译为字符串类型。在html标签中添加属性,本质上是跟在标签里面写属性时一样的,所以属性值最终都会编译为字符串类型。

property:是js获取的DOM对象上的属性值,比如a,你可以将它看作为一个基本的js对象。这个节点包括很多property,比如value,className以及一些方法onclik等方法。

一个js对象有很多property,该集合名字为properties,properties里面有其他property以及attributies,attributies里面有很多attribute。
而常用的attribute,id、class、name等一般都会作为property附加到js对象上,可以和property一样取值、赋值

DOM结构操作
面试题1:DOM是那种基本的数据结构?

面试题2:DOM操作的常用API有哪些?

获取DOM节点,以及节点的propertyAttribute

获取父节点,获取子节点

新增节点,删除节点

面试题3:DOM节点的attr和property有何区别

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

Attribute是对html标签属性的修改

BOM操作

问题:

如何检测浏览器的类型

拆解URL各部分

知识点

navigator

screen

location

history

navigator & screen
//navigator
var ua = navigator.userAgent
var isChrome = ua.indexOf("chrome")
console.log(isChrome)

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

//location
console.log(location.href)
console.log(location.protocol)
console.log(location.pathname)
console.log(location.search)    //?之后的参数
console.log(location.hash)      //#号之后

//history
history.back()          
history.forward()
六、事件

题目:

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

描述时间冒泡流程

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

知识点:

通用事件绑定

事件冒泡

代理

知识点 通用事件绑定
var btn = document.getElementById("btn1")
btn.addEventListener("click", function(event) {
    console.log("clicked")
})

function bindEvent(elem, type, fn) {
    elem.addEventListener(type, fn)
}

var a = document.getElementById("link1")
bindEvent(a, "click", function(e) {
    e.preventDefault(); //阻止默认行为
    alert("clicked")
})
关于IE低版本的兼容性

IE低版本使用attachEvent绑定事件,和W3C标准不一样

IE低版本使用量已非常少,很多网站早已不支持

建议对IE低版本的兼容性:了解即可,无须深究

如果遇到对IE低版本要求苛刻的面试,果断放弃

事件冒泡

e.stopPropatation() //取消冒泡

代理



var div1 = document.getElementById("div1")
div1.addEventListener("click",function(e){
    var target = e.target
    if(target.nodeName === "A"){
        alert(target.innerHTMl)
    }
})

完整写法

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("a1")
bindEvent(div1, "click", function(e) {
    console.log(a.innerHTML)
})
面试题 面试题1:编写一个通用的事件监听函数 面试题2:描述事件冒泡流程

DOM树形结构

事件冒泡

组织冒泡

冒泡的应用

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

使用代理

知道代理的两个优点

七、Ajax

题目:

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

跨域的几种实现(原理)

知识点:

xmlHttpRequest

状态码说明

跨域

XMLHttpRequest
var xhr = new XMLHttpRequest()

xhr.open("GET","/api",false)

xhr.onreadystatechange = function(){
    //这里的函数异步执行,可参考之前JS基础中的异步模块
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            alert(xhr.responseText)
        }
    }
}

xhr.send(null)
IE兼容性问题

IE低版本使用ActiveXObject,和W3C标准不一样

IE低版本使用量已经非常少,很多网站早已不支持

建议对IE低版本的兼容性:了解即可,无需深究

如果遇到对IE低版本要求苛刻的面试,果断放弃

.

状态码说明

0 - (未初始化)     还没调用send()方法

1 - (载入)            已调send() 方法,正在发送请求

2 - (载入完成)     send()方法执行完成,已经接收到全部相应内容

3 - (交互)            正在解析响应内容

4 - (完成)            响应内容解析完成,可以在客户端调用了

.

status说明

2XX - 表示成功处理请求。如200

3XX - 需要重定向,浏览器直接跳转

4XX - 客户端请求错误,如404

5XX - 服务器端错误

跨域
什么是跨域

浏览器有同源策略,不允许ajax访问其他域的接口

跨域条件:协议、域名、端口,有一个不同就算跨域

 

可以跨域的三个标签

服务器端设置http header
cookiesessionStoragelocalStorage的区别

容量

是否会携带到ajax中

API易用性

ios safari隐藏模式下,localStorage.getItem会报错,建议统一用try-catch封装



面试全家桶

HTML+CSS 面试整理                                --------------------------------> 点这里

前端高级面试整理(三大框架等深入知识) --------------------------------> 点这里

javascript性能优化                                      --------------------------------> 点这里

javascript设计模式                                      --------------------------------> 点这里

HTTP相关面试                                            -------------------------------->点这里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96621.html

相关文章

  • 前端开发-从入门到Offer - 收藏集 - 掘金

    摘要:一些知识点有哪些方法方法前端从入门菜鸟到实践老司机所需要的资料与指南合集前端掘金前端从入门菜鸟到实践老司机所需要的资料与指南合集归属于笔者的前端入门与最佳实践。 工欲善其事必先利其器-前端实习简历篇 - 掘金 有幸认识很多在大厂工作的学长,在春招正式开始前为我提供很多内部推荐的机会,非常感谢他们对我的帮助。现在就要去北京了,对第一份正式的实习工作也充满期待,也希望把自己遇到的一些问题和...

    sf_wangchong 评论0 收藏0
  • 一个普通本科在校生的前端学习之路

    摘要:也就正式开始了我的前端之路。在这期间,我还购买并配置了自己的云服务器,自己的博客系统,自己的还学会了的基本操作。不必说的是高级程序设计豆瓣链接这本书,也就是大家常说的高程,基本上每个合格的前端程序员都要熟读很多很多次,每次读都会有新发现。 原创 西安前端交流会: 卡农 ovenzeze@qq.com 本文章同步发表在wdShare西安前端交流会网站、我的个人博客以及segmentF...

    mylxsw 评论0 收藏0
  • 一个普通本科在校生的前端学习之路

    摘要:也就正式开始了我的前端之路。在这期间,我还购买并配置了自己的云服务器,自己的博客系统,自己的还学会了的基本操作。不必说的是高级程序设计豆瓣链接这本书,也就是大家常说的高程,基本上每个合格的前端程序员都要熟读很多很多次,每次读都会有新发现。 原创 西安前端交流会: 卡农 ovenzeze@qq.com 本文章同步发表在wdShare西安前端交流会网站、我的个人博客以及segmentF...

    buildupchao 评论0 收藏0
  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • 前端思考 - 收藏集 - 掘金

    摘要:并尝试用为什么你统计的方式是错的掘金翻译自工程师的文章。正如你期望的,文中的前端开发单一职责原则前端掘金单一职责原则又称单一功能原则,面向对象五个基本原则之一。 单页式应用性能优化 - 首屏数据渐进式预加载 - 前端 - 掘金前言 针对首页和部分页面打开速度慢的问题,我们开始对单页式应用性能进行优化。本文介绍其中一个方案:基于 HTTP Chunk 的首屏数据渐进式预加载方案,该方案总...

    LinkedME2016 评论0 收藏0

发表评论

0条评论

AbnerMing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<