typeof
能获得哪些类型值类型
:变量自己就是含有赋予给它的数值的,它的变量自己及保存的数据都存储在栈的内存块当中引用类型
:引用类型固然是分配到堆上的对象或者数据变量,根据官方一点的解释就是引用类型的变量只包括对其所表示的数据引用
typeof abc //"undefined"
typeof NaN //"number"
typeof null //"object"
typeof console.log //"function"
复制代码
typeof只能区分值类型,对引用类型无能为力,只能区分函数function
NaN
表示特殊的非数字值,null
是空指针,并无指向任何一个地址
typeof
能区分的五种基本类型:string
、boolean
、number
、undefined
、symbol
和函数function
javascript
100 == '100' //true
0 == "" //true
null == undefined //true
复制代码
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);html
在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
}
复制代码
JSON.stringify({a:10,b:20})
JSON.parse('{"a":10,"b":20}')
复制代码
__proto__
属性,属性值是一个普通的对象prototype
属性,属性值也是一个普通的对象__proto__
属性指向它的构造函数的prototype
属性__proto__
(即它的构造函数的prototype
中寻找)
instanceof
:用于判断引用类型属于哪一个构造函数的方法java
f instanceof Foo
的判断逻辑是:node
__proto__
一层一层往上,可否对应到Foo.prototype
f instance Object
var arr = []
arr instanceOf Array
//true
jquery
typeof arr
//object,typeof
是没法判断是不是数组的ios
通用判断方法: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('<p>ds<p>')
//div1.on('click',function(){
// alert('clicked')
// }
//)
div1.html('<p>放大放大放大发范德萨大点的我请萨</p>').on('click',function(){
alert('clicked');
}).html('<p>javascript</p>')
复制代码
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
}
复制代码
题目:ajax
- 说一下对变量提高的理解
- 说明this几种不一样的使用场景
- 建立10个
< a>
标签,点击的时候弹出对应的序号- 如何理解做用域
- 实际开发中闭包的应用
<script>
或者一个函数
<script>
console.log(a) //undefined
var a = 100
fn('zhangsan') //'zhangsan' 20
function fn(name){
age = 20
console.log(name,age)
var age
}
复制代码
undefined
占位this
、arguments
都要先提取出来函数声明
和函数表达式
的区别fn() //不会报错
function fn(){
//声明
}
复制代码
fn() //Uncaught TypeError:fn1 is not a function
var a = function(){
//表达式
}
复制代码
- 变量提高: var a ; undefined,并不知道是一个函数
- 函数提高: 把函数声明提早
fn('zhangsan')
function fn(name){
//函数
console.log(this)
console.log(arguments)
age = 20
console.log(name,age)
var age
bar(100)
function bar(num){
console.log(num)
}
}
复制代码
call
、apply
、bind
var a = {
name : 'A',
fn:function(){
console.log(this.name)
}
}
a.fn() //this === a
a.fn.call({name:'B'}) //this === {name:'B'}
var fn1 = a.fn
fn1() //this === window
复制代码
this要在执行的时候才能确认值chrome
没有块级做用域
if(true){
var name = 'zhangsan'
}
console.log(name)
复制代码
函数做用域和全局做用域
var a = 100
function fn(){
var a = 200
console.log('fn',a)
}
console.log('global',a)
fn()
复制代码
如何理解做用域:
var a = 100
function fn(){
var b = 200
//当前做用域没有定义的变量,即“自由变量”
console.log(a)
console.log(b)
}
fn()
复制代码
自由变量做用域链,一直往父级做用域找,一直找到全局做用域
var a = 100
function F1(){
var b = 200
function F2(){
var c = 300
console.log(a) //a是自由变量
console.log(b) //b是自由变量
console.log(c)
}
F2()
}
F1()
复制代码
做用域是定义时的做用域,而不是执行时的做用域
闭包的使用场景:
函数做为返回值
function F1(){
var a = 100
//返回一个函数(函数做为返回值)
return function(){
console.log(a)
}
}
var f1 = F1()
var a = 200
f1()
复制代码
函数做为参数传递
function F1(){
var a = 100
return function(){
console.log(a) //自由变量,父做用域寻找
}
}
var f1 = F1()
function F2(fn){
var a = 200
fn()
}
F2(f1)
复制代码
在某一做用域中,声明变量的语句会默认解析为在该做用域的最开始就已经声明了
< a>
标签,点击的时候弹出对应的序号错误写法
var i,a
for(i = 0;i<10;i++){
a = document.createElement('a')
a.innerHTMl = i + '<br>'
a.addEventListener('click',function(e){
e.preentDefault()
alert(i)
})
document.body.appendChild(a)
}
复制代码
正确写法
var i,a
for(i = 0;i < 10;i++){
(function(i){
var a = document.createElement('a')
a.innerHTML = i + '<br>'
a.addEventListener('click',function(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
})(i)
}
复制代码
//闭包实际应用中主要用于封装变量,收敛权限
function isFirstLoad(){
var _list = [];
return function(id){
if(_list.indexOf(id) >= 0){
return false;
}else{
_list.push(id);
return true;
}
}}
var firstLoad = isFirstLoad();
firstLoad(10);
复制代码
题目:
- 同步和异步的区别是什么?分别举一个同步和异步的例子
- 一个关于
setTimeout
的笔试题- 前端使用异步的场景有哪些
知识点:
- 什么是异步(对比同步)
- 前端使用异步的场景
- 异步和单线程
是否阻塞程序的运行
在可能发生等待的状况
setTimeout
,setTimeInterval
ajax
请求,动态<img>
加载等待过程当中不能像alert
同样阻塞程序运行
所以全部的“等待的状况”都须要异步
console.log(100)
setTimeout(function(){
console.log(200)
},1000)
console.log(300)
复制代码
同步会阻塞代码执行,而异步不会
console.log(1)
setTimeout(function(){
console.log(2)
},0)
console.log(3)
setTimeout(function(){
console.log(4)
},1000)
console.log(5)
复制代码
须要等待,由于js是单线程语言
题目
- 获取
2017-06-10
格式的日期- 获取随机数,要求是长度一直的字符串格式
- 写一个能遍历对象和数组的通用forEach函数
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.random()
:能够用来清除缓存
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 '<br>'+index+':'+item+'<br>'
})
复制代码
array.filter
var arr2 = arr.filter(function (item,index){
//经过某一个条件过滤数组
if(item >= 2)
return true
})
复制代码
var obj = {
x:100,
y:200,
z:300
}
var key
for(key in obj){
if(obj.hasOwnProperty(key)){
console.log(key,obj[key])
}
}
复制代码
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)
复制代码
var random = Math.random() + '0000000000';
var random = random.slice(0,10);
复制代码
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基础知识:ECMA262标准
- JS-Web-API:W3C标准
W3C标准中关于JS的规定有:
- DOM操做
- BOM操做
- 事件绑定
- ajax请求(包括http协议)
- 存储
DOM的本质
Document
、Object
、Model
浏览器把拿到的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结构操做
树
property
和Attribute
property只是一个JS对象的属性的修改
Attribute是对html标签属性的修改
问题:
- 如何检测浏览器的类型
- 拆解URL各部分
知识点
- navigator
- screen
- location
- history
//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低版本的兼容性
attachEvent
绑定事件,和W3C标准不同e.stopPropatation()
//取消冒泡
<div id="div1">
<a href = "#">a1</a>
<a href = "#">a2</a>
<a href = "#">a3</a>
<a href = "#">a4</a>
<!--会随时新增更多 a 标签-->
</div>
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)
})
复制代码
题目:
- 手动写一个
ajax
,不依赖第三方库- 跨域的几种实现(原理)
知识点:
- 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兼容性问题
.
状态码说明
send()
方法send()
方法,正在发送请求send()
方法执行完成,已经接收到所有相应内容.
status说明
- 2XX - 表示成功处理请求。如200
- 3XX - 须要重定向,浏览器直接跳转
- 4XX - 客户端请求错误,如404
- 5XX - 服务器端错误
什么是跨域
ajax
访问其余域的接口
能够跨域的三个标签
<img src=''>
<script src=''>
<link href=''>
三个标签的场景
<img>
用于打点统计,统计网站多是其余域(并且没有任何兼容性问题)<link>
<script>
可使用CDN,CDN也是其余域<script>
能够用于JSONP
跨越注意的问题
JSONP实现原理
<script src="http://coding.xxxxx.com/api.js">
//例如你的网站要跨域访问xx网的一个接口
//给你一个地址 http://coding.xxxx.com/api.js
//返回内容格式 callback({x:100,y:200})
<script>
window.callback = function(data){
//这是咱们跨域获得信息
console.log(data)
}
</script>
<script src="http://coding.m.xxxxx.com/api.js"></script>
复制代码
服务器端设置http header
cookie
、sessionStorage
、localStorage
的区别
- 容量
- 是否会携带到ajax中
- API易用性
ios safari隐藏模式下,localStorage.getItem会报错,建议统一用try-catch封装
复制代码
HTML+CSS 面试整理 --------------------------------> 点这里
前端高级面试整理(三大框架等深刻知识) --------------------------------> 点这里
javascript性能优化 --------------------------------> 点这里
javascript设计模式 --------------------------------> 点这里
HTTP相关面试 -------------------------------->点这里