【前端面试题】面试易考易错求值题

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() 方法。空数组转为空字符串 ''。数组中 nullundefined 会被当作 空字符串 处理
  • 普通对象:转为字符串相当于直接使用 Object.prototype.toString(),返回 [object Object]

更加详细介绍可以参照这里 传送门

  1. 经典面试题
    (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),
};
  1. 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

对象键为字符串类型考点

  1. 下面的代码打印什么内容,为什么?
var a = {}, b = '123', c = 123;
a[b] = 'b';
a[c] = 'c';
console.log(a[b]);
  1. 下面的代码打印什么内容,为什么?
var a = {}, b = Symbol('123'), c = Symbol('123');
a[b] = 'b';
a[c] = 'c';
console.log(a[b]);
  1. 下面的代码打印什么内容,为什么?
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
关于我
loading