js踩坑笔记
1. 两个目测一模一样的数组不相等
let arr1=[1,2,3,4,5];
let arr2=[1,2,3,4,5];
console.log(arr1 == arr2); //false
业务背景是需要通过2个简单数组是否相同进行条件判断执行不同代码,居然漏掉了数组作为引用类型,地址都不一致,怎么可能会是true.于是进行了简单修改,
let arr1=[1,2,3,4,5];
let arr2=[1,2,3,4,5];
console.log(arr1[0] == arr2[0]); //true
值得注意的点在于,不要对引用类型的数据进行判断,一定要找到原始数据类型进行判断.
2. 数组for循环的4种方式
var arr = [];
for(let i=0;i<9999999;i++){
arr.push(i);
}
第1种方式–数组长度,9s
var arr1 = [];
console.log(new Date()); //Thu Jul 18 2019 10:48:28 GMT+0800 (中国标准时间)
for(let i=0;i<arr.length;i++){
arr1.push(arr[i]);
}
console.log(arr1);
console.log(new Date()); //Thu Jul 18 2019 10:48:37 GMT+0800 (中国标准时间)
第2种方式—数组长度(赋值),12s
var arr2 = [];
console.log(new Date()); //Thu Jul 18 2019 10:49:04 GMT+0800 (中国标准时间)
for(let i=0,l=arr.length;i<l;i++){
arr2.push(arr[i]);
}
console.log(arr2);
console.log(new Date()); //Thu Jul 18 2019 10:49:16 GMT+0800 (中国标准时间)
第3种方式—for in,26s
var arr3 = [];
console.log(new Date()); //Thu Jul 18 2019 10:49:38 GMT+0800 (中国标准时间)
for(let item in arr){
arr3.push(item);
}
console.log(arr3);
console.log(new Date()); //Thu Jul 18 2019 10:50:04 GMT+0800 (中国标准时间)
第4种方式—ES6遍历器,for of,9s
var arr4 = [];
console.log(new Date()); //Thu Jul 18 2019 10:52:21 GMT+0800 (中国标准时间)
for(let item of arr){
arr4.push(item);
}
console.log(arr4);
console.log(new Date()); //Thu Jul 18 2019 10:52:30 GMT+0800 (中国标准时间)
3. 数组排序.sort
arrayObject.sort(sortby)
sort()不传参会按照字符编码的顺序进行排序,传递的参数是一个比较函数,
function sortNumber(a,b)
{
return a - b
}
//箭头函数简化版
(a,b) => {
return a-b
}
a-b>0,则表示a>b,排序后的数组中 a 应该出现在 b 之后
a-b=0,则表示a=b,排序后的数组中 a 和 b 依次出现
a-b<0,则表示a<b,排序后的数组中 a 应该出现在 b 之前
4. 程序执行耗时的计时器
console.time('总耗时');
for (i = 0; i < 100000; i++) {
......
}
console.timeEnd('总耗时');
5. JSON字符串对象的api
JSON.parse() | JSON.stringify() |
---|---|
将json字符串对象转换为obj对象 | 将obj对象转换为json字符串对象 |
{name:‘tom’,age:10} | {‘name’:‘tom’,‘age’:10} |
6堆栈,.数据类型与拷贝
深刻理解前两个js核心概念是非常重要的!!!最近做vue项目时,写了一段简单的代码:
let list = res.result.data;
let oriList = res.result.data;
本意是用oriList存储数据,结果在对list进行修改的时候,发现oriList也随之改变,反应过来Object的拷贝其实是引用指针的拷贝,利用JSON方法转变数据类型从而解决问题:
let list = res.result.data;
let oriList = JSON.parse(JSON.stringify(res.result.data));
堆和栈都是js运行时内存中分配的一个数据区,因此也被称为堆区和栈区,
堆 | 栈 |
---|---|
存储基本数据类型,存储的值大小固定,按值访问 | 存储引用数据类型,存储的值大小不定,可动态调整,按引用访问 |
系统自动分配和释放空间 | 手动分配和释放空间 |
主要是用来执行程序,空间小运行效率高,先进后出,后进先出 | 主要用来存放对象,空间大,运行效率较低,是一种无序的存储,可根据引用直接获取 |
最新的 ECMAScript 标准定义了 8 种数据类型,基础数据类型(原始值)包括:Boolean,Number,String,Null,Undefined,BigInt和Symbol,引用数据类型:Object.二者的比较其实是不同的:基本类型的比较是它们的值的比较,引用类型的比较是引用的比较