开篇
最近这个文章很火,列了【合格】前端工程师需要掌握的技能表,看到作者一直不断自省和学习来保持竞争力,同为前端工程师深感惭愧,故写下此文简要回答一下文章里提到的技术问题,技术一般,大家仅仅当做参考就成,文章很长会分多篇来写。
传送门 一名【合格】前端工程师的自检清单
JavaScript基础
变量和类型
-
JavaScript
规定了几种数据类型
7种,根据堆栈储存方式的不同分为简单类型和复杂类型- 简单类型:
string
、number
、boolean
、null
、undefined
、symbol
(ES6新增,表示独一无二的值) - 复杂类型:
object
- 简单类型:
-
JavaScript
对象的底层结构是什么
不甚了解,不敢妄言 -
Symbol
类型在实际开发中的应用,手写Symbol
Symbol
表示一个独一无二的值,如果我们使用了一个他人提供的对象,要为此对象添加方法,那么必须保证属性名不能冲突,使用Symbol
就能很好的保证这一点,Symbol
与任何值都不相等!这个东西了解不深,传送门-ES6标准入门-Symobl -
JavaScript
中的变量具体储存形式
变量的储存方式取决于变量的类型是基本类型还是引用类型- 基本类型:以键值对的方式储存在栈内存中
- 复杂类型:会在堆内存中开辟一块空间,储存这个对象的值,并同时在栈内存中储存变量和指向对象的指针
来源
:《JavaScript高级程序设计》69页
-
基本类型对应的内置对象,以及他们之间的装箱拆箱操作
这个说的是基本包装类型,我也理解不深,直接看《JavaScript高级程序设计》119页 -
理解值类型和引用类型
这个和4一样,值类型就是基本类型,引用类型就是复杂类型 -
null
和undefined
的区别
null
表示空对象指针,将null赋值给变量,就表示该变量指向空对象
undefined
表示未定义,声明一个变量但不初始化,那么它的值就是undefined
null
主要表示一个变量还没有真正保存对象的时候,它的值就应该为null
,这是意料之中的空,而undefined
通常表示意料之外的内容,如未初始化的变量,一般来说我们不应该显式的使用undefined
来源
《JavaScript高级程序设计》24页 -
至少可以说出三种判断
JavaScript
数据类型的方式,以及他们的优缺点,如何准确的判断数组类型typeof
操作符,可以判断基本数据类型,对于引用数据类型全都返回Object
instanceof
操作符,obj instanceof Object
检测Object.prototype
是否存在于参数obj
的原型链上,主要用来判断变量是否是某个构造函数的实例,但是Object
是所有对象的原型,所以在obj instanceof Object
中,无论参数obj
是数组还是函数都会返回true
constructor
是prototype
对象上的属性,指向构造函数。根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor
属性的,同样的这个也只能输出构造函数
如需判断基本数据类型,使用
typeof
,判断引用类型用instanceof
和constructor
,实际上所有引用类型都是对象,只不过构造函数不同罢了,强行判断引用类型,要么只是判断常见的几种引用类型比如数组,函数,Date,正则等等,要么只能输出构造函数准确判断数组类型使用es5提供的方法
Array.isArray(value)
来源
《JavaScript高级程序设计》83页,一整章 -
可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用
隐式转换一般说的是Boolean
的转换- Boolean 场景,变量放在if的判断语句时,如果变量不是布尔值,那么就会发生隐式转换
- String,非空字符串会转换成
true
,空字符串会转换成false
- Number, 非0会转换成
true
,0会转换成false
- Object,任何对象都会转成
true
- String,非空字符串会转换成
当然
Numebr
也会发生隐式转换,不过这个一般用不到,也很简单来源
《JavaScript高级程序设计》26页 - Boolean 场景,变量放在if的判断语句时,如果变量不是布尔值,那么就会发生隐式转换
-
出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法
- 精度丢失原因,说是
JavaScript
使用了IEEE 754
规范,二进制储存十进制的小数时不能完整的表示小数 - 能够表示的最大数字
Number.MAX_VALUE
等于1.7976931348623157e+308
,最大安全数字Number.MAX_SAFE_INTEGER
等于9007199254740991
- 避免精度丢失
- 计算小数时,先乘100或1000,变成整数再运算
- 如果值超出了安全整数,有一个最新提案,
BigInt
大整数,它可以表示任意大小的整数,注意只能表示整数,而不受安全整数的限制
来源
ES6标准入门、《JavaScript高级程序设计》29页 - 精度丢失原因,说是
先写10个吧,太累了,果然,合格不是那么好达到的,加油吧!!!
github,欢迎issue