JS中的数据类型
数据类型
基础数据类型:number,string,boolean,null,undefind
引用数据类型:function,Object,Arrary
null和undefind的区别
null
null表示准备用来保存对象,还没有真正保存对象的值。从逻辑角度上看null表示一个空对象指针。null是一个对象(空对象,没有属性和方法)
typeof null //Object
null的典型用法:
- 作为函数的参数,表示该函数的参数不是对象
- 作为对象原型链的终点
undefined
undefined:表示一个不存在的值。undefined是一个表示“无”的原始值或事表示“缺少值”,就是说这里应该有一个值,但是还没有定义,就尝试获取这个值的时候就会返回undefined。
typeof undefined //undefined
JS中会返回undefined值的情况:
- 变量被声明了,但是没有赋值,就等于undefined;
let a
console.log(a) //undefined
- 调用函数时,应提供的参数没有提供,则该参数为undefined;
function fn(a){
console.log(a) //undefined
}
fn()
- 对象没有赋值的属性,该属性的值为undefined;
let obj = {}
console.log(obj.name) //undefined
- 函数没有返回值时,默认返回undefined
//如果未设定返回值默认返回undefined
function fn(){}
let re = fn()
console.log(re) //undefined
//设置了return,但没有显式的返回任何内容,返回值为undefined
function fun(){
return
}
let re2 = fun()
console.log(re2) //undefined
- 当将一个变量赋值为undefined时,返回undefined
let a = undefined
console.log(a) //undefined
注:任何时候都不建议显示的设置一个变量的值为underfed,但如果用于存储对象的变量还没有真正的存储变量,应该将该值设置为null。但是实际上undefined是由null值派生的,在两者的相等性测试中返回true。
简单数据类型
number类型
number为数字类型,在JS中我们还可以通过Number 这个内置的构造函数来创建数字类型的值。推荐使用字面量创建。
<script>
// 使用构造函数创建数值
let x = new Number('10');
let y = new Number(5);
// 字面量创建数值
let z = 20;
// 检测是否属于同一个构造函数
console.log(x.constructor === z.constructor);//true
</script>
数字类型的常用方法:
- toFixed:用于保留几位有效数字
- parseInt:用于转化为数字类型并取整数
- parseFloat:用于转化为数字类型并取浮点数
string类型
string为字符串类型,在JS中我们还可以通过String这个内置的构造函数去创建字符串类型的值。推荐使用字面量创建
<script>
//1.字面量创建
let str1 = '张一一'
//2.构造函数创建
//任何一个字符串都相当于new一个构造函数得到的实例对象
/*
字符串对象具有的属性:
1. length:用来获取字符串的属性
2. 索引值:例:str[0]可以获取第一个字符
*/
let str2 = new String('张一一')
</script>
字符串类型常用的方法:
-
split:分割字符串成为数组,加入''可以将每一个字符转化为数组的值
-
toLocaleLowerCase:把字母转换为小写
-
toUpperCase:把字母转换为大写
-
indexOf:首次出现的字符的索引值,找到了会返回首次出现的索引值,找不到就返回-1
-
lastIndexOf:尾次出现的字符的索引值,找到了会返回尾次出现的索引值,找不到就返回-1
-
trim:用于去除字符串两端的空白
-
substr:截取字符串,表示从哪里开始截截几个
语法:字符串.substr(start,length)
注:如果只有一个参数,会从起始位置截取到最后
-
substring:截取字符串,开始位置上的字符可以取到但是结束位置上的字符取不到
语法:字符串.substring(起始索引值,结束索引值)
注:如果只有一个参数,会从起始位置截取到最后
boolean类型
boolean类型有两个值:true,false。在JS中我们可以通过Boolean创建布尔值。推荐使用字面量方式创建。
JS中默认为false的值:undefind,null,''空字符串,数字0,数字NaN,false
<script>
// 使用构造函数创建布尔类型
let locked = new Boolean('10');
// 字面量创建布尔类型
let flag = true;
// 检测是否属于同一个构造函数
console.log(locked.constructor === flag.constructor);//true
</script>
引用数据类型
Object类型
object数据类型(对象),可以通过object这个内置的构造函数创建用来创建一个普通对象。更推荐字面量形式创建。
<script>
// 通过构造函数创建普通对象
let user = new Object({name: '小明', age: 15});
// 对象语法简写
let name = '小红';
//字面量形式创建
let people = {
// 相当于 name: name
name,
// 相当于 walk: function () {}
walk () {
console.log('人都要走路...');
}
}
</script>
普通对象在内存中的存储方式:普通对象数据保存在堆内存之中,栈内存中保存了普通对象在堆内存的地址。如图所示:
因为栈内存放的是堆内存的地址,所以普通对象赋值后是将地址赋值给另一个对象。因此无论修改哪个变量另一个对象的数据值也会相当发生改变。如图所示:
Object的方法:
-
Object.assign静态方法创建新的对象 -
Object.keys静态方法获取对象中所有属性 -
Object.values表态方法获取对象中所有属性值
Array类型
arrary类型(数组),可以通过Array这个内置的构造函数创建用来创建一个数组。更推荐字面量形式创建。
<script>
// 构造函数创建数组
let arr = new Array(5, 7, 8);
// 字面量方式创建数组
let list = ['html', 'css', 'javascript'];
</script>
数组在内存中的存储方式与普通对象一样,如下图所示:
数组在赋值时只是复制了栈内中的地址,而非堆内存中的数据,因此数组赋值后,无论修改哪个变量另一个对象的数据值也会相当发生改变。如下图所示:
Array的方法:
Array方法:
-
pop删除数组的最后一项,并返回 -
push往数组最后的位置追加元素,并返回新数组的长度 -
splice删除或者替换。语法:数组.splice(删除元素的下标,删除个数,将删除元素替换为第三个参数所写的值) 会将删除元素放入新数组并返回 -
shift删除数组的第一项并返回删除元素 -
unshift往数组最前面追加,并返回新数组的长度 -
实例方法
concat合并两个数组,生成新数组 -
实例方法
reverse反转数组 -
实例方法
join数组单元素拼接成了字符串。数组.join()等括号内为每个值两两之间拼接的内容默认为, -
实例方法
indexOf查找在数组中首次出现的索引位置,找到了就返回首次找到的下标,没找到则返回-1 -
实例方法
lastIndexOf查找在数组中尾次出现的索引位置,找不到就是-1 -
静态方法
from伪数组转成数组。注意:要想把伪数组转成真数组,必须有length属性 -
静态方法
isArray判断a是否是数组 -
find用于查找首次满足条件的值,并返回值,未找到就返回undefind -
findIndex用于查找首次满足条件的值,并返回索引值,未找到返回-1 -
some在遍历时查找是否满足条件的值一旦找到立刻停止,有返回true,没有返回false -
every用于查找元素满足条件,都满足返回true,否则返回false -
filter用于筛选满足条件的元素,会把所有满足条件的元素放到新数组当中并返回 -
map用于遍历数组的每个元素执行一边回调函数,会把执行玩的函数放到新数组中返回 -
实例方法
forEach用于遍历数组,替代for循环(🌟)<script> let arr = ["张飞", "赵云", "关羽", "马超", "黄忠", "貂蝉"]; //forEach循环,用于遍历数组 arr.forEach((item, index, x) => { //第一个参数代表数组的每一项,当前元素 console.log(item); //第二个参数代表数组每个元素的下标,当前项的索引值 console.log(index); //第三个参数代表当前数组的本身 console.log(x); }); </script> -
sort用于排序正序排序:arr.sort((a,b)=>{return a-b})
倒序排列:arr.sort((a,b)=>{return b-a})