# 变量声明
# var声明特点
- 函数作用域
- 可重复声明
- 变量提升
- 省略
var
则视为全局变量
# let声明特点
块级作用域
不可重复声明
//都会报错SyntaxError let name let name let name var name var name let name
1
2
3
4
5
6
7
8
9暂时性死区代替变量提升
与
var
不同,使用let
再全局作用域声明的变量不会成为Window对象属性
# const声明特点
- 块级作用域
- 不可重复声明
- 暂时性死区代替变量提升
- 声明时必须同时初始化变量,且不可修改
# 数据类型
简单数据类型:Undefined、Null、Boolean、Number、String和Symbol;
复杂数据类型:Object (function)
# Boolean()转型函数的转换规则
会转换为false
的值有:''
、0
、NaN
、null
、undefined
,发现特点都是基本数据类型
需要注意{}
和[]
转换布尔值的结果都是true
,
区分大小写,True
不是布尔值。
# 转换时机--隐式转换
执行if
语句时会自动进行布尔值的转换。
# Number数据类型
NaN | 非数值 |
---|---|
Infinity | 正无穷大 |
-Infinity | 负无穷大 |
Number.MIN_VALUE | 最小值 |
Number.MAX_VALUE | 最大值 |
判断是 0 还是 -0 ?
console.log(5/0); // Infinity
console.log(5/-0); // -Infinity
// 0、+0、-0相除返回NaN
console.log(0/0); // NaN
2
3
4
函数isFinite()
用来判断是不是无穷大,
函数isNaN()
用来判断是不是非数值,在进行判断前会先进行数值型的隐式转换,
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,转换为10
console.log(isNaN('10')); // false,转换为10
console.log(isNaN('lwy')); // true
console.log(isNaN(true)); // false,转换为1
2
3
4
5
# Number()和parseInt()转换规则对比
对照表 | Number | parseInt |
---|---|---|
true/false | 1/0 | NaN |
null | 0 | NaN |
undefined | NaN | NaN |
'' | 0 | NaN |
'114a' | NaN | 114 |
'a114' | NaN | NaN |
'22.2' | 22.2 | 22 |
Number()和parseInt()都会省略前面的0,且能识别不同的整数格式;Number()如果发现字符串中存在非数值则直接返回NaN,parseInt()会在非数值处截断。
同时parseInt()接受第二个参数,用于指定底数(进制数)。
# toString()和String()对比
除了null
和undefined
的所有值都有toString()
方法,用法如num.toString()
,并且它接受一个参数,表示以什么底数输出数值的字符串表示。
String()
在使用前会判断,如果值有toString()
方法则调用,如果值是null
返回null
;值是undefined
则返回undefined
。
# 类型检测
# typeof
操作符
可以检测undefined
、boolean
、number
、string
、symbol
、function
、object
共 7 种
需要注意:
typeof null
返回的结果是object
,因为特殊值null
被认为是对空对象的引用。对于未声明和声明未初始化的变量进行
typeof
都是返回undefined
。
可以写两篇博客,一篇是ES6的特性,比如箭头函数(this,不能被new),let,const与var的区别,就是不能变量提升和重复声明等,这样好记一些。
第二篇,隐式转换盘点,出上述还有==的四种转换规则。还有位运算的转换,比如~~,>>>