ajavascript
年末了,又到了跳槽季啦,该刷题走起了。这里总结了一些被问到可能会懵逼的面试真题,有须要的能够看下~css
DNS 是什么-- Domain Name System,域名系统,做为域名和IP地址相互映射的一个分布式数据库。前端
浏览器根据自定义的规则,提早去解析后面可能用到的域名,来加速网站的访问速度。简单来说就是提早解析域名,以避免延迟。java
<link rel="dns-prefetch" href="//wq.test.com">
这个功能有个默认加载条件,全部的a标签的href都会自动去启用DNS Prefetching,也就是说,你网页的a标签href带的域名,是不须要在head里面加上link手动设置的。但a标签的默认启动在HTTPS不起做用。git
这时要使用 meta里面http-equiv来强制启动功能。程序员
<meta http-equiv="x-dns-prefetch-control" content="on">
咱们常常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。这是一个错误的说法,实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度。为了明确这个概念,咱们必须再次强调下面几点:github
第一步,经过使用 pushState + ajax 实现浏览器无刷新前进后退,当一次 ajax 调用成功后咱们将一 条 state 记录加入到 history 对象中。web
第二步,一条 state 记录包含了 url、title 和 content 属性,在 popstate 事件中能够 获取到这个 state 对象,咱们可 以使用 content 来传递数据。第三步,咱们经过对 window.onpopstate 事件监听来响应浏览器 的前进后退操做。面试
使用 pushState 来实现有两个问题,一个是打开首页时没有记录,咱们可使用 replaceState 来将首页的记录替换,另外一个问 题是当一个页面刷新的时候,仍然会向服务器端请求数据,所以若是请求的 url 须要后端的配 合将其重定向到一个页面。ajax
更多参考:http://blog.chenxu.me/post/detail?id=ed4f0732-897f-48e4-9d4f-821e82f17fad
也就是说,无论 Proxy 怎么修改默认行为,你总能够在 Reflect 上获取 默认行为。
全部 typeof 返回值为 "object" 的对象(如数组)都包含一个内部属性 [[Class]](我 们能够把它看做一个内部的分类,而非传统的面向对象意义上的类)。这个属性没法直接访问, 通常经过 Object.prototype.toString(..) 来查看。例如:
Object.prototype.toString.call( [1,2,3] ); // "[object Array]"
Object.prototype.toString.call( /regex-literal/i ); //"[object RegExp]"
多数状况下,对象的内部[[class]]属性和建立该对象的内建原生构造函数相对应,不过也不老是这样。2.基本类型值的[[class]]属性
虽然Null()和Undefined()这样的原生构造函数并不存在,可是内部[[class]]属性仍然是“Null”和“Undefined”。
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
其余基本类型值的状况有所不一样:
console.log(Object.prototype.toString.call("abc")); //[object String]
console.log(Object.prototype.toString.call(42)); //[object Number]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
基本类型值被各自的封装对象自动包装,因此他们的内部[[class]]属性分别为“String”,“Number”和“Boolean”。3.封装对象
因为基本类型值没有.length和.toString()这样的属性和方法,须要经过封装对象才能访问,此时Javascript引擎会自动为基本类型值包装一个封装对象。
//封装对象包装
var b = 'abc';
console.log(b.length);
console.log(b.toUpperCase());
```js
通常不直接使用封装对象(即经过new操做建立基本类型值),优先考虑使用“abc”和“42”这样的基本类型值,而不是new String("abc") 和 new Number(42)。4.拆封
若是想要获得封装对象中的基本类型值,可使用valueOf()函数。
```js
//封装对象的拆封
var s = new String( "abc" );
var n = new Number( 42 );
var b = new Boolean( true );
console.log(s.valueOf());
console.log(n.valueOf());
console.log(b.valueOf());
堆和栈的概念存在于数据结构中和操做系统内存中。在数据结构中,栈中数据的存取方式为 先进后出。而堆是一个优先队列,是按优先级来进行排序的,优先级能够按照大小来规定。彻底 二叉树是堆的一种实现方式。在操做系统中,内存被分为栈区和堆区。栈区内存由编译器自动分 配释放,存放函数的参数值,局部变量的值等。其操做方式相似于数据结构中的栈。堆区内存一 般由程序员分配释放,若程序员不释放,程序结束时可能由垃圾回收机制回收。
详细资料能够参考:《什么是堆?什么是栈?他们之间有什么区别和联系?》
函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返 回 true,所以非数字值传入也会返回 true ,会影响 NaN 的判断。
函数 Number.isNaN 会首先判断传入参数是否为数字,若是是数字再继续判断是否为 NaN ,这种方法对于 NaN 的判断更为准确。
(1) if (..) 语句中的条件判断表达式。(2) for ( .. ; .. ; .. ) 语句中的条件判断表达式(第二个)。(3) while (..) 和 do..while(..) 循环中的条件判断表达式。(4) ? : 中的条件判断表达式。(5) 逻辑运算符 ||(逻辑或)和 &&(逻辑与)左边的操做数(做为条件判断表达式)。
已在做用域中声明但尚未赋值的变量,是 undefined 的。相反,尚未在做用域中声明 过的变量,是 undeclared 的。对于 undeclared 变量的引用,浏览器会报引用错误,如 ReferenceError: b is not defined 。可是咱们可使用 typeof 的安全防范机制来避免 报错,由于对于 undeclared(或者 not defined )变量,typeof 会返回 "undefined"。
function getType(value) {
// 判断数据是 null 的状况
if (value === null) {
return value + "";
}
// 判断数据是引用类型的状况
if (typeof value === "object") {
let valueClass = Object.prototype.toString.call(value),
type = valueClass.split(" ")[1].split("");
type.pop();
return type.join("").toLowerCase();
} else {
// 判断数据是基本数据类型的状况和函数的状况
return typeof value
}
}
最后
欢迎加我微信(winty230),拉你进技术群,长期交流学习...
欢迎关注「前端Q」,认真学前端,作个专业的技术人...