总结一些前端基础的知识,有些知识可能在前端面试的时候会问到,所以做个记录,也有助于其他人查看,如果有什么问题,可以指出,会积极修正。
变量类型和计算
JS中typeof的类型有哪些
console.log(typeof undefined); //undefined console.log(typeof 123); //number console.log(typeof '123'); //string console.log(typeof true); //boolean console.log(typeof [1,2,3]); //object console.log(typeof {"id": 11}); //object console.log(typeof null); //object console.log(typeof console.log); //function
类型转换
显式类型转换
NaN
null
undefined
0
""
false
数字:转换成对应的字符串
字符串:还是对应的字符串
布尔值:true为'true',false为'false'
undefined:undefined
null:null
object:先执行toString,看是否能转换,如果不可以再执行valueOf,看是否可以转换,如果不可以报错
数字:转换后还是数字
字符串:如果可以被解析为数值,则为相应的数值,如果不能,则是 NaN,如果是空字符串那就是0
布尔值:true为1,false为0
undefined:NaN
null:0
object:先执行valueOf,看是否能转换,如果不可以再执行toString,看是否可以转换,如果不可以报错
Number 函数
String 函数
Boolean下面这几个是false,其他都是true
隐式类型转换
四则运算
判断语句
奇葩的类型转换面试题
何时使用
==
,何时使用===
除了
obj.a == null
以外,都用===
,==
要用的时候一定要是已经定义的obj.a == null
转换之后其实是obj.a == null || obj.a == undefined
JS中有哪些内置函数
Object Array Boolean Number String Function Date RegExp Error
JS变量按照存储方式有哪些类型
1.值类型
2.引用类型(节省空间,公用内存块)
区别:值类型改变一个不会影响其他的,引用类型改变都改变,因为公用内存块
如何理解JSON
JSON是JS的一个对象,也是一种数据格式,JSON中的两个api如下
将JSON字符串转换成JSON对象
JSON.parse()
将JSON对象转换成JSON字符串
JSON.stringify()
使用Object.prototype.toString
获取一个对象的类型
var toString = Object.prototype.toString;toString.call(new Date); // [object Date]toString.call(new String); // [object String]toString.call(Math); // [object Math]toString.call(/s/); // [object RegExp]toString.call([]); // [object Array]//Since JavaScript 1.8.5toString.call(undefined); // [object Undefined]toString.call(null); // [object Null]
原型和原型链
原型的五条规则
所有的引用类型都可以自定义添加属性
所有的引用类型都有自己的隐式原型(proto)
函数都有自己的显式原型(prototype)
所有的引用类型的隐式原型都指向对应构造函数的显示原型
使用引用类型的某个自定义属性时,如果没有这个属性,会去该引用类型的__proto__(也就是对应构造函数的prototype)中去找
如何准确判断一个变量是数组类型
arr instanceof Array
instanceof判断一个引用类型是什么引用类型,是通过__proto__(隐式原型一层一层往上找,能否找到对应构造函数的prototype)
写一个原型链继承的例子
function Element(ele) { this.ele = document.getElementById(ele);}Element.prototype.html = function(val) { var ele = this.ele; if (val) { ele.innerHTML = val; return this; } else { return ele.innerHTML; }};Element.prototype.on = function(type, fn) { var ele = this.ele; ele.addEventListener(type, fn); return this;}var element = new Element('main');element.html('hello').on('click', function() { alert('handleClick');});
描述new一个对象的过程
创建一个新对象
this指向这个新对象
执行代码给this赋值
return this
function Foo(name) { this.name = name; // return this; // 本身会执行这一步}var f = new Foo('shiyanping');
作用域及闭包
变量提升
以下两种情况会进行提升:
变量定义
函数说明
this几种不同的使用场景
在构造函数中使用(构造函数本身)
作为对象属性时使用(调用属性的对象)
作为普通函数时使用(window)
call,apply,bind(执行的第一个参数)
var a = { name: 'A', fun: function() { console.log(this.name); }};a.fun(); //this === aa.fun.call({ name: 'B' }); //this === { name: 'B' }var fun1 = a.fun;fun1(); //this === window
如何理解作用域
自由变量
作用域链,及自由变量的查找,找不到逐级向上找
闭包的两个场景
函数作为变量传递
函数作为返回值
实际开发中闭包的应用
// 判断一个数字是否出现过function isFirst() { var _list = []; return function(id) { if (_list.indexOf(id) >= 0) { return false; } else { _list.push(id); return true; } };}var first = isFirst();first(10);first(10);first(20);
单线程和异步
同步和异步的区别,分别列举一个同步和异步的例子
同步会阻塞代码,但是异步不会 alert是同步 setTimeout是异步
关于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
前端使用异步的场景
定时任务:setTimeout,setInterval
网络请求:ajax请求,动态img加载
事件绑定
需要等待的情况下都需要异步,因为不会像同步一样阻塞