1.数据类型分类
基础数据类型:Number,String,Boolean,Null,Undefined
一些特殊的地方:Number里面的NaN,Null,Undefined
引用数据类型:Object,Array,Function
原始数据类型与引用数据类型:
(1)作比较时,原始数据类型进行值比较,引用数据类型进行地址比较。
(2)调用方法时,原始数据类型值不变,引用数据类型值要变。
(3)原始数据存在于栈内存,引用数据类型存在于堆内存。
(4)原始数据类型赋值时就是值,引用数据类型赋值时赋的是地址。
2.typeof操作符
鉴于 ECMAScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof 就是负责提供这方面信息的操作符。对一个值使用 typeof 操作符会返回下列字符:
typeof (值);
-
"undefined"——这个值是未定义;
-
"boolean"——这个值是布尔值;
-
"string"——这个值是字符串;
-
"number"——这个值是数值;
-
"object"——这个值是对象或 null;null会被识别为object,ECMAScript底层问题。
-
"function"——这个值是函数。
数据类型在底层都是以二进制形式表示的,二进制的前三位为 0 会被 typeof 判定为对象类型,null为全0所以会被误判为"object",
-
000 - 对象,数据是对象的应用
-
1 - 整型,数据是31位带符号整数
-
010 - 双精度类型,数据是双精度数字
-
100 - 字符串,数据是字符串
-
110 - 布尔类型,数据是布尔值
3.Undefined类型
(1)只有一个值undefind。
(2)在哪些情况会输出undefined。
- typeof一个未声明变量。
- 声明变量未提升。(预编译阶段)
- 函数没有返回值。(没有return)
- 稀疏数组取empty([1,2,,,,3,,,4,]取稀疏数组里面的空值)。
- 取属性未声明对象。
- 转入实参数量小于形参数量,剩余形参为undefined。
4.null类型
(1)只有一个值null。
(2)null与undefined的区别:
null==undefined,判断出来是true。但是他们的用途完全不同。
undefined用于给一个初始量一个初始值。
null用于意在保存对象的变量但还没有真正保存对象时。也可以叫做空指针
5.Boolean类型
(1)false和true两个值。(大写是错误的)
(2)转换为boolean类型时:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | ±0和NaN(参见后面章节有关NaN的内容) |
Object | 任何对象 | |
Null | null | |
Undefined | undefine |
(3)取反运算符也能将其他类型转换为boolean类型。
var a = null;
console.log(Boolean(a)); //false
console.log(!!null); //false
6.Number类型
(1)Number转换规则
- 如果是数字值,只是简单的传入和返回。
如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
如果是 null 值,返回 0。
如果是 undefined,返回 NaN。
如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"会变成 1, "123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
如果字符串是空的(不包含任何字符),则将其转换为 0;
如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。
(2)parseInt()和parseFloat()
parseInt(),用于取整,遇到字符串或者小数时,会取出“遇到字符或者小数点”值钱的纯数字。
var num1 = parseInt("1234blue");
var num2 = parseInt("");
var num3 = parseInt("0xA");
var num4 = parseInt(22.5);
var num5 = parseInt("070");
var num6 = parseInt("70");
var num7 = parseInt("0xf");
因为ES5无法将"070"识别成八进制,所以我们将引入第二个数字来表示前面的数作为一个几进制数,转换成10进制进行输出。没有第二个数字时,默认十进制。
var num = parseInt("0xAF", 16); //175,将“0xAF”作为一个16进制数,转换成10进制进行输出。
var num1=parseInt("123",16)//1*16^2+2*16+3
parseFloat(), 可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串则始终会被转换成 0。 如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零) , parseFloat()会返回整数。
(3)+(加)、-(减)、*(乘)、/(除),也会把类型转换成数字。
只有加法在遇见字符串时会变成拼接而不是转换为数字类型。
(4)NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。
特点:
1. 任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN,这个特点在多步计算中有可能导致问题。
2. NaN 与任何值都不相等,包括 NaN 本身。isNaN()函数:
用于判断数值是否是NaN,是NaN返回true 不是就返回false。
如果检测的是非number类型,就会隐式的将这个值转换为Number类型,如果转换成功为数值isNaN()返回false,如果转换不成功就成为NaN isNaN()返回true。
(5)isInfinity(),是否是有穷数,是就返回true,否就返回false。
(6)浮点数的精度问题
产生原因:大致意思是小数转换为二进制数时出现问题(现在的我还不是很懂,建议百度)。
解决:
// 1、转化成整数进行计算
var a = 0.1;
var b = 0.2;
if ((a*10 + b*10)/10 == 0.3){
alert("You got 0.3.");
}// 2、设定保留的小数位,实际开发过程中保留2~3位小数位足够了
(0.1 + 0.2).toFixed(3) //toFixed是Math的方法// 3、转化成整数Math.floor(a)、Math.ceil(a);
// Math:ceil、floor、round、max、min、random、PI
var a = 0.1456*100;
console.log(a);
7.String类型
字符串类型可以用""(双引号),''(单引号),``(反引号,ES6)来表示,反引号可以换行,并且书写方式与前两个不同。
字符串一旦被创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个高寒新值的字符串填充改变量:
var lang = "Java";
lang = lang + "Script";
//加号:+,只要有一个是字符串,则全部作为字符串
1.转换为字符串 (toString)
数值、布尔值、对象和字符串值变量都有 toString()方法。但 null 和 undefined 值没有这个方法,只能调用String()函数。
toString一般情况不需要传参。但是在调用数字的toString()方法时,可以传递一个参数,将他转换成几进制的数输出。
var a = 31;
console.log(a.toString(16));//0x1f
2.转换为数组(split)
将字符串以一个符号进行截断,把每一段都划成数组的一项。
var str = 'I like JavaScript';
var arr = str.split(' ');//转入的是单词之间空格
console.log(arr);//['I', 'like', 'JavaScript']
var str = 'I like JavaScript';
var arr = str.split('i');//传入哪个值哪个值就被当做分隔符
console.log(arr); //['I l', 'ke JavaScr', 'pt']
var str = 'I like JavaScript';
var arr = str.split('');
console.log(arr);
// ['I', ' ', 'l', 'i', 'k', 'e', ' ', 'J', 'a', 'v', 'a', 'S', 'c', 'r', 'i', 'p', 't']
当然,如果你传入不传值,str会被当成一个值传入数组。
var str = 'I like JavaScript';
var arr = str.split();
console.log(arr); //['I like JavaScript']
3.获取字符串长度(length)
var str = 'abcdefg';
console.log(str.length);//7
var str = 'abcdefg';
console.log(str[str.length-1]);//g
第二段代码展示了length的用法,并且使用了一个新方法取出了字符串中的字符。 (取下标)
4.返回某个指定字符串在字符串中首次出现的位置(indexOf)
str.indexOf(str1,start):查子字符串的第一个字符在当前字符串中的索引为止,前提是查找中有完整的子字符串:
str1:必填,要查询的子字符串。
start:可选,从哪个位置开始查询,如果不写,默认从首位开始查询。
返回值:返回第一个字符串守字母出现的下标,如果没有返回-1。
str.lastindexOf(str1,start):与第一个相同,只是位置是反向查询的。
var str = 'abcdefabcdef'; console.log(str.indexOf('f', 1)); //5 //从下标为1的值开始查询 console.log(str.lastIndexOf('f'));//11
如果此时我输入
console.log(str.lastIndexOf('f',6));
那么他的值是多少呢?
5.截取字符串(substring,slice,substr)
substring(start,end) 截取start到end之间的子字符串
start: 必须,开始截取的位置。
end:结束,截取结束位置,如果不传,会一直截取到末尾。
返回值:[x,y)。
--------------------------------------------------------------------------------------------------------------------------
substr(str,length) 从指定位置截取指定长度的字符串
str:必须 开始位置。
如果str为负数,那么会从后开始数到这个位置,再开始截取。
length:可选(option) 指定长度。
--------------------------------------------------------------------------------------------------------------------------
slice(start,end) 截取start到end之间的子字符串
与substring相同,但是能取负值。
截取方向是从左往右。
var str = '1234567890';
console.log(str.substring(5, 9)); //6789
console.log(str.substring(5)); //67890
console.log(str.substring(9, 5)); //6789
console.log(str.substr(-9, 5)); //23456
console.log(str.substr(2, 5)); //34567
console.log(str.slice(2, 5)); //345
console.log(str.slice(-9, 5)); //2345
console.log(str.slice(-9, -2)); //2345678
6.移除空格(trim)
var str = ' ds dd ';
console.log(str);
console.log(str.length);
var str1 = str.trim();
console.log(str1);
console.log(str1.length);
可以看出trim只能移除字符串两边的代码,并不能移除中间的代码。
7.返回指定位置的字符(charAt)
var str = '123456hjk';
console.log(str.charAt(3)); //4
charCodeAt(),这个是返回指定下标的字符的ASCII码值。
var str = '123456hjk';
/* 查找下标值对应的字符 */
console.log(str.charAt(3)); //4
/* 查找下标值对应的字符的ASCII码 */
console.log(str.charCodeAt(3)); //52
将ASCII码值再转成对应的值:
var str = '123456hjk';
/* 查找下标值对应的字符 */
console.log(str.charAt(3)); //4
/* 查找下标值对应的字符的ASCII码 */
console.log(str.charCodeAt(3)); //52
/* 将ASCII码转成对应的字符 */
str1 = String.fromCharCode(str.charCodeAt(3))
console.log(str1); //4
/* toString(x)表示以x进制输出 */
console.log(str.charCodeAt(3).toString(8)); //64
基础数据类型讲完 。
8.Object类型
是一组数据和功能的集合。
1.创建方式:①使用new关键字创建,②直接使用{}创建。访问时,使用点语法(.)来访问
obj.name;
obj.age;
2.包装对象
(1).含义:因为基础数据类型本身是没有方法的,为了能让它使用对象的方法,所以js会将基础数据类型包装成一个对象,再去调用它自身的方法,js后台会默认进行着一操作,在调用完方法后,这个包装对象就会被销毁。
除了null和undefined,每个基础数据类型都有对应的包装对象:
String为字符串基本类型。
Nmber 为数值基本类型。
Boolean 为布尔基本类型。
(2)临时包装对象:当你需要添加一个属性时,他就会产生一个临时包装对象,当这个属性添加完毕后,这个临时包装对象就会被回收掉,添加在临时包装对象上的属性也会被回收掉,所以,如果你再去点这个属性是点不出来的。例如:
var s = "test";//这里会将s包装成一个String对象
s.len = 4; // 会给它设置一个属性
var t = s.len;
console.log(t);