探索JS中的数据类型的转换
js中的数据类型
基本数据类型
- number 除正常的数字外 (NaN Infinity无穷大)也是
还有Number.MIN_SAFE_INTEGER Number.MAX_SAFE_INTEGER
分别为最大安全数和最小安全数
注意:
NaN === NaN / NaN == NaN 是不等的 所以不能用来判断一个数字是否是NaN 可以用isNaN([value])来判断是否是有效数字
Object.is(NaN,NaN) //true - String 字符串类型:’’ 、 “” 、 `` 包起来的都是字符串;
- Boolean true false;
- null ;
- undefined ;
- ** symbol唯一值类型**
console.log(Symbol() === Symbol()) //false
console.log(Symbol(‘AA’) === Symbol(‘AA’)) //false
@1 给对象设置属性 可以是字符串也可以Symbol类型
let obj = {
name:'shijiali',
[Symbol()]:100
}
console.log(obj[Symbol()])
let key = Symbol();
let obj = {
name: 'zhufeng',
age: 12,
[key]: 100
};
console.log(obj[key]);
拓展:
let symbolKeys = Object.getOwnPropertySymbols(obj); //获取当前对象所有Symbol类型的私有属性,结果数组
训练:
let a = {
name: 'zhufeng'
};
let b = {
name: 'web'
};
let obj = {};
obj[a] = 100; //obj["[object Object]"]=100
obj[b] = 200; //obj["[object Object]"]=200
console.log(obj[a]); //200
@2 (未完待续)
redux/vuex公共状态管理的时候,派发的行为标识就可以基于Symbol类型进行宏管理
@3 (未完待续)Symbol.hasInstance\Symbol.toStringTag\Symbol.toPrimitive\Symbol.iterator…很多JS底层的处理机制,就是基于这些属性方法实现的
7. bigInt大数类型数字后面加n就可是大数类型。
+ 10 Number类型
+ 10n BigInt类型
@1 JS中在进行数学运算的时候,如果计算的数值超过最大/最小安全数字,计算出来的结果很可能是不准确的「如果遇到这样的需求,则一定会出问题:服务器端数据库存储,是有longInt类型,服务器返回给客户端的值也是超过安全数字的{一般会以字符串的方式返回,这样保证返回途中数字的安全性},此时我们去进行数学运算,结果可能就”崩“了」
解决办法:把服务器返回的值变为bigint格式的,然后进行运算「保证了运算的准确性{进行运算的另外一个值也应该是bigint类型的}」;把运算的结果,再次变为字符串,发送给服务器即可!!
对象类型
1、标准普通对象 {}
2、标准特殊对象 [10,20] /\d+/ new Date() new Error() …
3、非标准特殊对象 new Number(10) … 原始值类型对应的对象类型实例
4、函数对象 function fn(){}
拓展面试题:
检测数据类型
+ typeof(特点)
1、返回结果是一个字符串,字符串中包含了对应的数据类型
2、typeof检测未被声明的变量,不会报错,结果是”undefined“
+ 封装中会用到
+ typeof null -> “object” ?
+ typeof 不能细分是啥对象「排除函数对象」,返回结果是 ”object/function“
// 所有的数据类型值,在计算机底层中都是以2进制形式存储的{64位}
// 而typeof就是基于二进制检测的:它把000开始的都识别为对象,而null全是0,所以也被识别为对象了…但是内部识别为对象后,会再次检测这个对象有没有内部实现[[call]],如果实现了,结果是”function“,没有实现就是”object“…
// 好处:检测处理的性能是很高的
// 支持浏览器导入 && 支持NODE端运行{CommonJS规范}
(function () {
let utils = {
// ...
};
/!* 暴露API *!/
if (typeof module === "object" && typeof module.exports === "object") module.exports = utils;
if (typeof window !== "undefined") window.utils = utils;
})();
// 需求:验证 val 是否为一个对象
if (val !== null && /^(object|function)$/i.test(typeof val)) {
// ...
}
2、0.1+0.2=0.3?
// + instacnceof
// + constructor
// + Object.prototype.toString.call([value])
// ----
// + Array.isArray([value])
// + …
js存储机制(堆栈内存)
通过下面这段程序来了解js的存储机制
var a = {
n: 1
};
var b = a;
a.x = a = {
n: 2
};
console.log(a.x);
console.log(b);