肥宅兜

导航

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==和===

  1. 当==两边的内容是字符串时,则比较字符串的内容是否相等。
  2. 当==两边的内容是数字时,则比较数字的大小是否相等。
  3. 当==两边的内容是对象或者是对象的函数属性时,则比较内存地址是否相等

==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回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方法

 

posted on 2016-08-09 15:45  肥宅兜  阅读(331)  评论(1编辑  收藏  举报