JavaScript 基础知识点
变量声明
var声明特点
- 函数作用域
- 可重复声明
- 变量提升
- 省略
var
则视为全局变量
let声明特点
块级作用域
不可重复声明
1
2
3
4
5
6
7
8
9//都会报错SyntaxError
let name
let name
let name
var name
var name
let name暂时性死区代替变量提升
与
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 ?
1 | console.log(5/0); // Infinity |
函数isFinite()
用来判断是不是无穷大,
函数isNaN()
用来判断是不是非数值,在进行判断前会先进行数值型的隐式转换,
1 | console.log(isNaN(NaN)); // true |
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的区别,就是不能变量提升和重复声明等,这样好记一些。
第二篇,隐式转换盘点,出上述还有==的四种转换规则。还有位运算的转换,比如~~
引用类型
1 | function fn(arr) { |
js中数组作为参数传入到函数中时,会复制一个变量,但因为数组是引用类型,所以复制的变量存储的是地址(如果是基本类型,就是直接复制),也就是说,函数内外(实参与形参)引用的是同一个数组,当使用push等方法修改形参或另一个引用值相同的变量,函数外面数组也会变化,不过对形参赋值为另一个数组的地址时arr=[]
,再进行push等修改不会有影响。
1 | function fn(arr) { |
所以,想要是内部对数组的修改不影响外部,可以使用slice复制一个新的数组,引用了不同的地址,怎么修改都不会影响外面。
splice和slice好像有两种称呼。