共计 2267 个字符,预计需要花费 6 分钟才能阅读完成。
最近面试了三个开发,他们都没有说清楚 JS 的基本类型有哪些。而且往往错误的说了一些 C 语言的数据类型,例如 int, float, double 之类的数据类型。
无论什么语言,熟练掌握数据类型都是这门语言最根本的知识点
JS 数据类型分为两类,一类是基本类型,他们有
Number
String
Boolean
Undefined
Null
Symbol
js 的基本类型就这么几个,除此之外,其他的类型都是对象。
Number 类型
在 JS 没有整型,float,或者 double 类型的数值,所有数值统一叫做 Number 类型。
JS 使用 IEEE754 格式表示整数和浮点数,一般来说整数占用了 32 位,而浮点数数占用 64 位。因为浮点数占用的内存空间是整数的两倍,所以 js 会适当的把浮点数转化为整数储存。
4.0 === 4 // true
数值类型都是有大小范围的
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_SAFE_INTEGER // -9007199254740991
浮点数一般都是计算结果不准确的,这不是 JS 的问题,所有语言中都有这个问题。
计算 0.1 + 0.2 === 0.3 这个结果永远是 false。
要比较浮点数是否相等,可以采用 Number.EPSILON, Number.EPSILON 是一个非常小的数值,如果两个浮点数相减小于 Number.EPSILON,则可以为认为是相等。
Math.abs(0.1 + 0.2 – 0.3) < Number.EPSILON // true
Number 类型中有三个比较特殊的兄弟
Infinity 当数值超过 Number 类型的最大值,他就会变成正无穷
-Infinity 当数值类型小于 Number 类型的最小值,就会变成负无穷
NaN NaN 的意思是它不是一个数值,例如某个数值除以 0,一般语言都会报错,但是 js 不会,而是该变量的值会变成 NaN。
数值类型一旦变成这三个兄弟,就无法参与后续的数值运算。
String 类型
从静态语言过来的同学,遇到字符串就会问个问题:请问你能装多少个字符串呢?
字符串傻傻一笑,说:自从我诞生以来,从来就没被装满过!
ECMAScript 2016 (ed. 7) established a maximum length of 2^53 – 1 elements. Previously, no maximum length was specified. In Firefox, strings have a maximum length of 230 – 2 (~1GB). In versions prior to Firefox 65, the maximum length was 228 – 1 (~256MB). –MDN
Boolean
Boolean 值很简单,就 false 和 true 两个值。但是很多人不能完全回答出,哪些值会被转换成 false。
除了下面几个能够被转成 false 的值,其他都是 true。
false
”
NaN
undefined
0, -0, +0
null
undefined 和 null
undefined 表示一个变量被定义了,但是没有被赋值。null 表示这个变量根本没被定义。总之,无论是 undefined 和 null,他们基本上都是不能使用的值。
null 类型有个特别的作用。比如有个对象,有很多属性,这时候你想把这个变量给标记为可以被垃圾回收了,那么就可以把它的值设置为 null。
最熟悉的陌生人: 对象
我曾认为对象在 js 中是最简单的,而实际上,是我太天真。
// 定义一个对象,so easy
var boy = {
name: ‘wangduanduan’
}
var boy = {}
Object.defineProperty(boy, ‘name’, {
writable: false,
value: ‘wdd’
})
boy.name = ‘ddw’ // 设置不会生效,boy.name 的值还是 wdd
对象的数据属性
数据属性
默认值
说明
configurable
true
表示这个属性能否用 delete 删除
enumerable
true
表示这个属性能否通过 for in 循环遍历
writable
true
表示这个属性能否被修改
value
undefined
表示这个属性的数据值
如果调用 Object.defineProperty 没有指定 configurable, enumerable, writable,那么他们的默认值都是 false。
访问器属性
访问器属性就是 get, set 让你可以在读取或者写入值时,做一层拦截。
var man = {
_sex: 1
}
Object.defineProperty(man, ‘sex’, {
set: function (v) {
this._sex = v === ‘ 男 ’ ? 1 : 0
},
get: function () {
return this._sex === 1 ? “ 男 ” : “ 女 ”
}
})
nam.sex // 男
想一想如果把上面的_sex 改成 sex 会有什么问题?
// 这样写会有什么问题
var man = {
sex: 1
}
Object.defineProperty(man, ‘sex’, {
set: function (v) {
this.sex = v === ‘ 男 ’ ? 1 : 0
},
get: function () {
return this.sex === 1 ? “ 男 ” : “ 女 ”
}
})
最后
很多人抱怨说,工作不好找,其实大多数时候都是自己准备不足。
随便网上刷刷几道题,看看几集视频教程,往往不太同意蒙混过关。
虽说前端可能比较简单,但是也绝没有想象的那么简单。