js的数据类型及计算
js总共有七个类型:
- null
- undefined
- number(整数+浮点数,Infinity,-Infinity,NaN)
- (+BigInt,“number” 类型无法表示大于 (253-1)(即 9007199254740991),或小于 -(253-1) 的整数。这是其内部表示形式导致的技术限制。使用BigInt可以表示超过number表示范围的数字)
- string(``模板字符串,'${变量名}'以变量值做字符串)
- symbol(用于创建对象的唯一标识符)
- object
- boolen
💎typeof 判断 null 为 object
{},[],null 都被 typeof 判断为 object
typeof null 的结果是 "object"。这是官方承认的 typeof 的行为上的错误,这个问题来自于 JavaScript 语言的早期,并为了兼容性而保留了下来。null 绝对不是一个 object。null 有自己的类型,它是一个特殊值。
函数隶属于 object 类型。但是 typeof 会对函数区分对待,并返回 "function"。这也是来自于 JavaScript 语言早期的问题。
💎JavaScript中的会导致强制数据类型转换的操作
number + string
100 + '10' = 10010 if want 110 -> 100 + parseInt('10') = 110
'string' + 10 = 'string10'
== 运算符(会尽量让两者相等)
如 10 == '10'的情况下,返回为true,进行了不期望的强制类型转化。
- 对 null/undefined 且只对这俩来说,== 不会进行类型转换。 对undefined而言,只有 null 可以让 null == undefined (true)
- 在实际应用中,除非判断 obj == null 使用 == ,其他情况一律使用 ===。(obj == null 也可写作 obj === null || obj === undefined)。
- 当使用数学运算以及< > <= >= 等运算时,null/undefined 被转换为数字,null 为 0, undefined 为 NaN。 ··· alert( null > 0 ); // (1) false null转化为0 alert( null == 0 ); // (2) false null不转化 alert( null >= 0 ); // (3) true undefined 和 null,他俩互等外与别的任何类型不等
alert( undefined > 0 ); // false (1) alert( undefined < 0 ); // false (2) alert( undefined == 0 ); // false (3) ···
注意:除非判断 obj == null 使用 == ,其他情况一律使用 ===。
原始类型中的类型转换
💎手写深拷贝
关于深拷贝还应该看一下这篇文章,下面提供的这种只是比json.parse略优但没有解决实际问题。 面试官:请你实现一个深克隆
深拷贝代码:
function deepclone() {
const obj1 = {
age: 20,
name: 'xxx',
address: {
city: 'beijing'
},
arr: ['a', 'b', 'c']
}
const obj2 = deepClone(obj1)
obj2.address.city = 'shanghai'
obj2.arr[0] = 'a1'
console.log(obj1);
function deepClone (obj = {}) {
if(typeof obj !== 'object' || obj == null) {
//如果obj不是object类型或是object但是是null,都直接返回
return obj
}
let result
if(obj instanceof Array) {
result = []
} else {
result = {}
}
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
//筛选掉是继承自原型的属性
result[key] = deepClone(obj[key])
}
}
return result
}
}
还有一些关于数据类型与运算符的知识点
本文使用 mdnice 排版