#JavaScript笔记
##作用域
一.全局作用域
1.编写在script标签中的代码都是在全局作用域的,其中使用var关键字声明的变量会被提前声明(这里的提前声明是指在js代码执行前)
而不是使用var关键字声明的变量不会被提前声明,但是使用var关键字声明的变量还是在原来的位置被赋值,没有被赋值之前,调用的
话他的值是undefined。
实例:
var a = "global";
function fun(){
console.log(a);
var a = "local";
console.log(a);}
fun();
这里不是预期的值 global local 而是 undefined local 因为在我们生成函数的时候,他是在所有代码之前就已经被执行了,所以
并不是我们预期的顺序。而且前面提到var会被提前声明,这里在函数內部也不例外。所以代码可以写成以下:
实例:
var a = "global";
function fun(){
var a;
console.log(a);
var a = "local";
console.log(a);}
fun();
JS数据类型
一.基本类型
boolean 布尔值
string 字符串
number 数值
null 空(通常用来表示空一个对象)
undefined 声明但是没有赋值的变量
Symbol(ECMAScript中新定义的类型)
二. 对象类型
Object 在大多数的情况下,JS都是对象类型。
三.两者的区别
1.储存的位置不同
基本数据类型的值一般都是不变得,所以它都是存储在栈内存中的,这样它的调用就会很快,而且对程序的执行速度,
也不会产生影响,而对象类型是存储在堆内存中的,因为它的大小会发生变化,存储在栈内存中会消耗大量内存资源,
不方便调用。
2.调用的方法不同
在调用基本数据类型时,时直接调用的,而引用数据类型(也就是对象类型)时,时先找到引用数据类型存在栈内存中的
内存地址,然后再通过这个地址区访问对象类型。再将变量赋值给另一个变量的时候能够很明显的发现两者的区别。
实例:
var a = 123;
var b = a;
var a = 456;
console.log(a,b); // 456 123
var c = new Array();
c[0] = "贾玲";
c[1] = "沈腾";
var d = c;
d[2] = "王宝强";
console.log(c,d); // ["贾玲", "沈腾", "王宝强"] ["贾玲", "沈腾", "王宝强"]
这里我们不难看出来,基本数据类型的赋值,就是变量的赋值,两者没有任何的联系,而对象类型的赋值,是把对象类型在
栈内存中的地址赋值给了另一个变量,所以两个变量指向堆内存中的同一个位置,两者一个发生变化,也会影响另一个发生变化。