1
JS的数据类型分为基本数据类型和引用数据类型
基本数据类型分为Undefined Null String Number Bool
关于引用数据类型
var a = new Object();
a.name = “lili”;
alert(a.name);//lili
但是基本数据类型是不能添加任何属性的
var a = “hello,world”;
a.name = “lili”;
alert(a.name);//undefined
2 复制变量值
基本数据类型进行复制时是值传递
如图:num1 num2是独立的个体,他们之间不互相影响
在这里要插一句,typeof null === “object”,但是为什么Null也是基本数据类型呢 ,我想是因为Null在堆内存中不占据空间
但是在复制引用类型的时候是这样的
如图,对引用类型的复制时对对象的指针的复制,所以,可以看到两个变量都指向同一个Object
// quoteTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
A(){}
~A() {}
void setParam(int param )
{
a = param;
}
int getParam()
{
return a;
}
};
void Change(A& a)
{
a.setParam(100);
}
void ChangeEx(A& a)
{
a.setParam(100);
A* b = new A();
b->setParam(200);
a = *b;
//a = new A;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a;
Change(a);
cout<<a.getParam()<<endl;
ChangeEx(a);
cout<<a.getParam()<<endl;
system("pause");
return 0;
}
最后的运行结果
所以,如果真是引用传递的话,改变传入参数的指针地址,那么外部参数的地址也会发生改变,看下JS
function setName(obj){
obj.name = "xx";
obj = new Object();
obj.name = "zz";
}
var s = new Object();
s.name = "yy";
setName(s);
console.log(s.name);//输出xx
运行这段代码,我们发现还是输出xx,所以在函数内部,无法改变引用对象的指向地址,所以结论是 JS 的引用类型采用的是值传递
3 检测类型
平时我们检测类型使用的是typeof,但是typeof检测对象类型时只能告诉你是Object 所以 JS 提供了新的检测运算符
instanceof
var reg = /sid/g;
那么,通过instanceof 就可以探测到它是什么类型的对象
reg instanceof RegExp === true
4执行环境和作用域
执行环境是JS中一个重要的概念
全局执行环境是window对象 ,每个函数都有自己的执行环境,当函数流程进入一个函数时,函数的环境就会被推入环境栈中,当这个函数执行完成时,栈将其弹出
当代码在一个环境中执行时,会创建变量对象的作用域链以保证变量对象和函数的有序访问
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColor(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//这里可以访问 tempColor anotherColor color
}
//这里可以访问anotherColor color 但是无法访问 tempColor
swapColor();
}
//这里只能访问color
changeColor();
以上代码中有三个执行环境:全局作用环境,changeColor的作用环境 swapColor的作用环境
全局作用域中有1个color,还有1个函数changeColor
changeColor有1个anotherColor 和 函数 swapColor,它可以访问anotherColor,也可以访问全局作用域中的color
swapColor 则可以访问函数内的tempColor 和他的父作用域的anotherColor 和全局作用域的color
用一张图来表示就是
此外 catch 和 with 能延长作用域链