前端面试 75 道题,看完的人少之又少 (中)( 三 )


function one() {return arguments;}const two = function () {return arguments;}const three = function three() {return arguments;}const four = () => arguments;four(); // Throws an error- arguments is not defined当我们调用函数four时 , 它会抛出一个ReferenceError: arguments is not defined error 。 使用rest语法 , 可以解决这个问题 。
const four = (...args) => args;这会自动将所有参数值放入数组中 。
38. 如何创建一个没有 prototype(原型)的对象?我们可以使用Object.create方法创建没有原型的对象 。
const o1 = {};console.log(o1.toString()); // [object Object]const o2 = Object.create(null);console.log(o2.toString());// throws an error o2.toString is not a function 39. 为什么在调用这个函数时 , 代码中的b会变成一个全局变量?function myFunc() {let a = b = 0;}myFunc();原因是赋值运算符是从右到左的求值的 。 这意味着当多个赋值运算符出现在一个表达式中时 , 它们是从右向左求值的 。 所以上面代码变成了这样:
function myFunc() {let a = (b = 0);}myFunc();首先 , 表达式b = 0求值 , 在本例中b没有声明 。 因此 , JS引擎在这个函数外创建了一个全局变量b , 之后表达式b = 0的返回值为0 , 并赋给新的局部变量a 。
我们可以通过在赋值之前先声明变量来解决这个问题 。
function myFunc() {let a,b;a = b = 0;}myFunc();40. ECMAScript 是什么?ECMAScript 是编写脚本语言的标准 , 这意味着JavaScript遵循ECMAScript标准中的规范变化 , 因为它是JavaScript的蓝图 。
ECMAScript 和 Javascript , 本质上都跟一门语言有关 , 一个是语言本身的名字 , 一个是语言的约束条件 只不过发明JavaScript的那个人(Netscape公司) , 把东西交给了ECMA(European Computer Manufacturers Association) , 这个人规定一下他的标准 , 因为当时有java语言了 , 又想强调这个东西是让ECMA这个人定的规则 , 所以就这样一个神奇的东西诞生了 , 这个东西的名称就叫做ECMAScript 。
javaScript = ECMAScript + DOM + BOM(自认为是一种广义的JavaScript)
ECMAScript说什么JavaScript就得做什么!
JavaScript(狭义的JavaScript)做什么都要问问ECMAScript我能不能这样干!如果不能我就错了!能我就是对的!
——突然感觉JavaScript好没有尊严 , 为啥要搞个人出来约束自己 ,
那个人被创造出来也好委屈 , 自己被创造出来完全是因为要约束JavaScript 。
41. ES6或ECMAScript 2015有哪些新特性?

  • 箭头函数
  • 模板字符串
  • 加强的对象字面量
  • 对象解构
  • Promise
  • 生成器
  • 模块
  • Symbol
  • 代理
  • Set
  • 函数默认参数
  • rest 和展开
  • 块作用域
42. var,let和const的区别是什么?var声明的变量会挂载在window上 , 而let和const声明的变量不会:
var a = 100;console.log(a,window.a);// 100 100let b = 10;console.log(b,window.b);// 10 undefinedconst c = 1;console.log(c,window.c);// 1 undefinedvar声明变量存在变量提升 , let和const不存在变量提升:
console.log(a); // undefined===>a已声明还没赋值 , 默认得到undefined值var a = 100;console.log(b); // 报错:b is not defined===> 找不到b这个变量let b = 10;console.log(c); // 报错:c is not defined===> 找不到c这个变量const c = 10;let和const声明形成块作用域
if(1){var a = 100;let b = 10;}console.log(a); // 100console.log(b)// 报错:b is not defined===> 找不到b这个变量-------------------------------------------------------------if(1){var a = 100;const c = 1;}console.log(a); // 100console.log(c)// 报错:c is not defined===> 找不到c这个变量同一作用域下let和const不能声明同名变量 , 而var可以
var a = 100;console.log(a); // 100var a = 10;console.log(a); // 10-------------------------------------let a = 100;let a = 10;//控制台报错:Identifier 'a' has already been declared===> 标识符a已经被声明了 。 暂存死区
var a = 100;if(1){a = 10;//在当前块作用域中存在a使用let/const声明的情况下 , 给a赋值10时 , 只会在当前作用域找变量a ,// 而这时 , 还未到声明时候 , 所以控制台Error:a is not definedlet a = 1;}const
/**1、一旦声明必须赋值,不能使用null占位 。 **2、声明后不能再修改**3、如果声明的是复合类型数据 , 可以修改其属性** */const a = 100; const list = [];list[0] = 10;console.log(list);// [10]const obj = {a:100};obj.name = 'apple';obj.a = 10000;console.log(obj);// {a:10000,name:'apple'}43. 什么是箭头函数?箭头函数表达式的语法比函数表达式更简洁 , 并且没有自己的this , arguments , super或new.target 。 箭头函数表达式更适用于那些本来需要匿名函数的地方 , 并且它不能用作构造函数 。