目录
do while:后条件判断语句,无论条件是否为真都会先进行循环体。
前话:原生js基本上是找到dom节点,然后操作dom节点或者给个监听函数,我们最主要的是学会编程的逻辑
var,let,const
一:定义变量分为两步:
var a = 1 等于 var a ; a =1 ;
- 声明空间
- 赋值
二:变量提升
js中var定义变量会存在变量提升,它会将var 的声明空间放在函数块代码域的第一行
例子:
console.log(a);
var a = 1
//控制台会打印undefined
三:使用object.freeze冻结变量
let obj = {
a: 1
}
Object.freeze(obj)
obj.a = 2
console.log(obj);
{a: 1}
四:变量传值与传址
let a = 1
let b = a
b = 3
console.log(a, b);
结果:1 3
说明开辟了两个空间,赋值只是把值传过去了,用的两个地址
let a = {
demo: 1
}
let b = a
b.demo = 2
console.log(b, a);
结果
demo: 2
demo: 2
说明是把地址传过去了,改变了b的值,同时a的值也改了,开辟的空间地址用的同一个
简单的标量赋值(字符串,数字。文字)开辟了新的地址空间,只是赋值
对于复杂的引用类型例如对象数组,则共用一个地址空间,即为传址
五:全局变量与局部变量
函数外声明的变量为全局变量,函数内声明的变量为局部变量
JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象。
六:作用域的问题
函数作用域:在函数体内用var就会变量提升,使得在外定义的全局变量失效。
执行函数的时候,先执行函数块作用域,在作用域里面检索变量,没有再找全局变量
下面的例子中,t()函数中如果把var改为let,终端会报错,因为当前函数域下存在 变量scope,但未提升。
let scope = "global";
function t() {
console.log(scope);
var scope = "local"
console.log(scope);
}
t();
console.log(scope);
结果:undefined
local
global
为啥第一个结果是undefined,因为函数作用域里,定义的var scope 存在变量提升
变量作用域:在函数体内定义变量不使用声明语句,则视为全局变量
function t() {
scope = "local"
}
function c() {
console.log(scope);
}
t();
c()
console.log(scope);
结果:local local
害,千言万语劝一句,别用var定义变量就没一点事情了,在这里多的是考你作用域的面试题
七:undefined与null
未赋值与未定义的变量值都为 undefined
,建议声明变量设置初始值,一般初始标准变量时设为undefined,例如数字字符串