js基础
javascript 简称为JS 它是一门编程语言
js中的变量
- 变量:变量就是内存中的一个空间。
变量名:内存空间的别名 对变量名的操作就是对内存空间的操作
变量值:存储在内存空间中的状态(数据)
var a = 110; // 定义了一个变量 变量的名是a 变量的值是110;
- 只要把变量写在函数里面就是局部变量,只要写在函数外面就是全局变量。
1)全局变量可以在函数内部都能访问到
2)局部变量只能在函数内部访问到
// 全局变量
var address = "郑州";
// 定义函数 函数必须通过函数进行声明
function f() {
// 函数内部的变量叫局部变量
var m = 111; // 局部变量
}
if(true){
var k = 123; // 全局变量
}
for(var i=0; i<10; i++){ // i全局变量
var o = 666; // o是全局变量
}
基本语法
1)JS是区分大小写 var a = 1; var A = 2;
2)忽略空白符(空格 换行 tab)
3)语句分号可加可不加
4)注释 单行注释 多行注释 注释是给程序员看的
5)标识符 和 关键字 var a = 110; var 关键字 a变量名标识符
6)…
- 数据类型
基本数据的类型:
number 数字 var a = 110; int a = 110;
string 字符串 ”“ ‘’ JS中不分字符和字符串 都叫字符串
boolean true false 布尔类型
undefiend 没有值
null 没有值
引用数据类型:
object 对象
array 数组
function 函数 在JS中函数也是一种数据类型
在JS中,运算符两侧需要保存数据类型一致,如果不一致,JS解释器会帮你把一个数据类型转成另一个数据类型。
双元运算符你要保证两侧操作数的数据类型要一致
var res = 123 + "abc"; // 123隐式转化成字符串
console.log(res); // 123abc
console.log(typeof res); // string
强制类型转化
console.log(parseInt(3.14)); // 把小数转成整数
console.log(parseInt("3.14abc")); // 尝试把小数或非数字转成整数
console.log(parseFloat(3))
console.log(parseFloat("3.14abc"))
console.log(Number("abc123")) // NaN
console.log(Number("123abc")) // NaN
console.log(Number("123")) // 123
console.log(String(123456)) // 123456
JS代码的执行
- 1)预编译
- 2)代码执行
预编译: 提升
把加var的变量进行提升 变量声明会提升 变量的赋值是不会提升
提升到了代码段最前面
把使用function声明的函数进行提升 提升的是整个函数声明
- 在判断判断中,如果有函数,此函数在预编译期间并不会直接 提升到代码段的前面,仅仅是提升了函数名也就是说仅仅是提升了函数的声明,也就是提升了fn
console.log(fn); // 打印出的是堆上的函数体
window.fn(); // fn...
console.log(window.fn)
fn(); // fn...
if("fn" in window){
fn(); // fn...
function fn() {
console.log("fn...")
}
}
fn(); // fn...
- 在判断判断中,如果有函数,此函数在预编译期间并不会直接,提升到代码段的前面,仅仅是提升了函数名,也就是说仅仅是提升了函数的声明,也就是提升了fn
console.log(fn); // 函数名提升到最前面 打印出来的是und
// window.fn();
console.log(window.fn); // undefined
// fn(); // fn...
if("fn" in window){ // fn是全局函数 也会挂载到GO上
// 如果条件满足,进入到条件里面的第1件事就是给fn赋值
// fn 此时就已经是一个函数了
fn(); // fn...
function fn() {
console.log("fn...")
}
}
fn(); // fn...
执行上下文( Execute Context)
-
全局执行上下文:
全局代码在执行时时,就会产生全局的EC。 EG(G) -
局部执行上下文:
函数代码在执行时,就会产生局部的EC。调用一个函数就产生一个EC,调用100个函数,就产生100个EC。 -
ECStack 执行上下文栈
EC(G) 全局执行上下文 存储全局的加var 加function的数据存储在VO中 -
VO 变量对象 存储的全局的加var 或 加function
EC(f) 函数执行上下文 存储局部的加var 或 加funciton的局部数据 -
AO 活动对象 存储局部的加var 或 加function的局部数据
-
GO 全局对象
默认情况下,里面就存储了很多东西
全局的数据,加Var的全局数据,加functon的全局数据,不加var的变量都会存储到GO中的
-
加var与不加var的区别
1)在全局代码中,加var会提升,没有var的不会提升。
console.log(a);
a = 110; // a is not defined
2)不管加没加var的全局变量,都会作为window的属性
var a = 1;
b = 2;
console.log(window.a)
console.log(window.b)
3)没有加var的变量,只能作为全局变量,只要是全局变量,肯定是window的属性
function f() {
a = 666;
}
f()
console.log(window.a)
4)加var的局部变量,不会作为window的属性
function f() {
var a = 666;
}
f()
console.log(a)
// 访问一个对象上不存在的属性,结果就是und
console.log(window.a) // undefined
- let
- 声明的变量不提升
- 配合{ }形成块级作用域
- let声明不会挂到GO上
- 使用let不能重复声明
- const
- 声明一个常量,不提升
- ~4.同上
- 声明的常量必须赋值