语法
# javascript 语法
# 1.基础操作
undefined == null // true
1
# 2.高级操作
# 数字操作
# 小数加减法
- 先乘后加再除
- 1.1.toFixed(2) 不会四舍五入,还有兼容性问题
- 小数和整数分别计算
# 对象浅拷贝
对象的合并 Object.assign(),第一个参数必须是个空对象
var obj1 = {a: 1, b: 2};
var obj2 = Object.assign({}, obj1);
1
2
2
对象的解构赋值
var obj1 = {a: 1, b: 2};
var obj2 = {...obj1};
1
2
2
# 对象深拷贝
利用jQuery的$.extend方法
//第一个参数不传(false是不能够显示的写出来的)默认为false,是浅拷贝。传true为深拷贝。
$.extend(true,object1, object2)
//newObject 即为深拷贝出来的对象
var newObject = $.extend(true , {} , object);
1
2
3
4
5
2
3
4
5
通过js的内置对象JSON来进行数组对象的深拷贝
这种简单粗暴的方法有其局限性,当值为undefined、function、symbol 会在转换过程中被忽略
function deepClone(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
1
2
3
4
5
2
3
4
5
数组或对象深拷贝(利用循环和递归)
function deepClone(obj, newObj) {
var newObj = newObj || {};
for (key in obj) {
if (typeof obj[key] == 'object') {
newObj[key] = (obj[key].constructor === Array) ? [] : {}
deepClone(obj[key], newObj[key]);
} else {
newObj[key] = obj[key]
}
}
return newObj;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 数组浅拷贝
利用数组的 slice 方法或者 concat 方法
var arr1 = ["aaa","bbb","ccc"];
var arr2 = arr1.slice(0);
arr2[0] = "ddd";
var arr1 = ["aaa","bbb","ccc"];
var arr2 = arr1.concat();
arr2[0] = "ddd";
1
2
3
4
5
6
2
3
4
5
6
# 数组深拷贝(同对象深拷贝)
# js 获取字符串所占字节数 (UTF-8编码)
let getStrBytes = function (str) {
if (str == null || str === undefined) return 0;
if (typeof str != "string") {
return 0;
}
var total = 0, charCode, i, len;
for (i = 0, len = str.length; i < len; i++) {
charCode = str.charCodeAt(i);
if (charCode <= 0x007f) {
total += 1;//字符代码在000000 – 00007F之间的,用一个字节编码
} else if (charCode <= 0x07ff) {
total += 2;//000080 – 0007FF之间的字符用两个字节
} else if (charCode <= 0xffff) {
total += 3;//000800 – 00D7FF 和 00E000 – 00FFFF之间的用三个字节,注: Unicode在范围 D800-DFFF 中不存在任何字符
} else {
total += 4;//010000 – 10FFFF之间的用4个字节
}
}
return total;
};
console.log(getStrBytes("js 获取字符串所占字节数 (UTF-8编码)"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Promise.then()链式调用
- 当执行 then 方法时,如果前面的 promise 已经是 resolved 状态,则直接将回调放入微任务队列中
- 当一个 promise 被 resolve 时,会遍历之前通过 then 给这个 promise 注册的所有回调,将它们依次放入微任务队列中
new Promise(function(resolve, reject){
//异步调用成功
resolve(传递给then的参数);
//异步调用失败
reject(传递给catch的参数);
}).then(function(resolve传递过来的参数){
return new Promise(function(resolve, reject){
//异步调用成功
resolve(传递给then的参数);
//异步调用失败
reject(传递给catch的参数);
});
}).then(function(resolve传递过来的参数){
return new Promise(function(resolve, reject){
//异步调用成功
resolve(传递给then的参数);
//异步调用失败
reject(传递给catch的参数);
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# module.exports和exports和export和export default的区别,import和require的区别
module.exports和exports一开始是同一个对象,如果只是给他们添加属性,那就是相同的。但是如果分别给他们赋了不同的对象将导致不同,require导入使用的是module.exports。
导出时
- export相当于把对象添加到module的exports中。
- {exports: {aunt:{age:25,name:'AuntFirefly'},uncle:{age:25,name:'UncleFirefly'}, hot:{...}}
- export default相当于把对象添加到module的exports中,并且对象的key叫default。
- {exports: {default:{age:25,name:'UncleFirefly'}, hot:{...}}
导入时:
- 不带{}的导入
本质上就是导入exports中的default属性(注:如果default属性不存在,则导入exports对象)。
- 带{}的导入
本质上按照属性key值导入exports中对应的属性值。
编辑 (opens new window)
上次更新: 2026/02/06, 03:37:18