简单数据类型及其转换
简单数据类型
在存储时变量中存储的是值本身,因此叫做值类型
1.Number数字型
NaN (not a number) 也是数字型
NaN 永远 不会等于 NaN (NaN == NaN 执行结果是 false)
JavaScript的规定, NaN表示的是非数字, 但是这个非数字也是不同的
定义
var age = 23; //整数
var f =23.5 ; //小数
var num1 = 010; //八进制
var num3 = 0xa; //16进制
console.log(Number.MAX_VALUE); //数字型的最大值 1.7976931348623157e+308
console.log(Number.MIN_VALUE); //数字型的最小值 5e-324
console.log(Number.MAX_VALUE * 2);//无穷大 Infinity
console.log(-Number.MAX_VALUE * 2);//无穷小 -Infinity
判断是否为非数字类型
isNaN() ---is not a number 非数字返回true ,数字返回false
会先使用Number()方法对括号内容转换数字类型,如果转换后为NaN则返回true,反之则返回false;
var usAge = 21;
console.log(isNaN(usAge)); //false
var username = "lucy";
console.log(isNaN(username)); //true
保留小数位数
Number.toFixed(n) 保留n位小数
返回小数对应的字符串,
如果多为小数,会按四舍五入方式转,精度会有问题。
和其余类型相加
数字
console.log(12+13); //25 结果为数字型
字符
console.log("哈哈"+13) ; //"哈哈13" 结果为字符型
布尔
console.log(true+1); // 2 结果为数字型
undefined
console.log(undefined + 1); //NaN 结果为数字型
null
console.log(null + 3); //3 结果为数字型
2.String字符串型
定义
字符串可以是引号中的任意文本,语法是双引号 " " 和 单引号 ''
var str='hello'; var str1="lili";
单双引号要错开使用
var str3 = "我是 'bob'"; var str4 = '我是"bob"';
字符串转义符
类似于HTML里的特殊符号,字符串也有特殊符号,我们称为转义符
转义符 都是以 \ 开头的
\n 换行符 \ \ 斜杠 \' 单引号 \" 双引号 \t tab缩进 \b 空格,b是blank的意思
如:var str = 'We\'ll never give up.'; // 使用反斜杠转义字符串中的单引号
引引加加
var age=12;
console.log("我的年齡是age岁"); //我的年齡是age岁
// 引引相加
console.log("我的年齡是"+age+"岁"); //我的年齡是12岁
字符串转数组
split('分隔符') join把数组转换为字符串
var str2 = 'red,pink,blue';
console.log(str2.split(','));
var str3 = 'red&pink&blue';
console.log(str3.split('&'));
检测字符串的长度
var str="hello str";
console.log(str.length) ; //9
根据字符返回位置
字符串对象 根据字符返回位置 str.indexOf('要查找的字符',起始的位置号)
var str = '改革春风吹满面,春天来了';
console.log(str.indexOf('春')); //2
console.log(str.indexOf('春', 3));// 8 从索引号是3的位置开始往后查找
console.log(str.indexOf('春', 2)); //2
console.log(str.lastIndexOf('春')); //8
案例:查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
// 核心算法:先查找第一个o出现的位置
// 然后 只要indexOf 返回的结果不为-1 就继续往后查找
// 因为indexOf 只能查找到第一个 所以后面的查找,一定是当前索引加1,从而继续查找
var str1 = 'abcoefoxyozzopp';
var index = str1.indexOf('o');
var total = 0;
while (index !== -1) {
console.log(index); //3,6,9,12
total++;
index = str1.indexOf('o', index + 1);
}
console.log('o出现的次数:' + total); //4
根据位置返回字符
charAt(index) 根据位置返回字符
str[index] 和charAt(index)等效 H5新增 ie8支持
var str = 'andy';
console.log(str.charAt(3)); //y
//遍历所有字符
for (var i = 0; i < str.length; i++) {
console.log(str.charAt(i)); //a n d y
}
charCodeAt(index) 返回指定位置处字符的ASCII码 目的:判断用户按了哪个键
console.log(str.charCodeAt(0));//97 a
案例:判断字符串"abcoefoxyozzopp"中出现次数最多的字符,并统计其次数
//核心算法:利用charAt()遍历这个字符串
//把每个字符都存储给对象,如果对象没有该属性,就为1,如果存在了就+1
//遍历对象,得到最大值和该字符
var str1 = 'abcoefoxyozzopp';
var o = {};
for (var i = 0; i < str1.length; i++) {
var chars = str1.charAt(i);
if (o[chars]) {
o[chars]++;
} else {
o[chars] = 1;
}
}
console.log(o);
//遍历对象
var max = 0;
var ch = '';
for (var k in o) {
//k得到的是属性名
//o[k]得到的是属性值
if (o[k] > max) {
max = o[k];
ch = k;
}
}
console.log('最多的字符是:' + ch + ',次数为:' + max);
字符串拼接
concat('字符串1','字符串2',....)
等效于+,+更常用
var str = 'andy';
console.log(str.concat('red')); //andyred
“+” 只要由字符串和其他类型变量/值相加,最终的结果都是字符串 (隐式转换)
数字
console.log("哈哈"+13) ; //"哈哈13"
console.log("12"+24); //"1224"
字符
console.log("沙漠"+"骆驼"); //"沙漠骆驼"
布尔
console.log("哈哈" + true); //"哈哈true"
undefined
console.log(undefined + "哈哈"); //"undefined哈哈"
null
console.log(null + "哈哈"); //"null哈哈"
截取字符串
都不改变原字符串
substr('截取的起始位置','截取几个字符'); 重点
var str1 = '改革春风吹满地';
console.log(str1.substr(2, 3)); //春风吹
slice(start,end) 从start位置开始,截取到end位置,end取不到(他们两都是索引号)
start<=item<end
console.log(str1.slice(1, 3)); //革春
console.log(str1.slice(-4, -1)); //风吹满
substring(start,end) 基本和slice相同 但是不接受负值
console.log(str1.substring(1, 3)); //革春
console.log(str1.substring(-4, 1)); //输出为空字符串""
替换字符串
替换字符.replace('被替换的字符','替换为的字符')
只会替换第一个字符 不改变原字符串
var str = 'andy and anna';
console.log(str.replace('a', 'b'));//bndy and anna
案例:有一个字符串'abcoefoxyozzopp’要求把里面所有的o替换为*
var str1 = 'abcoefoxyozzopp';
while (str1.indexOf('o') !== -1) {
str1 = str1.replace('o', '*');
}
console.log(str1); //abc*ef*xy*zz*pp
转换大写、小写
toUpperCase()转换大写
var str2 = 'red,pink,blue';
console.log(str2.toUpperCase()); //RED,PINK,BLUE
toLowerCase()转换小写
var str4 = 'AEIOU';
console.log(str4.toLowerCase()); //aeiou
3.Boolean布尔型
定义
布尔类型由两个值: true 和false,true表示真,false表示假
和其余类型相加
参与加法运算时 true=1 false=0
数字
true为1 false为0
console.log(true+1); // 2 结果为数字型
console.log(false+1); //1
字符
console.log(true+"骆驼"); //"true骆驼" 结果为字符型
布尔
true为1 false为0
console.log(true + true); //2 结果为数字型
console.log(true + false); //1
console.log(false + false); //0
undefined
console.log(undefined +true); // NaN 结果为数字型
null
true为1 false为0
null为0
console.log(true + null); //1 1 + 0 结果为数字型
console.log(false + null); //0 0 + 0
4.undefined
定义
一个变量 声明 未赋值 就是undefined 未定义数据类型
值为undefined,数据类型也是undefined
var str;
console.log(str); //undefined
和其余类型相加
数字
console.log(undefined+13) ; //NaN 结果为数字型
字符
console.log(undefined+"骆驼"); //"undefined骆驼" 结果为字符型
布尔
console.log(undefined + true); //NaN 结果为数字型
undefined
console.log(undefined + undefined); //NaN 结果为数字型
null
console.log(null + undefined); //NaN 结果为数字型
5.null
定义
一个声明的变量给null值,里面存的值为空 (学习对象,研究null)
表示一个“空”值,即不存在任何值,什么都没有,用来定义空对象指针。
Null 其实使用属于 Object(对象)的一个特殊值。因此通过将变量赋值为 Null 我们可以创建一个空的对象。
如果有个变量我们以后打算存储为对象,暂时没想好放啥,这个时候就给null
var space=null;
console.log(space); //null
和其余类型相加
参与加法运算时 null=0
数字
console.log(null+13) ; //13 结果为数字型
字符
console.log(null+"骆驼"); //"null骆驼" 结果为字符型
布尔
console.log(null + true); //1 结果为数字型
undefined
console.log(null + undefined); //NaN 结果为数字型
null
console.log(null + null); //0 结果为数字型
6.symbol
(ES6新类型-暂不关注)
复杂数据类型
在存储时变量中存储的仅仅是地址(引用)
Array Function Object .....
对象、复杂数据类型 才有 属性和方法
--- 简单数据类型为什么会有length属性?
基本包装类型: 就是把简单数据类型 包装成了 复杂数据类型
//基本包装类型 String Number Boolean
var str = 'pink';
console.log(str.length);
// (1)把简单数据类型包装成复杂数据类型 这样基本数据类型就有了属性和方法
var temp = new String('pink');
// (2)把临时变量的值给str
str = temp;
// (3)销毁这个临时变量
temp = null;
console.log(car1 === car2) // 引用数据类型是比较的内存地址,相同内存地址为true,不相同为false
引用数据类型中拷贝内存地址的方式叫浅拷贝
数据的深拷贝,创建一个新的内存地址拷贝数据
字符串不可变
------指的是里面的值不可变,虽然看上去改变了内容 但其实是地址变了 内存中新开辟了一个内存空间
var str = 'andy';
console.log(str);
str = 'red';//重新给str赋值时 常量'andy'不会被修改,依然在内存中
console.log(str);
//因为我们字符串的不可变所以 不要 大量拼接字符串
//字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
获取类型
获取变量的数据类型 typeof 最终返回的是一个字符串
console.log(typeof (13)); //number
console.log(typeof ('hello')); //string
console.log(typeof (true)); //boolean
console.log(typeof (undefined)); //undefined
console.log(typeof (null)); //object
类型转换
使用表单,prompt获取过来的数据默认都是字符串类型,不能进行简单的加法运算,需要进行数据类型转换
var s = prompt("请输入一个数字"); //点确定 s的值为输入的值 点取消 s的值为null
console.log(typeof s) // string 或者 null
转字符型
变量.toString
var num = 10;
console.log(num.toString()); //"10"
var flag = true;
console.log(flag.toString()); //"true"
// undefined.toString() 和 null.toString()报错
String强转
console.log(String(11)); //"11"
console.log(String(true)); //"true"
console.log(String(null)); //"null"
console.log(String(undefined)); //undefined
隐式转换
字符串和任何类型相加都是字符串
console.log("!23"+12); //"!12312"
console.log("!23"+true); //"!123true"
.......
转数字型
parseInt转整型
console.log(parseInt(s));
// "12" ---12 "12px"---12 "rem23px"-- NaN "2w2" ----2 "12.444"---12
// "3.14" ---3 "3.96" ---3
// s 为布尔、undefined、null 时 结果都为 NaN
parseFloat转浮点型
console.log(parseFloat(s));
// "123" ---123 "123sss"---123 "ss23"-- NaN "2w2" ----2 "12.444"---12.444
// s 为布尔、undefined、null 时 结果都为 NaN
Number强转
console.log(Number(s));
//"123" ---123 "123sss"---NaN "ss23"-- NaN "2w2" ----NaN "12.444"---12.444
console.log(Number(true)); //1
console.log(Number(false)); //0
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
(- * /)隐式转换
console.log("23"-12) ; //11
console.log("23"*12) ; //276
console.log("23"/12) ; //1.9166666666666667
console.log("2ss" - 11); //NaN
console.log(true - 11); //-10
console.log(false - 11); //-11
console.log(null - 11); //-11
console.log(undefined - 11); //NaN
转布尔型
undfined, null , 0 , '' , NaN 都是false
0为false 1为true
其余 有值为 true 空值为false
console.log(Boolean(null)) //false
console.log(Boolean(undefined)) //false
console.log(Boolean(NaN)) //false
console.log(Boolean("123")) //true
console.log(Boolean(123)) //true
console.log(Boolean("")) //false
console.log(Boolean(0)) //false
console.log(Boolean(1)) //true
console.log(Boolean({})) //true