基本数据类型
- 字符串 string
- 数字 number
- 布尔 boolean
- null
- undefined
引用数据类型
- 对象 object、Array、RegExp等
- 函数 function
基本数据类型和引用数据类型的区别
基本数据类型把值直接给变量,接下来操作中直接拿值操作,可能两个变量存同样的值,但是互不影响 ----------->栈内存
引用数据类型
1.定义一个变量
2.开辟一个新的空间,然后把属性名和属性值保存在这个空间中,并且有一个内存地址。
3.把空间地址给这个变量,变量没有存储这个数值,而是存储的这个空间的地址
4.把这个地址告诉另外一个变量,这个变量也用这个地址,两个变量都操作这个地址
5.其中一个变量改变这个空间的内容,另一个也会跟着改变
数据类型的检测
基本数据类型
以下的数据类型dataType首字母大写
* 1.typeof data 用来检测数据类型的运算符
* 局限性:type null = ‘object’;
* 只会返回 'number' 'string' 'boolean' 'undefined' 'function' 'object'
* 不能具体细分对象中的类
* 2.data instanceof dataType 检测一个实例是否是属于某一个类
* 不能检测字面量创建的基本数据类型的值
* instanceof特性
* 只要当前的实例在原型链上 我们用其检验的结果都是true
* 在类的原型继承中我们检验的结果未必准确
* 3.data.constructor==dataType 基于构造函数
* 作用和instanceof类似
* [].constructor Array
* constructor可以处理基本数据类型
* constructor检测Object和instance不一样,一般情况下是检测不了的,原型链上有,不会再向上级查找
* 局限性
* 把原型进行重写很可能把之前的constructor覆盖了,这样检测的结果是不准确的
* 对于特殊的数据类型 null和undefined,他们的所属类是 null和Undefined,但是浏览器把这两个类保护起来了,不允许我们访问使用
* 4.Object.prototype.toString.call(); 返回 [object datatype]
* 最准确的方式
* 首先获取Object原型上toString上的方法,方法执行并且改变方法中this关键字指向
1. number
* number{正数,负数,0,小数 NaN :不是一个有效数字}
* NaN==NaN false
* isNaN:检测一个值是不是一个有效数字 如果检测的不是Number类型的 会默认把他转化为number类型的再判断
* Number() 强制将其他数据类型转化为Number类型的,如果是字符串 只有字符串都是数字才可以转
* 非强制数据类型转换
* parseInt() 从左到右 一个一个字符查找 中途遇非有效数字停止查找 返回整数
* 还可以解析进制的数字
* parseFloat() 从左到右 一个一个查找 但是能够 返回浮点数
* 保留几位小数 数字.toFixd(n) 保留n位有效数字 四舍五入
console.log(isNaN(12)) //---FALSE
console.log(isNaN('12')) //---FALSE 转化为number类型的再去判断
console.log(Number([0])) //0
console.log(Number("1")) //1
console.log(parseInt('12px')) //12
console.log(parseInt('1px2')) //1
parseInt("10"); //返回 10
parseInt("19",10); //返回 19 (10+9)
parseInt("11",2); //返回 3 (2+1)
parseInt("17",8); //返回 15 (8+7)
parseInt("1f",16); //返回 31 (16+15)
12.555.toFixed(2) //返回12.55
API
1. Number()
2. isNaN() 先隐式转化 调用底层的valueof() 再判断
3. parseInt() 先隐式转化 调用底层的valueof() 再判断
4. parseFloat() 先隐式转化 调用底层的valueof() 再判断
2. string
API
* 1.通过索引查找对应的字符或编码
* chatAt(下标) :通过下标找对应的字符
* chatCodeAt(下标) 通过下标找ascii值
* 2.通过字符找对应下标(只能找一个)
* indexOf('str') 通过字符串找对应下标 (从前到后)
* lastIndexOf('str') 从后往前
* 3.字符串截取
* str.substr(n,m) 从n开始截取m个
* str.substring(n,m) 从第n个索引开始截取到第m个
* 4.字符串拆分成数组
* str.split(“ ”)按指定的符号拆分成数组
* 5.字符串替换
* str.replace('被替换的','换成的');
* 6.大小写转换
* str.toUpperCase() //转换成大写
* str.toLowerCase() //转换成小写
* 7.match 匹配符合正则的字符串
3. boolean
值:true false
* ! 一个感叹号取反,首先将值转化为布尔类型后取反
* 数据类型转换规则
* 1.如果只有一个值,判断这个值真假 只有0 NaN null undefined “” 这5个是假的,其余都是真的
* !! 两个感叹号相当于 Boolean() 将其他类型转换为布尔类型
* 2.判断两个值是否相等
* <1> ==的 比较会进行默认的数据类型转化
* <2> 对象==对象 永远的不相等 因为比较的是引用地址
* <3> 对象==字符串 对象转化为字符串再进行比较 []=="" true {}转化为字符串调用toString 为"[object Object]"
* <4> 对象==布尔类型 对象转字符串 (toString) 再转化为数字(Number) boolean也转化为数字类型 再进行比较 []==false true
* <5> 数字==布尔 布尔转数字
* <6> 数字==字符串 字符串转数字
* <7> 字符串==布尔 布尔 转数字 字符串转数字
* null==undefined 结果为true
* null或undefined和任何其他数据类型比较都不相等
* ===比较 数据类型不一样的不相等
*
4. null和undefined
- undefined:表示未定义
- null:表示空,没有
- 出现undefined的情况:
1. 变量定义没赋值
2. 函数没有返回值
3. 对象没有当前属性
- undefined的二义性
undefined在function作用域下是可以重写的,但是在window作用域(全局变量时)下,无法被重写。
(function(){
undefined='123';
console.log(undefined) -->'123'
})
- null的作用
1. 习惯上初始化会用null
2. 清理对象属性可以用null
3. type null 是 'object' 这是硬性规定
引用数据类型
1.对象
* 有属性名和属性值组成(多组键值对组成)多个key 和 value
* 属性名:属性值 描述对象特征
* 字面量方式创建
* var obj={name:'haha'}
* 实例方式创建
* var obj= new Object()
* 1.给对象增加属性名和属性值 obj.age=10
* 2.修改原有属性名和属性值 obj.name='woca';
* 规定一个对象的属性名不能重复
* 3.获取属性名和属性值 console.log(obj.name)
* 如果属性名不存在,返回undefined
* 4.删除属性名和属性值 obj.name=null 假删除
* delete obj.name 真删除
2.数组
* length-- 相当于删除数组的最后一项
* 数组常用的方法
* 方法 作用 参数 返回值 原数组
* push() 向数组的末尾添加一项 需要添加的项用,隔开 返回新数组的长度 原数组改变
* pop() 删除数组的最后一项 返回删除项 原数组改变
* unshift 向数组开头添加一项 添加的项 返回数组长度 原数组改变
* shift 删除数组的第一项 返回删除项 原数组改变
* splice(n,m,x) 从索引你开始删除m个 n是索引m是个数x是添加的值 返回删除项 原数组改变
* 一个参数的时候是从索引n开始删除到结尾
* 两个参数时是从索引n开始删除m个
* 三个参数时从索引n开始删除m个 并且把第三个参数当做数组放到删除的位置
* slice(n,m) 从索引n开始找到索引M 不包括M 索引的开头和结尾 查询的数组项 原数组不变
* concat() 拼接数组 要被拼接的数组 拼接后的数组 原数组不变
* join(' ') 把每一项通过指定的字符串拼接 分割符 拼接好的字符串 原数组不改变
* reverse() 倒叙数组 无 倒叙后的数组 原数组改变
* sort() 按指定的顺序排列数组 一个函数 排序好的数组 改变
* indexOf() 查找 查找的项 找到的数字或-1 不变
* lastIndexOf() 从后查找 查找的项 找到的数字或-1 不变
* forEach(item,index)遍历 一个函数 无返回值 改变
* map() 遍历 一个函数 函数有返回值 不变
* Array.from() 把类数组转化为数组 需要转化的类数组 返回新的数组
* find() 遍历查找
* reduce() 累加器 一个函数参数为数组上一项和当前项
* filter() 过滤器 一个函数 过滤得到的新数组 不变
* includes() 判断是否包含某一项 要查找的东西 布尔值 不变
var arr=[10,11,12,13,14];
var new1=arr.find(function(item,index,arr){
console.log(arguments)
})
var a=arr.includes(14);
console.log(a)
var newArr=arr.filter(function(v) {
return !(v%2); ///偶数
});
console.log(newArr);
3.函数
- 定义一个函数的步骤
* 1.开辟一个新的空间 xxff11
* 2.把函数体中的js代码当做字符串存在空间里(一个函数如果只是定义了没有执行的话 这个函数无任何意义)
* 3.把这个地址给函数名
- 函数执行步骤
* 1.首先会形成一个自己的私有地盘
* 2.把定义的时候 存在空间里的js代码字符串当做js代码执行
*function的一个作用 实现代码的封装
* 形参:
* 实现一个功能发现部分原材料没有,在制定计划时没有办法获取,我们把需要的原材料定义在我们的形参上,
* 在执行计划的时候把原材料提供了就好了
* 多态:
* 通过参数的不同实现不同的功能 执行时没有传递值 默认值是undefined 用typeof undefined检查是否传进来值;
* 没有给形参赋值的时候,他的值就是undefined
* arguments
* 是函数的内置的接收参数的机制 arguments一直存在
* 是一个类数组(有数字作为索引,索引从0开始代表第几个传递进来的参数)
* arguments获取其中的一个只能用arguments[i]l;
* arguments.callee 代表函数本身
- 闭包:
* 函数执行的时候,会产生一个私有的作用域 保护里边的变量不受外界的干扰,外边想用什么就return什么
* 函数执行完的整体就是这个值
- return
* 1.如果没有写或 return; 默认返回的值就是undefined
* 2.在函数体中 return 后面的代码不再执行
* 3.return可以控制代码执行到指定位置结束
4.Math对象
* Math.abs() 绝对值
* Math.ceil() 向上取整
* Math.floor() 向下取整
* Math.round() 四舍五入
* Math.min() 取最小值
* Math.max() 取最大值
* Math.random() 获取从0到1之间的一个随机数
* Math.round(Math.random()*(m-n)+n) 获取n到m的一个随机整数
* num.toFixed(n) 保留n位小数
5.date对象
* new Date() 计算机时间 中国标准时间
* date.getFullYear() 获取年
* date.getMonth() 获取月份 月份需要 +1
* date.getDate() 获取日
* date.getDay() 获取星期 1234560
* date.getHours() 获取小时
* date.getMinutes() 获取分钟
* date.getSeconds() 获取秒
* date.getMilliseconds() 获取毫秒