前端面试 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 和展开
- 块作用域
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 undefined
var声明变量存在变量提升 , 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 。 箭头函数表达式更适用于那些本来需要匿名函数的地方 , 并且它不能用作构造函数 。
- 三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经
- java面试题整理
- 面试官:问你一个,Spring事务是如何传播的?
- 程序员面试主要看哪些 该怎么准备面试内容
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 2020金九银十安卓面试题来袭(猿辅导+斗鱼+字节+腾讯)
- 「8」进大厂必须掌握的面试题-Java面试-异常和线程
- 安卓面试必备的JVM虚拟机制详解,看完之后简历上多一个技能
- 成功拿下阿里P6的offer后,总结出大厂面试的血泪史
- 面试官:聊聊 etcd 中的 Raft 吧