js基础总结
1定义变量
var name = '姓名';
name = 10;//自动转为number类型
var age = 24;
var flag= true;
var email;//undefined
var obj = new Object();
2基本数据类型
boolean string number undefined null
3
var a = 10;
var b = a;
b = 20;
console.log(a);//10
console.log(b);//20
var b1 = true;
var b2 = b1;
b1 = false;
console.log(b1);//true
console.log(b2);//false
从运行结果可以看出,b的值是a值的一份拷贝,虽然,两个变量的值是相等,但是两个变量保存两不同的基本数据类型值。b只是保存了a复制的一个副本。所以,当b的值改变成20时,a的值依然是10。两个Boolean变量b1和b2同样是基本数据类型,同样保存两个不同的基本数据据类型值,b2保存1复制的一个副本。所以,当b2的值改变成false时,b1的值依然是true。
基本数据类型赋值的过程:
4
JavaScript中的字符串String一个特殊的基本数据类型,在很多语言中,String是以对象的形式表示的,但在JavaScript里,String是当作一种基本数据类型,是通值传递的方式来操作。但它是一个比较特殊的基本类型。
5
Null类型只有一个专用值 null,值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的
尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(typeof 运算符对于 null 值会返回 "Object"。)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
6引用数据类型
javascript引用数据类型是保存在堆内存中的对象,JavaScript不允许直接访问堆内存空间中的位置和操作堆内存空间,只能通过操作对象在栈内存中的引用地址。所以引用类型的数据,在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存在堆内存中的对象。
var obj1 = new Object();
var obj2 = obj1;
obj2.name = 'one';
console.log(obj2.name);//one
声明了一个引用数据类型变量obj1,并把它赋值给了另外一个引用数据类型变量obj2。当我们obj2添加了一个name属性并赋值" 孤傲苍狼"。obj1同样拥有了和obj2一样的name属性。说明这两个引用数据类型变量指向同一个对象。obj1赋值给obj2,实际只是把这个对象在栈内存的引用地址复制了一份给了obj2,但它们本质上共同指向了堆内存中的同一个对象。
引用数据类型赋值过程
自然,给obj2添加name属性,实际上是给堆内存中的对象添加了name属性,obj2和obj1在栈内存中保存的只是堆内存对象的引用地址,虽然也是拷贝了一份,但指向的对象却是同一个。故而改变obj2引起了obj1的改变。
一般而言,基本数据类型是由固定数目的字节组成,这些字节可以在解析器的较底层进行操作,比如Number和 Boolean;而引用数据类型,可以包含任意数目的属性和元素,因此它们无法像基本数据类型那样很容易的操作。由于,引用数据类型的值是会发生变化的, 所以通过跟基本数据类型一样的值传递方式,也就没什么意义了,因为会牵涉到大量的内存的复制和比较,效率太低。所以引用数据类型是通过引用传递方式,实际传递的只是对象的一个地址。比如Array和Function,因为它们都是特殊的对象所以它们都是引用类型。另外,引用类型是可以添加属性,基本类型虽然也可以添加属性,也不会报错,经测试添加完之后却是无法访问的。
7not运算符
在JavaScript 中,逻辑NOT运算符与C和Java中的逻辑 NOT 运算符相同,都由感叹号(!)表示。与逻辑 OR 和逻辑 AND 运算符不同的是,逻辑 NOT 运算符返回的一定是 Boolean 值。
逻辑 NOT 运算符的行为如下:
- 如果运算数是对象,返回 false
- 如果运算数是数字 0,返回 true
- 如果运算数是 0 以外的任何数字,返回 false
- 如果运算数是 null,返回 true
- 如果运算数是 NaN,返回 true
- 如果运算数是 undefined,发生错误
判断JavaScript变量的Boolean 值时,也可以使用逻辑NOT运算符。这样做需要在一行代码中使用两个 NOT 运算符。无论运算数是什么类型,第一个NOT运算符返回 Boolean值,第二个NOT将对该Boolean值取反,从而给出变量真正的Boolean值。使用not运算符判断JavaScript变量的Boolean值是一个非常有用的技巧,只要知道了变量的boolean值,那么当使用变量进行&&或者||运算时,就可以很快知道运算的结果了。
8逻辑 AND 运算符用双和号(&&)表示
逻辑AND运算的运算数可以是任何类型的,不止是Boolean值,如果某个运算数不是原始的Boolean型值,逻辑AND运算并不一定返回Boolean值
9逻辑OR运算符用||表示
10==和===
- 当==两边的内容是字符串时,则比较字符串的内容是否相等。
- 当==两边的内容是数字时,则比较数字的大小是否相等。
- 当==两边的内容是对象或者是对象的函数属性时,则比较内存地址是否相等。
==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase
11判断一个变量的数据类型
function isNumber(val){
return typeof val === 'number' && isFinite(val);
}
同理:
return typeof val ==="boolean";
return typeof val === "string";
return typeof val === "undefined";
return val === null;
function isObj(str){ if(str === null || typeof str === 'undefined'){ return false; } return typeof str === 'object'; }
数组类型不可用typeof来判断。因为当变量是数组类型是,typeof会返回object。
/*判断变量arr是不是数组 方法一 */ function isArray1(arr) { return Object.prototype.toString.apply(arr) === '[object Array]'; } /*判断变量arr是不是数组 方法二 */ function isArray2(arr) { if(arr === null || typeof arr === 'undefined'){ return false; } return arr.constructor === Array; }
12函数
函数的概念:为完成某一功能的程序指令(语句)的集合,称为函数
函数的分类:
1、自定义函数(我们自己编写的函数),如:function funName(){}
2、系统函数(JavaScript自带的函数),如alert函数
函数的特点:
函数的参数列表可以是任意多个,并且数据类型可以是任意的类型,JavaScript的函数天然支持可变参数,JavaScript有一个arguments变量可以访问所有传到函数内部的参数。
比如一个add()方法,可以add(1,2,3) 也可以 add(1)
动态函数的用处
动态函数必须用Function对象来定义(Function是javascript中的一个对象,是固定不变的,规定Function对象的"F"必须大写,当是function的时候,我们知道是定义函数的时候所使用的一个关键字:function funName(x,y),当是Function的时候(F大写的时候),我们知道是javascript中的对象)\
(new是javascript中一个关键字,也是固定的,我们在定义动态函数的时候必须要使用new来创建这个Function对象)
var 变量名 = new Function("参数1","参数2","参数n","执行语句");
var square = new function("x","y","var sum;sum = x+y;return sum;");
上面的动态函数和静态函数一致:
function square(x,y){
var sum = x+y;
return sum;
}
静态函数和动态函数区别
动态函数的每一个句子两边都加上了引号"x"还有"y"还有"var sum ; sum = x+y; return sum;"这些两边都加上了引号,也就是说在new Function后面的小括号里面的每一个语句两边都是有引号的,也就是说他们都是以字符串的形式表示和被调用的,而字符串又是可以由变量来定义或者是改变的,也就是说,我们可以定义变量,让变量的值等于这些字符串:
所以上面的动态函数可以这么写:
var a = "var sum;";
var b = "sum = x+y;";
var c = "return sum;";
var square = new Function("x","y",a+b+c);
console.log(square(2,3));//5
//修改动态函数的
b = "sum = x-y;";
var square = new Function("x","y",a+b+c);
console.log(square(2,3));//1
在程序运行的过程中,把b = "sum = x+y;";改成了"sum = x-y;";这样我们再把修改了值以后的变量b,放到var square = new Function ( "x", "y", a+b+c);中,
那("x","y","var sum ; sum = x+y;return sum;");就变成了:("x","y","var sum ; sum = x - y;return sum;");我们把传递给这个动态函数的参数2和3放进去,就变成了2-3,结果是-1。
匿名函数
直接声明一个匿名函数,立即使用。用匿名函数的好处就是省得定义一个用一次就不用的函数,而且免了命名冲突的问题,js中没有命名空间的概念,因此很容易函数名字冲突,一旦命名冲突以最后声明的为准。
var f1 = function(a1,a2){return a1+a2;}
function后没有定义函数的名称,可以直接使用
console.log(f1(1,2));
console.log(function(a1,a2){return a1+a2})(10,10);
不支持函数的重载,调用的是最后定义的那个Test方法