这是我参与8月更文挑战的第2天,活动详情查看8月更文挑战编程
数据值是一门编程语言进行生成的材料,JavaScript 也不例外。JS 中的数据类型,是学习 JavaScript 的基础,主要分红两类:基本数据类型和引用数据类型:数组
今天咱们主要先了解下基本数据类型。浏览器
包括:安全
if (Number(num) == NaN) {
alert('num不是有效数字!');
}
复制代码
上面这种方案可行吗?答案是不能够的。NaN 和谁都不相等,条件永远不成立(即便 num 确实不是有效数字,转换的结果确实是 NaN ,可是NaN != NaN的)markdown
这里咱们可使用到一个方法:isNaNapp
isNaN:检测当前值是否不是有效数字,返回 true,表明不是有效数字,返回 false,是有效数字编程语言
// 语法:isNaN([value])
let num = 12;
isNaN(num); // 检测num变量存储的值是否为有效数字 false
isNaN('13'); // => false
isNaN(true); // => false
isNaN(false); // => false
isNaN(null); // => false
isNaN(undefined); // => true
isNaN({age:9}); // => true
isNaN([12,13]); // => true
isNaN([12]); // => false
isNaN(/^$/); // => true
isNaN(function(){}); // => true
复制代码
isNaN 检测的机制函数
上面说到,浏览器会默认的把值转换为数字类型,直接使用Number
这个方法转换的oop
定义:JS 内置的转换方法post
【字符串转数字】
Number('13') // => 13
Number('13px') // => NaN 若是当前字符串中出现任意一个非有效数字字符,结果则为 NaN
Number('13.5') // => 13.5 能够识别小数
Number('13.5.0') // => NaN
Number('') // => 0
复制代码
【布尔转数字】
Number(true) // => 1
Number(false) // => 0
复制代码
【其它转数字】
Number(null) // => 0
Number(undefined) // => NaN
复制代码
特殊:
Number('') // => 0
[].toString() // => ''
// => isNaN([]) =>isNaN('') => false
复制代码
通常都是基本数据类型转换成数字类型,不多引用数据类型转换成数字类型的。
定义:从字符串最左边字符开始查找有效数字字符,而且转换为数字,可是一旦遇到一个非有效数字字符,查找结束。把一个字符串中的整数部分解析出来
跟 parseInt 的区别:把一个字符串中的小数(浮点数)部分解析出来,其余是同样的。
parseInt('13.5px') // => 13
parseFloat('13.5px') // => 13.5
parseInt('width:13.5px')
// => NaN 从字符串最左边字符开始查找有效数字字符,而且转换为数字
// 可是一旦遇到一个非有效数字字符,查找结束
复制代码
主要区别:在于字符串转换分析上
定义:用单引号或者双引号或反引号包裹起来的都是字符串。
alert(1) // => '1'
复制代码
let n = Math.PI;
n.toFixed(2) // "3.14"
let ary = [12,23,34];
ary.join('+') // => '12+23+34'
复制代码
转换规律:
调用的方法:toString
【除了对象,都是你理解的转换结果】
1 -> '1'
NaN -> 'NaN'
null -> 'null'
[] -> ''
[13] -> '13'
[12,13] -> '12,13'
复制代码
【对象转字符串】
(function(){}).toString() // "function(){}"
new Date().toString() //"Thu Jul 18 2019 10:03:32 GMT+0800 (中国标准时间)"
({name:'xxx'}).toString(); // => "[object Object]"
().toString(); // => "[object Object]"
// 无论是啥样的普通对象,最后结果都同样的
复制代码
只有两个值:true / false
Boolean(1) // => true
Boolean(0) // => false
Boolean(-1) // => true
Boolean(NaN) // => false
!'追梦玩家' // => false 先把其它数据类型转换为**布尔类型**,而后**取反**
!0 // => true
!'' // => true
!!null // => 取两次反,等价于没取反,也就剩下转换为布尔类型了
复制代码
规律 5个falsy:
在JS当中只有"0 / NaN / 空字符串'' "" / null / undefined"这个5个值转换为布尔类型的 false,其他都转换为 true
都表明空或者没有
null:通常都是意料之中的没有,先让他暂时没有,后期再给他加上去。(通俗理解:通常都是人为手动的先赋值为 null,后面的程序中咱们会再次给它赋值)
let num = null; // => null是手动赋值,预示着后面我会把num变量的值进行修改
...
num = 13;
复制代码
undefined 表明没有,通常都不是人为手动控制的,大部分都是浏览器自主为空。(后面能够赋值也能够不赋值)
let num; // 声明一个变量 num => 此时变量的值,浏览器给分配的就是undefined
// 获取一个对象的属性值,若是这个对象没有这个属性名,获得的值就是 undefined
let person = { name: '追梦玩家' };
console.log(person.name); // 追梦玩家
console.log(person.age); // undefined
...
// 后面能够赋值也能够不赋值
复制代码
它是用来作什么的呢? 为了说明 Symbol 的做用,咱们结合例子来说解:
因为没有访问限制,JavaScript 曾经有一个惯例:私有属性如下划线起始来命名。 这样不只没法隐藏这些名字,并且会搞坏代码风格。 如今有了 Symbol,就能够利用 Symbol 来隐藏这些私有属性:
let speak = Symbol('speak')
class Person {
[speak]() {
console.log('say Hi')
}
}
复制代码
下面这几种访问都获取不到 speak
属性:
let p = new Person()
Object.keys(p) // []
Object.getOwnPropertyNames(p) // []
for(let key in p) console.log(key) // <empty>
复制代码
但 Symbol 只能隐藏这些函数,并不能阻止未受权访问。 仍然能够经过 Object.getOwnPerpertySymbols()
, Reflect.ownKeys(p)
来枚举到 speak
属性。
BigInt
类型是 JavaScript 中的一个基础的数值类型,能够用任意精度表示整数。使用 BigInt,您能够安全地存储和操做大整数,甚至能够超过数字的安全整数限制。BigInt 是经过在整数末尾附加n
或调用构造函数来建立的。
Number类型只能安全的支持-9007199254740991(-(2^53-1)) 和 9007199254740991(2^53-1)之间的整数,任何超过这个范围的数值都会失去精度;而 BigInt 能够解决这个问题
console.log(9007199254740999) //9007199254741000 console.log(9007199254740993===9007199254740992) //true
复制代码
从上面的代码,能够看到当数值超过 Number 数据类型支持的安全范围值时,将会被四舍五入,从而致使精度缺失的问题
console.log(9007199254740999n); //9007199254740999
复制代码
let bigInt = BigInt("9007199254740999"); //传递给BigInt()的参数将自动转换为BigInt:
console.log(bigInt); //9007199254740999n
复制代码