JS基础

一、基本概念

1、ECMAScript的一切都区分大小写

2、标识符指变量、函数,属性,或者函数的参数。第一个字符为字母,下划线或者美元符号。采用驼峰命名

3、ECMAScript变量是松散类型的

4、省略var操作符可以定义全局变量。

5、数据类型:共6种,其中有5种简单数据类型:undefined,Null,Boolean,Number,String。还有一种复杂数据类型:object

6、检测给定变量的数据类型:typeof

7、undefined类型

在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined

var message;
alert(message == undefined);//true

 与下面代码等价

var message = undefined;
alert(message == undefined);//true

不过,包含undefined值的变量与尚未定义的变量还是不一样的

var message;
//下面的变量并没有声明
//var age
alert(message);//undefined
alert(age);//产生错误

令人困惑的是:对未初始化的变量执行typeof操作符会返回undefined值,对未声明的变量执行typeof操作符同样也会返回undefined值

var message;
//下面的变量并没有声明
//var age
alert(typeof message);//undefined
alert(typeof age);//undefined

 8、null对象

null表示一个空对象指针

var car=null;
alert(typeof car);//'object'

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值

实际上,undefined值是派生自null值的

alert(null==undefined);//true

只要意在保存对象的变量还没有真正的保存对象,就应该明确让该变量保存null值。

9、Boolean类型

可以对任何数据类型的值调用Boolean()函数,并且总会返回一个Boolean值

10、Number类型

 八进制:第一位必须是0,然后是八进制数字序列

十六进制:前两位为0x,后跟任何十六进制数字

11、浮点数值

浮点数值的最高精度是17位小数,但在进行算术运算时其精确度远远不如整数。永远不要测试某个特定的浮点数值。

12、数值范围

ECMAscript能够表示的最小数值保存在Number.MIN_VALUE中,能够表示的最大数值保存在Number.MAX_VALUE中,如果某次计算结果得到了一个超过js数值范围的值那么这个数值会自动转换成特殊的Infinity值,若为负数会转换成-Infinity(负无穷)

确定一个数值是不是有穷的,可以使用isFinite()函数

13、NaN

非数值是个特殊的数值,这个数值用于表示一个本来要返回的操作数未返回数值的操作数未返回数值的情况。NaN本身有两个非同寻常的特点:1)任何涉及NaN的操作都会返回NaN.2)NaN与任何值都不相等

alert(NaN==NaN)//false

isNaN帮我们确定这个参数是否不是数值。

14、数值转换

 非数值转换为数值:Number(),parseInt(),parseFloat()

Number()可以用于任何数据类型。parseInt(),parseFloat()把字符串转为数值

15、parseInt()

parseInt()可以为这个函数提供第二个参数,转换时使用的基数(即多少进制)

var num1=parseInt("AF",16);//175
var num2=parseInt("AF");//NaN
var num = parseInt("1234blue");//1234

parseFloat()只解析十进制值

16、String类型

 17、相等和不相等== != 先转换再比较

全等和不全等 仅比较不转换

18、for in 用来枚举对象的属性

19、break语句会立即退出循环强制继续执行循环后面的语句

continue虽然也是立即退出循环,但是退出循环后会从循环的顶部继续执行。

20、with 语句的作用是将代码的作用域设置到一个特定的对象中。

21、switch

switch(expression) {
    case value:statement
    break;
    case value:statement
    break;
    case value:statement
    break;
    default:statement
}

22、参数

ES中的参数在内部是用一个数组来表示。函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

23、由于不存在函数签名(接收的参数的类型和数量),ES函数不能重载。

通过检查传入函数中参数的类型和数量并做出不同的反应,可以模仿方法的重载。

24、基本类型:undefined,null,boolean,number,string按值访问,可以操作保存在变量中的实际的值

引用类型:object 按引用访问

25、复制变量值,复制基本类型(按值传递)和引用类型时也存在不同。

复制引用类型的值时,这个值的副本实际上是一个指针,指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一个对象。

基本类型的值在内存中占据固定大小的空间,因此被保存在栈内存中。

从一个变量向另一个变量复制基本类型的值,汇创建这个值的一个副本。

引用类型的值是对象,保存在堆内存中。

包含引用类型值的变量实际上并不是对象本身,而是一个指向该对象的指针

 26、在访问变量有按值和按引用两种方式,而参数只能按值传递。

27、检测类型

typeof是确定一个变量是字符串、数值、布尔值还是undefined的最佳工具。

如果变量的值是一个对象或null,typeof会返回object

28、instanceof,通常,我们并不是想知道某个值是对象,而是想知道是什么类型的对象。

alert(person instanceof Object);//变量person是Object吗
alert(colors instanceof Array);
alert(pattern instanceof RegExp);

 29、执行环境及作用域

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的所有变量和函数。

