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好像有两种称呼。

