JavaScript基础
- 变量
- var关键字
- var声明的作用域
- var 定义多个变量
- 变量提升
- let关键字
- 暂时性死区
- let不是Windows的属性
- const关键字
- 数据类型
- 原始类型
- 对象类型
- 内存空间
- 拷贝
- 拷贝原始类型
- 拷贝引用数据类型
- 比较
变量
ECMAScript变量:松散类型的 =>变量可以保存任何类型的数据
声明变量:var、const、let
var可以随意使用
const let是ES6新增的,es6以及更晚的版本使用
var关键字
var name;
定义了名为name的变量 如果不赋值,则默认为undefined
var name="张三"
name =10
var声明的作用域
var 定义一个变量会成为包含它的函数的局部变量
函数调用之后,其内部的局部变量随机被销毁
- 案例一:
function test(){
var name="张三"
}
test()
console.log(name)
以上代码,报错
- 案例二:
function test(){
name2="张三"
}
test()
console.log(name2)
去掉了var操作符,name2 变成了一个全局变量
全局变量很难维护,容易被篡改
var 定义多个变量
var name="张三",
age=18,
sex="男";
console.log(name,age,sex)
变量提升
function foo(){
console.log(age)
var age=18
}
foo()
结果是undefined,没有报错,由于变量提升导致的
上述代码等价于:
function foo(){
var age;
console.log(age)
age=18
}
foo()
声明的变量会自动提升到函数作用域顶部
function foo(){
var age=10
var age=20
var age=30
console.log(age)
}
foo()
反复多次使用var声明同一个变量,后面的会覆盖前面的
let关键字
let 声明的作用域是块作用域,var 声明的范围是函数作用域
块作用域是函数作用域的子集,适用于var的作用域的限制,同样也限制于let
if(true){
var name="张三"
console.log(name)
}
console.log(name)
if(true){
let name="张三"
console.log(name)
}
console.log(name)
let age=10
let age=20
console.log(age)
let 不允许同一个块作用域对同一个变量重复声明
暂时性死区
let声明的变量不会在作用域中被提升
function test(){
// let之前的部分都叫做暂时性死区
console.log(age)
let age=18
}
test()
let不是Windows的属性
let 在全局作用域定义的变量不会成为windows对象的属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0">
<title>Title</title>
</head>
<body>
<script>
var name="张三"
let age="李四"
console.log(window)
</script>
</body>
</html>
let是块作用域
for(let i=0;i<5;i++){
}
console.log("i",i)
for(var j=0;j<5;j++){
}
console.log("j",j)
for(var i=0;i<5;i++){
setTimeout(()=>{
console.log(i)
},0)
}
for(let i=0;i<5;i++){
setTimeout(()=>{
console.log(i)
},0)
}
循环退出的时候,我们的var定义的i每次改变的都是外层的变量的值,setTimeout为0也有400毫秒的延时,所以先执行完累加,然后执行循环;在用let设置时候,是块作用域,只对块作用域有效,只取块里的i
const关键字
const行为和let基本一致
区别:
- 用const声明的变量必须进行初始化
- 修改const声明的变量会报错
const也不允许重复声明变量
错误的表示:
const name="张三"
name="李四"
console.log(name)
const age=10
const age=20
console.log(age)
const声明的作用域也是块
const name="张三"
if(true){
const name="李四"
}
console.log(name)
数据类型
7种数据类型
- 原始类型
- 对象类型
原始类型
- null
- undefined
- Boolean:true\false
- Number:整数或者浮点数、Infinity,-Infinity,NaN
- String:一串表示文本值的字符序列
- Symbol:唯一且不可改变的数据类型
- BigInt
对象类型
- Object:Array,Function
内存空间
栈内存 和 堆内存
基本数据类型存储在栈中
栈内存:
var a=1;
var b=2;
var c=3;
引用数据类型存储在堆中
var obj1={name:"印客"}
var obj2 ={age:18}
var obj3 function (){}
var obj4=[1,2,3,4,5]
拷贝
拷贝原始类型
var name="张三"
var name1=name
name1="李四"
console.log(name)
拷贝引用数据类型
var obj={name:"张三"}
var obj1=obj
obj1.name="李四"
console.log(obj)
比较
两个变量比较,不同类型的变量表现不同
对于原始数据,直接比较他们的值,如果相等则为true
对于引用类型,比较时候会比较他们的引用地址,虽然他们在堆中存储的对象具有相同属性,但是他们被存储在了不同的空间
var name="张三"
var name1="张三"
console.log(name===name1)
var obj={name:"张三"}
var obj1={name:"张三"}
console.log(obj===obj1)