JavaScript的数据类型有7种,分别是数值(number)、字符串(string)、布尔值(boolean)、对象(object)、undefined、null、symbol(符号)。

一、数值

整数和浮点数

js内部所有数字都是以64位浮点数形式存储,整数也是这样。

一个数在js内部实际的表示形式:第一位(符号位),第2到12位(指数部分,有效数字,从1开始),第13位到第64位(小数部分,)

大于2的53次方的数值,都无法保持精度

JS会将太接近0的结果直接转为0。

数值的表示法

科学计数法:字母e或E的后面,的整数表示这个数值的指数部分。

以下两种情况,自动转为---①小数点前的数字多于21位;②小数点后的零多于5个

数值的进制

十进制:没有前导0;八进制:前缀0o或0O,或只有前导0且只用到0~7的;十六进制:前缀0x或0X;二进制:前缀0b或0B;

特殊数值

正零和负零是等价的。(当分母的时候,返回的值不相等)

NaN(非数字)出现在将字符串解析成数字出错的场景。

NaN不等于任何值,包括自身。

布尔运算中NaN被当作false

NaN与任何数运算都是NaN.

Infinity表示无穷,出现场景:正数值太大,负数值太小,或非0除于0

与数值相关的全局方法

parselnt():将字符串转为整数。

它的返回值只有两种可能,十进制整数或NaN。

还接受进制转换,eg:parseInt('1000',10)第二个参数代表的是多少进制、

parseFloat():将字符串转为浮点数

它会自动过滤字符串前导的空格。

isNaN():判断一个值是否为NaN

只对数值有效,如果传入字符串,会优先转成NaN

判断NaN,利用NaN为唯一不等于自身的值

isFinite():返回一个布尔值,判断该值是否为正常的数值


二、字符串

要单引号字符串的内部,使用单引号,必须在内部的单引号加上反斜杠,用于转义。

字符串默认只能写一行。若要分成多行,则在每一行的尾部使用反斜杠

想输出多行字符串,利用多行注释的变通方法---.toString().split('\n').slice(1,-1).join('\n')

转义

\0:null; \b:后退键;\n:换行符;\r:回车符

\t:制表符;\\:反斜杠;

反斜杠的特殊用法:①\后面紧跟三个八进制数(000到377),只能输出256种字符;②\x后面紧跟两个十六进制数(00到FF),只能输出256种字符;③\u后面跟四个十六进制数(0000到FFFF)

在非特殊字符前面使用反斜杠,则反斜杠会被省略

字符串与数组

它可以视为字符数组,可以使用数组的方括号运算符;

字符串内部的单个字符无法改变和增删,

length属性

返回字符串的长度,无法改变

字符集

JavaScript引擎内部所有字符都有Unicode表示;允许直接在程序种使用Unicode码点代表字符

JS的单位字符长度固定为16位长度,两个字节。

对于码点在U+10000到U+10FFFF之间的字符,长度为32位(4个字节)

Base64转码

一种编码方法,将任意值转成0~9、A~Z、a~z、+和/这64个字符

目的是为了不出现特殊字符,简化程序。

bota():任意值转为Base64编码

atob():Base64编码转为原来的值

以上两个方法不适用于非ASCII码

将非ASCII码转为Base64编码,中间需要插入一个转码环节

return btoa(encodeURICompent(str));
return decodeURICompoent(atob(str));

三、null和undefined

null、undefined都表示“没有”,含义相似

undefined == null 判断出来的布尔值是true

null表示空值

undefined表示未定义

null与undefined的区别:①变量没有赋值---undefined;②有个对象obj,现在不想赋值---null

四、布尔值

true or false

会返回布尔值的运算符:两元逻辑运算符(&&,||),前置逻辑运算符(!),相等运算符(===,!==,==,!=),比较运算符(>,>=,<,<=)

注意:空数组和空对象对应的布尔值都是true。

五、对象(合成类型的值)

分为3个子类:狭义的对象(object)、数组(array)、函数(function)--处理数据的方法

判断一个值是什么类型:typeof运算符、instanceof运算符、Object.prototype.toString方法

typeof运算符 通常用来检查一个没声明的变量,而不报错。实际编程中,用在判断语句。

空数组([])的类型也是object。

instanceof运算符可以区分数组和对象

一组键值对(key-value)的集合,无序的复合数据集合。

对象的所有键名都是字符串,键名又称为“属性”

key如果不加单引号,就必须遵循标识符命名规则

属性的值为函数就称为“方法”

属性的值是一个对象,就是链式引用

属性可以动态创建

对象的引用

两个变量指向同一对象,改变任何一个变量的属性,另一个也可以读写该属性。

V8引擎规定,若行首是大括号,一律解释为对象。

属性的操作

①属性的读取:点运算符和方括号运算符;

使用方括号运算符,需将键名放进引号里;方括号运算符内部还能使用表达式;

数值键名不能使用点运算符。

②属性的赋值

JS允许属性的后绑定

③属性的查看

使用Object.keys方法

④属性的删除

delete命令,删除成功后返回true;删除一个不存在的属性,delete不报错,还会返回true。

delete只能删除对象本身的属性,无法删除继承的属性。

⑤属性是否存在

in运算符,不能识别是对象自身的,还是继承的。

可以用对象的hasOwnProperty方法判断

⑥属性的遍历

for...in循环,遍历的对象是所有可遍历的属性,自动跳过不可遍历的属性;遍历自身和继承的属性。

通常遍历时,都会用hasOwnProperty方法去判断一下是否为自身的属性。