- Published on
JS
var let const
在ES6之前的版本中,作用域只有全局作用域和函数作用域
ES6新增了块级作用域
var没有块级作用域。 var的变量提升,提升到当前作用域的顶部。 var声明的变量,会挂载到window上。 var在同一作用域中可多次声明,后面会覆盖到前面的
let在声明之前有暂时性死区,就是没有声明之前不能用。
const a = 1
function b() {
console.log(a)
const a = 2
}
b()
// 作用域
var a = 1
function add() {
a++
}
function foo() {
var a = 2
add()
console.log(a)
}
foo()
console.log(a)
数据类型
两个大类:基本类型、引用类型
基本类型:具体值存储在内存栈区
- undefined:表示简单值的‘无’。转为数字是NaN。调用函数没有提供要求的参数就是undefined,函数默认返回undefined。
- null:打印出来是Object,是一个语言bug,讲的就是表示对象的’无‘。转为数字是0
- boolean
- number
- string
- symbol
- bigint
引用类型:具体值存储在内存堆,要想使用具体值,要把指向该堆的地址放到栈中。
- object
对于函数参数传递引用类型的值,传递的是引用地址的复制值,如果继续引用该地值,外面的对象也会被修改,如果更换了新的对象,意味着更换了新的地址值,之后再修改对象将不会影响到外面的对象
包装类型
当我们对基本数数据类型调用方法时,内部会自动创建一个临时的包装对象,然后调用方法,最后销毁临时对象
数据类型转换
强制转换
Number()
- 基础数据类型
- undefined -> NaN
- null -> 0
- boolean -> 1/0
- string -> 纯数字字符串转数字,空字符串是0,其他字符串转NaN,
- 引用数据类型
- 调用valueOf(),如果得到简单值调用Number(),否则第2步
- 接着调用toString(),如果得到简单值调用Number(),否则第3步
- 如果还是对象就报错
String()
基础数据类型
- undefined -> 'undefined'
- null -> 'null'
- boolean -> 'true'/'false'
- number -> 转换为字符串
- string -> 本身
引用数据类型
- 调用toString(),如果得到简单值调用String(),否则第2步
- 调用valueOf(),,如果得到简单值调用String(),否则第3步
- 如果还是对象就报错
Boolean()
基础数据类型
- undefined -> false
- null -> false
- boolean -> 本身
- number -> 0/NaN -> false,其他 -> true
- string -> '' -> false,其他 -> true
- symbol -> true
- bigint -> 0n -> false,其他 -> true
引用数据类型
- true
自动转换
call
this的指向
- 直接调用,指向全局对象(window/global)
- new 指向该实例
- 通过对象调用,指向该对象
- call、apply、bind 目标对象
- 箭头函数的this,是声明时的上下文
const a = {
name: 'duyi',
say: () => {
console.log(this.name)
},
}
a.say()
```
++
在前:先自增一,然后算出表达式的结果 在后:先算出表达式的结果,再自增一
/**
* 1. 对象的属性的类别只有两种:字符串、Symbol
* 2. 对象的属性的排序方式,数字字符在前 ,其他按照添加顺序
*/
const obj = {
a: 0,
}
obj['1'] = 0
obj[++obj.a] = obj.a++
const value = Object.values(obj)
obj[value[1]] = obj.a
console.log(obj)