Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

前端面经总结 #1

Open
ElonXun opened this issue Nov 10, 2017 · 0 comments
Open

前端面经总结 #1

ElonXun opened this issue Nov 10, 2017 · 0 comments
Assignees

Comments

@ElonXun
Copy link
Owner

ElonXun commented Nov 10, 2017

==和===的区别
===叫做严格运算符 ==叫做相等运算符
严格运算符比较时不仅仅比较数值还要比较数据类型是否一样
相等运算符在比较相同类型的数据时,与严格相等运算符完全一样。 在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。

undefined == null //true
undefined === null //false

ee75ea7a-c490-4719-8f1b-ba25801b44ad
ps:判断NaN可以用Object.is()

Object.is(NaN, NaN); //true

undefined和null的区别
首先,undefinednullif语句中,都会被自动转为false,即null==undefined结果为true

通常 null表示"没有对象",即该处不应该有值,一般用法如下:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。Object.getPrototypeOf(Object.prototype) // null
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义,一般用法:
(1)变量被声明了,但没有赋值时,就等于undefined
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined
(3)对象没有赋值的属性,该属性的值为undefined
(4)函数没有返回值时,默认返回undefined


JS的基本数据类型

JS基本数据类型有5种
String Number Boolean Null Undefined
以及引用数据类型Object(包括Array Function)


JS中typeof和instanceof用法区别

首先typeof用以获取一个变量类型
typeof一般只能返回如下几个结果
number boolean string function object undefined

console.log(typeof i);    // undefined
console.log(typeof 1);   // number
console.log(typeof 'a'); // string
console.log(typeof true);  // boolean

console.log(typeof function () {});  //function

console.log(typeof [1, '2', true]);  //object
console.log(typeof { o: 'hello', c: 'world' });  //object
console.log(typeof null);  //object
console.log(typeof new Number(2));  //object

以上可知用typeof无法判断array类型 因为不管是数组还是对象都会返回object
这时候就需要instanceof
instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性 即判断一个变量是否是某个对象的实例

var arr = [1,2,3]; 
alert(arr instanceof Array);   // true

ps:其他判断方法如下
Array.isArray

Array.isArray([1, 2, 3]);  // true
Array.isArray({foo: 123}); // false
Array.isArray('foobar');   // false
Array.isArray(undefined);  // false

constructor

var arr = [1,2,3]; 
console.log(arr.constructor === Array);   // true

Object.prototype.toString.call()

var arr = [1,2,3];
Object.prototype.toString.call(arr) === "[object Array]"; //true

JS用setTimeout递归实现setInterval

首先 setTimeout()setInterval()经常被用来处理延时和定时任务 setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除

//setTimeout实现setInterval功能
setTimeout(function(){
  //do something
  setTimeout(arguments.callee,interval);
},interval)

ps:为什么要用setTimeout实现setInterval?
JS中的arguments和arguments.callee

arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数
calleearguments 对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内
代码演示:
arguments
此外arguments是类数组对象 其没有Array的一些方法 但有类似Array的一些特点
将函数的实际参数转换成数组的方法如下

/**
_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);
**/
var args = Array.prototype.slice.call(arguments)//方法一
var args = [].slice.call(arguments, 0)//方法二
//方法三:
var args = [];
for (var i = 1; i < arguments.length; i++) {
  args.push(arguments[i]);
}

JS严格模式('use strict')
首先是严格模式的用法

// 为整个script标签开启严格模式, 需要在所有语句之前放一个特定语句 "use strict";
"use strict";
var v = "Hi!  I'm a strict mode script!";


//要给某个函数开启严格模式,得把 "use strict";声明一字不漏地放在函数体所有语句之前
function strict(){
  // 函数级别严格模式语法
  'use strict';
  function nested() { return "And so am I!"; }
  return "Hi!  I'm a strict mode function!  " + nested();
}
function notStrict() { return "I'm not strict."; }

严格模式同时改变了语法及运行时行为。变化通常分为这几类:将问题直接转化为错误(如语法错误或运行时错误), 简化了如何为给定名称的特定变量计算,简化了 eval 以及 arguments, 将写"安全"JavaScript的步骤变得更简单

严格模式主要涉及如下几个方面

  1. 创设eval作用域
  2. 禁止this关键字指向全局对象
  3. 禁止在函数内部遍历调用栈(即禁止使用argumentscallee)
  4. 对象不能有重名的属性
  5. 函数不能有重名的参数
  6. 函数必须声明在顶层
  7. ...

详情 请移步阮一峰的 Javascript 严格模式详解

JS闭包

闭包Closure详见 白话JS闭包

JS数组去重的简洁方法

主要是利用 ES6 setfilter方法 详见 最近碰到的sort排序 以及 set和filter数组去重

JS中的apply、call、bind
简单总结:

apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply 、 call 、bind 三者都可以利用后续参数传参;
bind是返回对应函数,便于稍后调用;apply、call则是立即调用
call 需要把参数按顺序一个个传递进来,而 apply 则是把参数放在数组里

详情移步深入浅出妙用 Javascript 中 apply、call、bind

JS的 for in 和 for of
简单说 for in是遍历keyfor of是遍历value

let arr = ["a","b"];
for (a in arr) {
    console.log(a);//0,1
}

for (a of arr) {
    console.log(a);//a,b
}

ps:如何将对象的键名输出数组
for in object keys

当然for in配合hasOwnProperty可以过滤来着原型链上继承得到的属性
for in hasownproperty

异步解决方案Promise

Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiledreject是将Promise的状态置为rejected

举个🌰
promise

ps:promise详情请移步大白话讲解Promise

@ElonXun ElonXun self-assigned this Nov 12, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant