前端面试必看!从 add 函数深挖 JavaScript 核心知识🧐

前言

在前端开发的面试战场上,JavaScript 可谓是重中之重。今天,咱们就从一道超经典的面试题 ------ 实现 add 函数讲起,看看它背后藏着哪些必须掌握的核心知识,帮你在面试中脱颖而出。

大厂面试题

HR:你说说怎么实现一个两数之和函数?
我:(内心狂喜)这还不简单。上代码!

js 复制代码
function add(a,b){
    return a+b;
}
console.log(add(1,2));

HR:如果我传入的 a='1',b=2 怎么办?

回家吧好不好?回家吧孩子。
我:嗷嗷我知道了。上代码!

js 复制代码
function add(a,b){
    // 参数的校验
    if(typeof a !== 'number' || typeof b !== 'number'){
        throw new TypeError('a 和 b 必须是数字')
    }
    return a+b;
}

HR:.....回家吧好不好?回家吧孩子。

究竟是哪里还漏了呢??我们来看看数据类型有哪些...

数据类型大揭秘​

在实现 add 函数的过程中,我们用到了数字类型,这就不得不提到 JavaScript 丰富的数据类型了。JavaScript 中有 7 种基本数据类型,分别是:​

一、简单数据类型(primitive)
  1. String(字符串):用于表示文本,比如 'Hello, World!'。
  1. Boolean(布尔值):只有 true 和 false 两个值,常用于逻辑判断。
  1. Undefined(未定义):当一个变量声明了但没有赋值时,它的值就是 undefined。
  1. Null(空值) :表示一个空对象指针,常用来初始化对象。
  1. Symbol(唯一值) :ES6 新增的一种数据类型,用于创建唯一且不可变的值,常被用作对象属性的键,避免命名冲突。
  1. Numeric(数值) :又分为 bigintnumber。number 用于表示常规数字,bigint 则专门用来处理大整数,避免了 number 类型在处理大数字时的精度问题。
二、复杂数据类型(non-primitive)

除了这些基本数据类型,其他都是object,像数组、对象、函数等都属于 object 类型。

我:看完这个还是困惑,那上面写的也没错啊....

这时候我们就要提到一个令人迷惑的东西...

令人迷惑的 NaN

在 Numeric 类型里,有个特殊的值叫 NaN ,代表 "Not a Number ",翻译过来也就是不是数字的数字。它的出现往往是因为运算错误或数据类型不匹配。比如:

js 复制代码
console.log(Number('abc')); // NaN​
console.log(5 / '0'); // NaN
console.log(0 / 0);//NaN
console.log(Number(undefined));// NaN
console.log(parseInt("a123"));// NaN
console.log(Math.sqrt(-1));//NaN

但是它又属于数值类型:

js 复制代码
console.log(typeof NaN);//number

相当于:在所有数值类型里面出现了一个不是数字的NaN。

NaN有个特点:NaN 不等于任何值,包括它自己。 因为不是数字的方式有非常多种。

js 复制代码
console.log(NaN===NaN);// false

判断一个值是否为 NaN,不能直接用 ===,而得使用 isNaN() 函数。

js 复制代码
console.log(isNaN(NaN),isNaN(0/0));// true  true  isNaN() 函数用于检查一个值是否为 NaN

我:啊这下我知道了!

js 复制代码
/**
 * @func 两数之和
 * @param {number} a 
 * @param {number} b 
 * @returns {number} 
 */
function add(a,b){
    // 参数的校验
    if(typeof a !== 'number' || typeof b !== 'number' || isNaN(a) || isNaN(b)){
        throw new TypeError('a 和 b 必须是数字')
    }
    return a+b;
}

HR:上岸!

补充知识点:神秘的 Symbol​

前面提到 Symbol 是 ES6 新增的独特数据类型,那它到底独特在哪呢?每个 Symbol 值都是独一无二的,即使描述相同,它们也不相等。

js 复制代码
// 独一无二的值
const sym=Symbol();
const sym1=Symbol();
console.log(sym===sym1);//false

作用 :Symbol 常被用作对象的属性键 ,让属性变得独一无二,有效防止属性名冲突

js 复制代码
const myObject = {};​
const uniqueKey = Symbol('unique');​
myObject[uniqueKey] = 'This is a unique value';

而且,通过 Object.keys() 无法获取到 Symbol 类型的属性,只能使用 Object.getOwnPropertySymbols() 来访问,这在一定程度上实现了属性的 "私有"。

总结​

一道小小的 add 函数面试题,背后竟藏着这么多 JavaScript 的核心知识,从函数实现到数据类型,再到 Symbol 和 NaN 这些特殊值。掌握好这些,不仅能轻松应对面试,在实际开发中也能游刃有余。小伙伴们,赶紧学起来,为面试和工作储备能量💪

相关推荐
京东零售技术20 分钟前
在京东 探索技术的无限可能
面试
杂雾无尘27 分钟前
用 Trae 打造全栈项目魔法师 - 让项目初始化不再是噩梦
aigc·openai·ai编程
棉花糖超人29 分钟前
【从0-1的HTML】第2篇:HTML标签
前端·html
exploration-earth37 分钟前
本地优先的状态管理与工具选型策略
开发语言·前端·javascript
量子位1 小时前
Figure 机器人分拣快递新视频曝光,网友:太像人类
llm·ai编程
OpenTiny社区1 小时前
开源之夏报名倒计时3天!还有9个前端任务有余位,快来申请吧~
前端·github
量子位1 小时前
Gemini 新版蝉联竞技场榜一,但刚发布就被越狱了
ai编程
ak啊1 小时前
WebGL魔法:从立方体到逼真阴影的奇妙之旅
前端·webgl
hang_bro1 小时前
使用js方法实现阻止按钮的默认点击事件&触发默认事件
前端·react.js·html
用户90738703648641 小时前
pnpm是如何解决幻影依赖的?
前端