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方法去判断一下是否为自身的属性。