30、没有块级作用域

31、垃圾收集:1、标记清除2、引用计数

32、引用类型

Object类型

创建Object实例的方式有两种:一种是使用new操作符后跟Object构造函数

var person=new Object();
person.name="Nich";
person.age=29;

另一种方式:对象字面量

var person = {
  name:"Nich",
  age:29
};

对象字面量也是向函数传递大量可选参数的首选方式。

 33、访问对象属性(两种)

1)使用点表示符

2)使用方括号表示法来访问对象属性

使用方括号的优点是可以通过变量来访问属性。

34、Array类型

ES数组的每一项可以保存任何类型的数据

创建数组的基本方式

1)使用Array构造函数

var colors = new Array();

2)使用数组字面量表示法

var colors=['red','blue','green'];

数组的length属性很有特点,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项。

 检测数组

if(value instanceof Array)

if(Array.isArray(value))

 35、当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量

36、转换方法

所有对象都具有toLocaleString(),toString(),valueOf()方法。调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串。而调用valueof()返回的还是数组。

var colors=['red','blue','green'];

colors.toString();
"red,blue,green"
colors.valueOf();
["red", "blue", "green"]

 数组转字符串

使用join方法,可以使用不同的分隔符来构建字符串。

var colors=["red",'green","blue"];
alert(colors.join(","));//red,green,blue
alert(colors.join("||");//red||green||blue

 37、栈方法

数组可以表现的像栈一样

栈是一种LIFO(后进先出)的数据结构,也就是最新添加的项最早被移除。

栈中项的插入和移除都发生在栈顶。

ES为数组提供了push()和pop()方法,实现类似栈的行为

push()把接收的参数逐个添加到数组末尾

pop()从数组末尾移除最后一项。

38、队列方法

队列访问规则,先进先出(FIFO)

队列在列表末端添加项,在列表前端移除项

shift() 能够移除数组中的第一个项,并返回该项

push()

可以像使用队列一样使用数组

 39、unshift()能在数组前端添加任意多个项,并返回新数组的长度。

同时使用unshift(),和pop()方法可以从相反的方向来模拟队列

在数组前端添加项,在数组末端移除项。

40、重排序方法

两个用来重排序的方法reverse()和sort()

reverse()会反转数组项的顺序。

 sort() 方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,确定如何排序。所以会认为15比5小

sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值前面。

如果第一个参数位于第二个之前,返回负数,如果相等,返回0,如果第一个参数位于第二个之后,返回正数。

 

41、操作方法

concat() 合并数组

slice()能够基于当前数组中的一或多个项创建一个新数组。如果有两个参数,该方法返回起始和结束位置之间的项。

splice()方法可以在数组中删除项,插入项和替换项(返回的是要删除的项)

42,位置方法

indexOf() 和 lastIndexOf()

indexOf()方法从数组的开头开始向后查找

lastIndexOf()从数组的末尾向前查找

这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1.

如果有两个参数,如 numbers.indexOf(4,4),表示在开始检索的位置4上检索数值4

43、迭代方法

5个迭代方法:every(),filter(),forEach(),map(),some()

var numbers=[1,2,3,4,5,4,3,2,1];
var everyResult = numbers.every(function(item,index,array) {
    return (item>2);
});
alert(everyResult);

var someResult = numbers.some(function(item,index,array) {
    return (item > 2);
});
alert(someResult);
//返回数组
var filterResult = numbers.filter(function(item,index,array) {
    return (item>2);
});
var mapResult = numbers.map(function(item,index,array) {
    return item*2;
})
alert(filterResult);
alert(mapResult);//[2,4,6,8,10,8,6,4,2]
numbers.forEach(function(item,index,array) {

});

 44、归并方法

两个归并数组的方法:reduce() 和 reduceRight()。这两个方法会迭代数组所有项,构建一个最终返回的值。

var value = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array) {
    return prev + cur;
});
alert(sum);

reduceRight()从数组最后一项开始,向前遍历到第一项。

45、Date类型

创建一个日期对象

var now = new Date();

如果想根据特定的日期和时间来创建日期对象,必须传入该日期的毫秒数

ES提供两个方法:

Date.parse() Date.UTC()

Date.now()返回表示调用这个方法时的日期和时间的毫秒数。

 46、RegExp类型

/pattern/flags

3个标志

g:全局

i:不区分大小写

m:多行模式

元字符必须转义,在前面加\

47、创建正则表达式的方式

使用RegExp构造函数,接收两个参数,

使用字面量形式

var pattern1 = /[bc]at/i;
var pattern2 = new RegExp("[bc]at", "i");

这两种方式不一样

正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例

 

posted @ 2017-09-27 15:12  lu0511  阅读(193)  评论(0)    收藏  举报