JavaScript基础1之变量的var、const、let和数据类型的原始类型、对象类型、内存空间、拷贝

变量

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)

在这里插入图片描述

在这里插入图片描述

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值