最近在重新学习前端,看了课程怕遗忘或者没有真正明白,在这里总结一下~(上图是老师总结的js的结构图,供参考)
这里提到的类型都是运行时类型,关于运行时类型,贴一段老师的话
运行时类型是代码实际执行过程中我们用到的类型。所有的类型数据都会属于 7 个类型之一。从变量、参数、返回值到表达式中间结果,任何 JavaScript 代码运行过程中产生的数据,都具有运行时类型。
先提出几个问题
为什么有的编程规范要求用 void 0 代替 undefined?
字符串有最大长度吗?
0.1 + 0.2 不是等于 0.3 么?为什么 JavaScript 里不是这样的?
ES6 新加入的 Symbol 是个什么东西?
为什么给对象添加的方法能用在基本类型上?
7种语言类型
- Undefined
- Null
- Boolean
- String
- Number
- Symbol(ES6)
- Object
Undefined和Null
Undefined类型表示未定义,只有一个值undefined,任何变量在声明之后赋值之前都只有一个类型Undefined,一个值undefined
那么为什么要用void 0代替undefined呢?因为undefined在js中不属于保留字,因此可以作为变量名,这样undefined就被修改了,而void运算符会使后面的运算结果为undefined,所以可以用void 0代替undefined,防止被修改,还有一个原因,用void 0要比undefined少3个字节,可以通过打印各自长度来验证哦。
不过ES5做了修改,undefined只是全局对象的一个只读(read-only)属性,所以在高版本浏览器中不会出现undefined被重写的情况了,但是用void 0代替undefined也不是完全没必要,很多js压缩工具正是用的void 0代替undefined。
Null类型也有一个值null,它表示“定义了但是为空”,null是js中的关键字。
Boolean
只有两个值true和false,表示逻辑上的真假。
String
String 有最大长度是 2^53 - 1,这个最大长度并不是字符的长度,因为 String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAt、charCodeAt、length 等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。
Number
javaScript 中的 Number 类型有 18437736874454810627(即 2^64-2^53+3) 个值
javascript中的Number类型基本符合IEEE中754-2008中规定的双精度浮点数的规则(根据双精度浮点数的定义,Number类型中整数的有效范围是0x1fffffffffffff 至 0x1fffffffffffff,所以 Number 无法精确表示此范围外的整数),但是JavaScript为了表达几个额外的场景(比如为了不让除以0出错引入无穷大的额概念),规定了几个里外情况:
- NaN:占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
- Infinity:无穷大;
- -Infinity:负无穷大
JS中有+0和-0之分,在除法运算中需要注意区分,看得到的是正无穷大还是负无穷大;
根据浮点数的定义,非整数的Number类型无法用==(===)来比较,如
console.log(0.1+0.2==0.3)//false
这是浮点数运算的精度问题,在计算时需要先转换成二进制再相加,由于一些浮点数在转换成二进制是无穷的,而64位双精度浮点数最大只能支持53位二进制,因此被截断之后再转成十进制就会存在一定误差,但这并不是不可以比较,Number中有一个最小精度值,换句话说就是误差只要比这个最小精度值小就当这个误差不存在,因此可以这样判断:
console.log(Math.abs(0.1+0.2-0.3) <= Number.EPSILON)//true,
Symbol
创建symbol对象
var obj=Symbol("a");
Object
在js的定义中,对象是“属性的集合”,属性分为数据属性和访问器属性,都是key-value解构,key可以是字符串或Symbol类型
js中的几个基本类型,都有一个对应的对象类型
- Number
- Boolean
- String
- Symbol
所以我们需要认识3和new Number(3)是完全不同的值,一个是Number类型,一个是对象类型
console.log(typeof 3)//number
console.log(typeof (new Number(3)))//object
Number,Boolean,String三个构造器是两用的,当跟new搭配时,表示创建一个对象,直接调用时表示强制类型转换
Symbol函数比较特殊,不能使用new调用,但他依然是Symbol对象的构造器
js语言设计上视图模糊基本类型和对象的关系,可以把对象的方法在基本类型上使用,如
console.log("abc".charAt(0)); //a
而在java语言中这是不可以的,而这是因为.提供了装箱操作,可以基于基本类型构造一个临时对象。
最后
回答一下开头的几个问题
为什么有的编程规范要求用 void 0 代替 undefined?
因为1.void 0比undefined少3个字节;2.在低版本浏览器中undefined可以作为变量被修改
字符串有最大长度吗?
有,2^53 - 1
0.1 + 0.2 不是等于 0.3 么?为什么 JavaScript 里不是这样的?
浮点数运算规则导致,可以通过Number的最小精度差判断
ES6 新加入的 Symbol 是个什么东西?
Symbol可以生成一个唯一的值,避免key-value结构中的key重复(老师没有详细讲,自己的理解)
为什么给对象添加的方法能用在基本类型上?
js可以进行自动装箱操作,基于基本类型构建一个临时对象来调用对象方法。
若有错误,欢迎留言~