一 JavaScript定义了几种数据类型
基本数据类型有
number
string
boolean
null
undefined
引用数据类型有
array
(数组)
function
(函数)
object
(对象)
原始数据类型
boolean
null
undefined
number
sting
symbol
(es6)
复杂数据类型
object
基本数据类型
存放在栈内存中,它们是按值存放的
引用数据类型(复杂)
存放在堆内存当中,它们是按引用地址存放的
变量赋值或函数传参时
数据传递的方式会有不同,基本类型是复制一份值进行传递,引用类型则是传递了内存地址。
二 typeof 可以判断哪些类型?
typeof
操作符唯一的目的就是检查数据类型
类型 | typeof 结果 | |
---|---|---|
基本类型 | undefined | “undefined” |
Boolean | “boolean” | |
Number | “number” | |
String | “string” | |
BigInt (ECMAScript 2020 新增) | “bigint” | |
Symbol | “symbol” | |
null | “object” | |
引用类型 | Object(Object、Array、Map、Set等) | “object” |
Function | “function” |
所以,但我们使用 typeof
来判断引用类型变量时,无论是什么类型的变量,它都会返回 Object
。
为此,引入了instanceof
。
instanceof
instanceof
与 typeof
相比,instanceof
方法要求开发者明确的确认对象为某特定类型。即 instanceof
用于判断引用类型属于哪个构造函数的方法。
var arr = []
arr instanceof Array // true
typeof arr // "object"
// typeof 是无法判断类型是否为数组的
三 NaN
是什么?有什么特别之处?
在JavaScript中,NaN代表的不是一个具体的数值。在进行不正当的运算之后,得到的结果,如图所示。是因为在不能正确的执行而出现了这样一个结果.
let a='helloworld';
console.log(a*3)//NaM
像这种,并不能得到数值的情况,就会出现结果NaN
因为NaN不代表任何数据,也就是说,它不等于任何值,当然也包括,不等于自己。
console.log(NaN==NaN);//false
但是它是属于Number类型。
console.log(typeof(NaN))//number
四 为什么 console.log(0.2+0.1==0.3)
输出 false
?
我们在js中进行如下运算时
console.log(0.1+0.2) // 结果0.30000000000000004 而不是0.3
可以看到0.1 + 0.2 != 0.3
在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3 这个现象。 当然,也并非所有的近似值相加都得不到正确的结果。
解决问题
由于小数的运算可能导致精度丢失问题,那么要解决这个问题,可以将其转换为整数后再进行运算,运算后再转换为对应的小数,例如:
var a = 0.1, b = 0.2
var result = (a * 100 + b * 100) / 100
console.log(result) // 0.3
console.log(result === 0.3) // true
五 break 和continue 的区别
1、break:终止,跳出,结束循环(可以作用在任何地方)。常与switch分支结构合用。
2、continue:结束本次的循环,进入下一次的循环(只能运用到循环结构中)。
六 Math
对象 Date对象 Arrer对象 String 对象
math
对象
// Math.abs()返回绝对值
console.log(Math.abs(-0.1));//10
// Math.floor()向下取整
console.log(Math.floor(2.5));//2
console.log(Math.floor(2.9));//2
console.log(Math.floor(-2.9));//-3
console.log(Math.floor(-2.5));//-3
console.log(Math.floor(-2.2));//-3
//Math.ceil() 向上取整
console.log(Math.ceil(1.1));//2
console.log(Math.ceil(1.9));//2
console.log(Math.ceil(-1.9));//-1
console.log(Math.ceil(-1.5));//-1
console.log(Math.ceil(-2.5));//-2
//Math.round()四舍五入
console.log(Math.round(1.4));//1
console.log(Math.round(1.5));//2
console.log(Math.round(-1.4));//-1
console.log(Math.round(-1.5));//-1
console.log(Math.round(-1.6));//-2
//Math.random()生成0.0-1.0(但不包含随机数里面的最大整数值以上)的随机小数 [0.1)
console.log(Math.random());
console.log(Math.random() + 5);//生成了一个 Math.random(5.n,6){5.n-6(但不包含6)的随机小 数} Math.random(0.n,1)=Math.random(0.n+5,1+5)==Math.random(5.n,6)
console.log(Math.random() * 5);// 相当于 Math.random(0,1)*5=Math.random(0,5)随机0-5(但不包含5)的包含小数的一个数字
console.log(Math.floor(Math.random() * 5));//生成一个随机0-4的整数
console.log(Math.floor(Math.random() * 5) + 5);//Math.random(0,1)*5就是Math.random(0*5,1*5)==Math.random(0,5) 然后Math.random(0+5,5+5)==Math.random(5,10) 取5到9的随机整数
console.log(Math.random() - 5);//-5.n -4.n
//Math.max() 最大值
console.log(Math.max(5, 4, 3));//5
//Math.min()最小值
console.log(Math.min(1, 3, 4,));//1
// Math.pow() 返回级的几次幂
console.log(Math.pow(2, 3));//8
// Math.sqrt() 对一个数进行开方运算
console.log(Math.sqrt(11));//2
Date
对象
*//date 对象的创建*
var date1 = new Date();*//获取当前时间*
console.log(date1);*//Fri Sep 10 2021 17:15:25 GMT+0800 (中国标准时间)*
*//给 dater2 传一个表示时间的字符串*
var dater2 = new Date('2018/09/06 09:00:00');*//Thu Sep 06 2018 09:00:00 GMT+0800 (中国标准时间)
*//getfullYear() 获取年*
console.log(date1.getFullYear());
*//getMonth() 获取月 获取月的时候,系统默认是11个月,所以我们+1就行*
console.log(date1.getMonth() + 1);
*//getDay() 获取星期*
console.log(date1.getDay());
*//getDate() 获取日1-31*
console.log(date1.getDate());
*//getHours() 获取小时*
console.log(date1.getHours());
*//getMinutes() 获取分钟*
console.log(date1.getMinutes());
*//getSeconds() 获取秒*
console.log(date1.getSeconds());
*//getMilliseconds() 获取毫秒 (1秒=1000毫秒)*
console.log(date1.getMilliseconds());
*//二 获取时间戳*
*// 时间戳 就是 从1970年1月1日 0时0分0秒 到当前所华为的 毫秒数*
console.log(date1.getTime());
Array
对象
var arr = [1, 2, 3, 4, 5, 6, 7]
*//push 在末端添加一个元素。*
arr.push(1)
console.log(arr);
//unshift 在首端添加一个元素。*
arr.unshift('z');
console.log(arr);
*// shift 删除数组首端的一个元素。*
arr.shift()
console.log(arr);
*// pop 从末端删除一个元素。*
arr.pop()
console.log(arr);
*// splice 删除数组某一位置的元素。(从第几个索引开始,删除几个索引)*
arr.splice(0, 1)
*//!!替换/插队*
var zzy = [1, 2, 3, 4]
*// 语法 zzy.splice(从第几个索引,删除几个,添加想加入的数据)*
zzy.splice(2, 0, 'zzy', 11, 22)
console.log(zzy);
console.log(zzy[2]);
*// concat 连接多个数组。*
var z = [1, 2, 3]
var x = ['z', 's', 'q']
var y = ['#', '$', '!']
*// 语法 数组名.concat(数组名)*
var ne1 = z.concat(x, y)
console.log(ne1);
*// join 将数组转换为字符串。*
*// 语法 数组名.join(拼接的符号) 在重新赋予 一个新数组*
arr = arr.join('符号');
console.log(arr);
//forEach 数组的循环遍历
//这个函数里面可以指定 三个形参
//1 遍历 数组当中的 每一个元素
//2 遍历 数组元素 对应的 索引
//3 代表数数组本身
var arr = [1, 2, 3, 4, 5, '张三', "李四"];
arr.forEach(function (item, index, arr) {
console.log('名称' + item);
console.log('索引' + index);
console.log('本身' + arr);
console.log(item, index, arr);
});
//reverse 翻转数组
var arr = [1, 2, 3, '刘德华'];
arr.reverse();
console.log(arr.reverse());
// slice(开始索引,结束索引) 截取数组(但不包含结束索引)
var arr = ['a', 2, 's', 'r'];
// 值为0 那么就是克隆数组
var arr1 = arr.slice(0);
console.log(arr1);
// 第一个值 开始索引
// 第二个值 结束索引 但不包括结束索引
// 截取 第一个值和第二值 之间的数组
console.log(arr.slice(0, 2));
//includes(数组元素) 判断数组中 是否存在 这个元素
//返回值 为 true false
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.includes(111));
//includes(第一个值 数组元素,第二个值 从索引几开始搜索)
console.log(arr.includes(10, 0));
//Array.isArray() 检测是非为数组
// 是返回true 假返回false
var arr = [1, 2, 3, 4, 5];
var obj = {
name: '刘德华',
}
console.log(Array.isArray(arr));
console.log(Array.isArray(obj));
// indexOf() 从前往后扫描,扫描到 就返回改元素的索引
// lastIndexOf()从后往前扫描, 扫描到 就返回改 元素的索引
var arr = [1, 2, 3, 4, 5];
console.log(arr.indexOf(5))//从前往后
console.log(arr.lastIndexOf(5));//从后往前
console.log(arr.indexOf(6));//如果 改数组 没有次元素,那么将返回-1
//sort() 对数组进行排序,会改变原数组
// 第一种 ,不带参数 一般是在对 字符串 按照unicode编码值,从小到大排序
//如果元素都是数字 ,那么会影式的转换成 字符串 参与排序
var arr = [1, 5, 8, 9, 3];
arr.sort();//
console.log(arr.sort());
// 第二种 带参数
// 参数要求 : 是一个函数
//a,b 分别代表 数组中的 任意某两个元素
var arr1 = [1, 55555, 2, 5, 87, 1, 6, 988];
arr1.sort(function (a, b) {
return a - b;//从大到小
// return b - a;//从小到大
});
console.log(arr1);
// 正常 工作场景中
// a.对象属性
// b.对象属性
// 然后根据对象属性 的 值 进行对象的排序
var users = [
{ name: "张三", age: 24, height: 176 },
{ name: "李四", age: 22, height: 175 },
{ name: "王五", age: 26, height: 178 },
{ name: "赵六", age: 27, height: 176 },
];
users.sort(function (a, b) {
//当然也可以写逻辑判断
if (a.age == b.age) {//如果年龄 想等
return a.height - b.height;//就按照身高大小来排
} else {
return a.age - b.age//反之 就按照年龄来排序
}
})
console.log(users);
String
对象
var str = ‘abcd efgh’;
*//字符串也有 索引 和 长度*
*//也可以用for循环遍历*
*//可可以使用[索引]的语法,获取对应的字符*
*//注意:但是 字符串 无法使用[]语法 修改*
console.log(str[0]);*//输出索引为0的字符*
console.log(str.length);*//字符串的长度
*// charAt(索引号)*
*//返回指定位置的字符*
console.log(str.charAt(1));*//获取索引为1 的字符*
console.log(str.charCodeAt(1));*//获取字符的Unicode编码
*//index(字符)*
*//获取当前字符 在字符串当中的 索引号*
console.log(str.indexOf('h'));
*//如果搜索的字符 没有 那么返回 -1*
console.log(str.lastIndexOf('fff'));*//-1
*//concat(被连接的字符串名)*
*//字符串名.concat(被连接的字符串名)*
var back = 'red';
console.log(str.concat(back));*//abcd efghred
*//slice(开始索引,结束索引!! 但不包过结束索引)*
*// 截取字符串 结束索引!!*
console.log(str.slice(0, 1));*//a
*//substr(开始索引,截取的个数!!)*
*//截取字符串 截取的个数!!*
console.log(str.substr(0, 2));*//ab
*//toUpperCase()全部转为大写*
console.log(str.toUpperCase());
*//toLowerCase()*
*//全部转为小写*
console.log(str.toLocaleLowerCase());