一、数据类型
(一)基本数据类型(也叫值类型):number(数字)、string(字符串)、boolean(布尔)、null(空)、undefined(未定义)
(二)引用数据类型:object(对象数据类型):{}(对象Object)、[](数组Array)、/^$/(正则RegExp)...
function(函数数据类型)
二、检测数据类型的方法
1)typeof // 用来检测数据类型的运算符
语法:typeof value; // typeof 后面的括号不是必须的
typeof (value);
返回值:用typeof检测某个值的数据类型,首先返回的是一个字符串,其次里面包含了对应的数据类型
局限性:(1)用typeof检测object下具体细分的那几个数据类型(对象、数组、正则)返回的结果都是object,所以我们无法使用typeof区分当前的值,具体的是一个数组还是一个正则...
(2)typeof null;检测出来的是object,所以不能用typeof检测是否为null
2)instanceof
3)constructor
4)Object.prototype.toSting.call();
三、类型转换
(一)显示类型转换
1、Number() :可以转换成数字的有:1) var a = '+100'; alert(Number(a)); // 100
// 这里是+100(正一百),转换出来是100,如果是-100(负一百),转换出来的就是-100;
2)var a1 = true; alert(Number(a1)); // 1 转换布尔值,true是1,false是0;
3)var a2 = ''; alert(Number(a2); // 0
// 字符串是从0,1,2,3...开始计算的,因此空字符串转换出来的是0
4)var a3 = []; alert(Number(a3)); // 0 空数组于字符串的计算方法一致,同样是从0开始的
5)var n= null; alert(Number(n); // 0 null是一个空对象指针,为空
不可转换会显示NaN:1)var u; alert(Number(u)); // NaN 变量u只声明,但没有设置初始值
2)var json = {abc:123};
3)var fn = function (){ alert(1); };
2、当Number转换不出数字的时候就显示NaN
NaN (not a number )
1)特性: 1、"不是个 数字 的数字类型",console.log(typeof NaN); --> 注意的是,NaN是number 数据类型
2、一旦程序中出现NaN,肯定进行了非法的运算操作
3、NaN在布尔值里是false
4、NaN == NaN 两个是不相等的,返回的结果是false;
NaN代表的是除了数字以外的任何种可能情况,所以两个NaN之间根本没有可比性;
2)什么情况下会出现NaN
a: 数字 + undefined = NaN —> 12 + undefined = NaN;
b: 在无效的数字运算中,我们可能会出现NaN —> "b" - 12 = NaN;
c: 以下在将其他的数据类型转换为number类型的时候会出现NaN:
1、number是严格转换:只要有一个非数字字符返回的结果都是NaN;
console.log(number('12')); // 12
console.log(number('12px')); // NaN
2、parseIntparseFloat是非严格转换:从左到右依次查找,遇到一个非有效数字就停止查找
1>、parseInt:从左到右一个一个检测。遇到一个非数字的就停止转换,返回上一个可以转换数字的
console.log(parseInt('12px')); // 12
console.log(parseInt('12px13')); // 12
console.log(parseInt('px12')); // NaN
2>、parseFloat只是比parseInt多识别一个小数点
console.log(parseInt('12.5px')); // 12
console.log(parseFloat('12.5px')); // 12.5
注:判断一个值是小数还是整数的代码实例:
var num = 20.45;
if(parseInt(num) === parseFloat(num)){
alert(num + '是整数');
} else {
alert(num + '是小数');
}
3)isNaN(value) 检测value是否为有效的数字,在内部是根据Number来进行转换的,转换之后isNaN才判断,如果Number转出来的是数字,isNaN就是false;反之就是true;
console.log(isNaN('14')) // false // 首先是由Number('14')去进行转换,转出来的是14,既然是数字,那么isNaN('14')转换的结果就是false;
注:判断某些值是不是数字的代码实例:
var str = '';
str = oText.value;
if(isNaN(str)){
alert(str + '不是数字');
} else{
alert(str + '是数字');
}
4)数字常用的一个方法
toFixed —> 保留小数点后面的位数多少位
var num = 3.14157265358972
console.log(num.toFixed(2)); // 3.14 保留小数点后两位 元素.toFixed();
(二)隐式类型转换
+ 200+’3‘ 变成字符串 // 2003
- * / % ++ -- '200'-3 变成数字
>< 要注意是数字的比较还是字符串的比较
! 取反 把右边的数字类型转成布尔值
!! 相当于Boolean();
!= 不等于
= 一个等号是赋值
== 两个等号是判断最终的值。
注:如果左右两边的值的数据类型不一样,浏览器会默认的把他们转换为一样的数据类型在比较。
'10'==10 —> 浏览器首先会把'10'转换为数字10,然后在和右边的值进行比较。 —> true
要注意是数字相比还是字符串相比
=== 三个等号是:全等。先是判断两边的数据类型,数据类型相等才会接着判断值是否相等。
注:如果数据类型不相等,就是false;比两个等号更为严谨
四、布尔类型 boolean :true(真)、false(假)
真假的问题:
真:非零的数字、非空字符串、true、函数、能找到的元素、[]、{}
假、0 、NaN 、 空字符串''、false、 不能找到的元素、null、未定义
1、Boolean(value); 把其他的类型转换为布尔类型
console.log(Boolean(-1)); // true
2、! 把其他的类型先转换为布尔类型,然后在取反
console.log(![]); // false 首先[]变为布尔值是true,然后在取反为false;
3、!! 把其他的类型转换为布尔类型,相当于Boolean();
console.log(!![]); // true
4、 在条件判断中,如果只有一个值,它的意思是把这个值转换为布尔类型,看是真还是假,是真的话条件成立,否则条件不成立
五、 字符串类型 string
在JS中所有用 "" 或者是用 '' 包起来的都是字符串
var str = 'string';
1)console.log(str.length); // 6 获取字符串的长度(里面共有多少个字符)
// 每一个字符都是由零到多个字符组成,每一个字符都有一个自己的位置,第一个字符的位置是0...我们把代表当前是哪个字符的数字称之为“索引”
2)console.log(str[0]); // s 想要获取其中的某一个字符我们使用str[索引]也可以用charAt(索引);
也可以写成:console.log(str.charAt(0)); // charAt 字符串的下标
3)'+'在JS中除了数字相加还有字符串拼接的意思
console.log(1 + 1); // 2
console.log('1' + 1); // 11 在加法运算中如果出现了一个字符串不是数学运算而是字符串拼接
console.log('1' - 1); // 0
console.log('1' * 1); // 1
console.log('1' / 1); // 1
console.log('1px' - 1); // NaN
六、对象数据类型
1、定义:每一个对象数据类型都是由多个属性名和属性值组成的,我们把属性名:属性值称之为“键值对”(key:value)
2、属性:描述一个对象的特征和特点的
3、JS中规定我们的一个对象的属性名是不能够重复的,如果重复了是以最后一个属性值为主,例如:下面的例子中age的值保留的是最后一个19
var obj = {name:effie;age:18,age:19};
4、关于对象的属性名和属性值的“增、删、改、查”
var obj = {};
a:增加:obj.name = 'effie'; // 对象名.属性名 = 属性值
obj['age'] = '18'; // 对象名['属性名'] = 属性值
console.log(obj);
b:修改:obj.age = 19;
c:获取:console.log(obj.age); // 19 注意age的值已经修改了
d:删除:
假删除:只是把属性值变为null,属性名还是存在的
obj['age'] = null;
真删除:把属性名和属性值彻底删除
delete obj['age'];
5、关于object中的一些细节知识点
// 在获取的时候如果属性名在对象中不存在的话,获取的属性值是undefined;
var obj = {};
console.log(obj.name); // undefined
// 一个对象中的属性名可以是纯数字
var obj = {1:100,2:200}; // 1和2都是属性名
console.log(obj['1']); // 对于纯数字的引号不是必须的
console.log(obj.1); // 直接报错,对于纯数字的属性名不能用属性名.属性值
6、对于属性名操作的时候最好要加上引号,如果不加会导致属性名很有可能是变量
var obj = {num:100}; console.log(obj['num']); // 100
var num = 10; console.log(obj[num]); // undefined 把num这个变量存储的值10作为属性名,获取对应的属性值
七、基本数据类型和引用数据类型的本质区别
1、基本数据类型也叫最值类型,因为它是直接的按照值来操作的。例如:
var num = 12;它是直接把12这个值赋值给了num这个变量
2、引入数据类型是按照引用地址来操作的,而不是按照值来操作的。例如:
var obj1 = {age:19};
a:“开空间,分地址”:首先开辟一个新的内存空间,然后浏览器为其分配一个16进制的地址。
b:“存内容”:接下来把对象中的所有的属性名和属性值分别依次存储到对应的空间当中。
c:“赋值”:把新开辟的内存空间的地址xxxfff000,赋值给我们的变量obj1。
八、函数数据类型
函数分为两部分:1、创建一个函数,让它具备某一个功能
2、执行这个函数,让其有自己的价值和作用
注:如果只创建不执行,函数本身没有任何的意义。
1)创建:
function 函数名(){
// 函数体:我们实现这个功能的代码
}。
2)执行:
函数名(); // 执行函数体中的代码,实现对应的功能(可以执行多次)
3)形参:
function sum(num1,num2){ // num1和num2就是函数的两个形参变量,用来存储用户传递进来的值
var total = 0;
total = num1+num2;
console.log(total);
}
// 执行的时候我们需要把num1和num2两个形参变量传递进来,这里传递进来的都是给形参赋的值:
sum(100,200); // 300 // num1 —> 100; num2 —> 200;
sum(1,2); // 3
sum(100); // NaN //num1 —> 100; num2 —> undefined
// 定义了形参,执行的时候没有给传递值的话,默认的形参值是undefined
4)函数的运行原理
function fn(){
var num=15;
num++;
console.log(num);
};
fn();
// 当浏览器加载我们页面的时候,首先会提供一个供全局JS执行的环境 —> 全局作用域
// 而创建一个函数:
1)首先开辟一个新的内存空间,浏览器为其分配一个16进制的地址;
2)把函数体中的JS代码当做“字符串”存储到这个空间中;
3)把内存地址赋值给我们的函数名;
// 执行一个函数:
1)首先开辟一个供函数体中代码执行的环境 —> 私有作用域
2)把创建时候存储的“字符串”变为真正的代码,从上到下执行