【前端面试题】面试易考易错求值题
大熊•
arguments 求值题
arguments
对象是函数内部的本地变量;arguments
已经不再是函数的属性了。
arguments
对象并不是一个真正的数组。它类似于数组,但没有数组所特有的属性和方法,除了 length
。
arguments
对象仅在函数内部有效,在函数外部调用 arguments
对象会出现一个错误。 下面是其包含的方法:
arguments.callee
: 指向当前执行的函数。arguments.caller
: 指向调用当前函数的函数。arguments.length
: 指向传递给当前函数的参数数量。
function side(arr) {
arr[0] = arr[2];
}
function func1(a, b, c = 3) {
c = 10;
side(arguments);
console.log(a + b + c);
}
function func2(a, b, c) {
c = 10;
side(arguments);
console.log(a + b + c);
}
const func3 = (a, b, c) => {
c = 10;
side(arguments);
console.log(a + b + c);
}
func1(1, 1, 1);
func2(1, 1, 1);
func3(1, 1, 1);
结果是:12,21,会报错arguments
是 undefined
一般情况下,给参数进行复制修改,其 arguments 的值也会修改。
在给参数进行赋值时,将其变为严格模式,对参数的修改,其 arguments 的值不被修改。
关于 Math 最大值和最小值
var min = Math.min();
var max = Math.max();
console.log(min < max);
// Math.min() 正的无穷大, Math.max() 负的无穷大
// 条件判断为假的情况有:0,false,'',null,undefined,未定义对象。 以及NaN
ToString 转化
下面列出常见转换为 String 类型的规则:
null
:转为"null"
undefined
:转为"undefined"
Boolean
类型:true
转为"true"
,false
转为"false"
Number
类型:转为数字的字符串形式, 如10
转为"10"
,1e21
转为"1e+21"
Array
类型:转为字符串将各元素以小写逗号 , 连接,相当于调用数组Array.prototype.join()
方法。空数组转为空字符串 ''。数组中null
和undefined
会被当作 空字符串 处理普通对象
:转为字符串相当于直接使用Object.prototype.toString()
,返回[object Object]
更加详细介绍可以参照这里 传送门
- 经典面试题
(a == 1) && (a == 2) && (a == 3)
能不能为 true?
const a = {
num: 0,
valueOf: function () {
return (this.num += 1);
},
};
const eq = a == 1 && a == 2 && a == 3;
console.log(eq);
// true
// 或者改写他的 toString 方法
const num = 0;
Function.prototype.toString = function () {
return ++num;
};
function a() {}
// 还可以改写 ES6 的 Symbol 类型的 toPrimitive 的方法
const a = {
[Symbol.toPrimitive]: (function (i) {
return function () {
return ++i;
};
})(0),
};
- arry,obj 转成字符串的结果是什么?
var arry = []; //""
var obj = {}; //[object Object]
map 和 parseInt 面试题
[1, 2, 3, 4, 5].map(parseInt);
map
: 数组中的每个元素都会执行这个函数,参数值(item,key,arry)。 parseInt 的第二位是进制数。
因此转化的结果为: [1, NaN, NaN, NaN, NaN];
import 导入的值为 const 类型
//快手面试题目
//counter.js
let counter = 10;
export default counter;
//index.js
import myCounter from "./counter";
myCounter += 1;
console.log(myCounter); //这个地方会报错,因为myCounter是个const
对象键为字符串类型考点
- 下面的代码打印什么内容,为什么?
var a = {}, b = '123', c = 123;
a[b] = 'b';
a[c] = 'c';
console.log(a[b]);
- 下面的代码打印什么内容,为什么?
var a = {}, b = Symbol('123'), c = Symbol('123');
a[b] = 'b';
a[c] = 'c';
console.log(a[b]);
- 下面的代码打印什么内容,为什么?
var a = {}, b = { key: '123' }, c = { key: '456' };
a[b] = 'b';
a[c] = 'c';
console.log(a[b]);
转化为驼峰命名【正则考察】
这道题是对正则综合考察,考察常用。
const toCamelCaseVar = (variable) => {
return variable.replace(/\-+[a-zA-Z]/g, (m, i) => {
if (i) return m.match(/[a-zA-Z]/)[0].toUpperCase();
else return m;
});
};
console.log(toCamelCaseVar('get-element-by-id'));
代码结果输出题
let { a, b, c } = { c: 3, b: 2, a: 1 }
console.log(a, b, c)
//这题考察的是变量解构赋值的问题,数组解构赋值是按位置对应的,而对象只要变量与属性同名,顺序随意。
console.log(Object.assign([1, 2, 3], [4, 5])) //[4, 5, 3]
//是不是从来没有用assign方法合并过数组?assign方法可以用于处理数组,不过会把数组视为对象,比如这里会把目标数组视为是属性为0、1、2的对象,所以源数组的0、1属性的值覆盖了目标对象的值。
快手面试题
var x = 10;
function a(y) {
var x = 20;
return b(y);
}
function b(y) {
console.log(x, y);
return x + y;
}
console.log(a(20));
结果是 30。 对闭包的解释是,函数块以及函数定义时所在的词法环境两者的结合就称为闭包
说出下面的返回值
[1, 2, 3, 4, 5].map(parseInt);
结果为: [1, NaN, NaN, NaN, NaN];
, map 方法的三个参数为: item,key,arry
形成的三个参数。
parseInt
的第二个参数表示要转化为的进制。
快手求值题
//counter.js
let counter = 10;
export default counter;
//index.js
import myCounter from "./counter";
myCounter += 1;
console.log(myCounter); //这个地方会报错,因为myCounter是个const