javaScript基础

来源:互联网 发布:淘宝卖家最高级别店铺 编辑:程序博客网 时间:2024/06/14 10:10

javaScrip语言学习

javaScript高级特性:http://blog.csdn.net/wang2963973852/article/details/53007550
javaScript自定义对象和继承的模式探究:http://blog.csdn.net/wang2963973852/article/details/53033123
详细javaScript基础介绍以及系统学习可见:http://www.w3school.com.cn/js/js_obj_regexp.asp
JavaScript的入门真的不难。
但必须说明的是,虽然核心语法不难,但是JavaScript的复杂性体现在另外两个方面。
javaScript导论与历史:
首先,它涉及大量的外部API。JavaScript要发挥作用,必须与其他组件配合,这些外部组件五花八门,数量极其庞大,几乎涉及网络应用的各个方面,掌握它们绝非易事。

其次,JavaScript语言有一些设计缺陷。某些地方相当不合理,另一些地方则会出现怪异的运行结果。学习JavaScript,很大一部分时间是用来搞清楚哪些地方有陷阱。Douglas Crockford写过一本有名的书,名字就叫《JavaScript: The Good Parts》,言下之意就是这门语言不好的地方很多,必须写一本书才能讲清楚。另外一些程序员则感到,为了更合理地编写JavaScript程序,就不能用JavaScript来写,而必须发明新的语言,比如CoffeeScript、TypeScript、Dart这些新语言的发明目的,多多少少都有这个因素。

《script》标签

1、把javaScript插入HTML需要使用《script》标签,可以直接插入到HTML页面,野结衣使用外部javaScript文件(此时必须将src属性的值设置为指向响应文件的URL)
2、所有《script》标签会按在页面上出现的顺序一次被解析,在不使用defer(延迟)和async(异步)属性时,《script》标签后面的页面内容会在《script》标签被解析完成之后才执行,这可能导致页面的打开速度变慢,所以一般吧《script》标签放在页面内容之后
3、使用defer属性值为“defer”,表示此《script》标签会等到文档内容被解析完成之后再执行,async属性表示当前脚本不需要等待其他脚本执行,也不影响文档内容的呈现

javaScript基本概念

1、javaScript中的一切都区分大小写
2、在函数内部的上方添加“use strict”这是一条编译指令,表示此函数在严格模式下执行,注意:严格模式下和普通模式下执行结果有很大区别
3、变量是松散类型的,所谓松散类型是指变量可以被用来保存任意类型的数据,定义变量时要使用var操作符不使用var操作符修饰的是全局变量(就算是在方法里面也是,但是最好不要在局部作用域里面定义全局变量)
4、javaScript提供了七种不同的数据类型 undefined(未定义),null(空),boolean(布尔),string(字符串),symbol(符号),number(数字),object(对象)javaScript不支持任何自定义类型的数据,所有的值最终都是以上七种数据

5、typeof操作符用来检测变量的数据类型,如var myName=“xx”:typeof myName 会返回Sting
6、undefined只有一个值就是undefined,表示的是声明了一个变量但是没有对其进行初始化,注意和null不同,null是已经将变量赋值为null
7、null,从逻辑角度来看null更像是一个空对象的指针,因此typeof监测到null值会返回object,一般用于声明一个对象时将其初始化为null(惯例)注意和JAVA中的null不是一个概念
8、因为javaScript的变量可以存储任何数据类型,因此javaScript会在使用其他各种数据类型为boolean类型的时候,对应的转成true或者false 例如:非空字符串–true ,空字符串–false, 非零数字–true, 0–false,任何对象–true,null–false ,undefined–false
9、number类型可以存储整数、浮点数(即:单双精度数)以及非数值NaN(比如1/0,JAVA会报错但javaScript会返回NaN),注意NaN和任何值不相等包括NaN isNaN()方法可以用来检测是否是Na

10、String 单双引号都可以用来表示字符串
转译字符 \ 和字符串单双引号的使用:
var myStr = “I am a \”double ” inside \”double quotes\”“;
字符串的单引号的使用,当你将一个字符串使用单引号包裹起来的时候,资格字符串里再有双引号字符,javaScript也不会识别,例如:
var myStr = ‘《a href=”http://www.example.com” Link/》’;
javaScript没有字符类型,那么怎么得到字符串中的某个字符呢?我们将字符串看做是一个数组,按从0开始的索引取值
字符串的不可变性 : 改变字符串的唯一方法是重新给它赋一个值
var myStr = “Jello World”;
myStr[0] = “H” 就算这样myStr字符串的第一个字符的值还是J不会变成H;
toString()方法用于将其他数据转成字符串
javaScript字符串的简要方法:javaScript字符串方法
11、javaScript中的相等操作符:
== 和 != 这两个操作符都是会先将两个变量的数据类型强转成相同的然后再比较
全等操作符:
12、javaScript中的数组 :javaScript数组方法
javaScript中的数组和JAVA中的不同,主要是两点:
一:数组长度是可变的
二:数组中可以存储任意数据类型的数据(这也是由javaScript中对变量的定义引发的)
判断javaScript中的变量是不是数组
使用 instanceof 操作符来进行判断 例如:instanceof Array(但如果网页有多个框架就会出现问题)
使用Array.isArray() 方法来判断是非是数组,(ECMAScript5新增,早期版本浏览器不支持)

javaScript的数组具有类似栈结构(先进后出/后进先出)的数据操作方法,push()方法科技接受任意数量的参数,将其逐个添加到数组末尾,或者使用pop()方法从数组末尾删除一项数据

javaScript的数组具有类似队列结构(先进先出)的数据操作方法,push()方法加入数据到队尾,shift()方法从队
13、javaScript中所有的基本数据类型都不是对象包括字符串,因为在javaScript中对象是可以自由添加删除属性的,而当你对字符串变量进行这一操作之后,再次访问此变量的属性返回值为undefined(未定义)
14、javaScript中的变量的赋值规则和JAVA一致,
对于基本数据类型的值,直接创建一个副本,两个变量互不影响
对于引用类型的值(这里指对象),则是两个变量都拿到对象的引用,且两个引用指向同一个内存地址
15、javaScript中的方法的参数传递:(和其他语言不一样,但和JAVA一致)
javaScript只有按值传递这一种参数传递方法,基本数据类型的参数值就没什么好说的,关键在于引用数据类型参数上,我们在方法外定义一个引用数据类型的变量,然后当做方法参数传递进来,(注意:这里是把外部变量的引用的值复制了一份传递进来,也就是方法内外的两个变量都是指向对一个内存地址的两个引用,注意是两个引用而不是一个,所以当我们在方法内部修改引用对象的属性的时候,外部变量也有反映,但是如果我们把内部变量置为空,则不会影响外部变量,因为此时只是切断了这个引用的指针而已)

16、 javaScript的Date类型是在早期的JAVA的Date类基础上构建的
为了方便创建爱你日期对象,有两个方法Date.parse()方法,(接受一个便是日期格式的字符串参数),
和Date.UTC()方法(参数分别是:年份,月份,日期例如:Date.UTC(2005,4,25)表示2005年4月25日)(注意月份基于0)
Date.now()方法:返回调用此方法时的日期时间对应的毫秒数
17、javaScript通过RegExp类型支持正则表达式
例如: var expression = /pattern/flags
或者:var expression = new RegExp(“[bc]at”,”i”);不区分大小写匹配第一个bat或者cat字符串
pattern部分可以使简单或者复杂的正则表达式
flags部分表示正则表达式的匹配模式的标志 ,支持三种标志
g :表示全局模式
i:表示不区分大小写模式
m:表示多行模式

18、javaScript的垃圾回收原理和BOM(标记清除)、DOM的垃圾回收策略(引用计数,有缺陷),以及两者交互时产生的问题和解决办法
引用计数可能会出现循环引用(两个对象之间相互引用)导致无法清除内存垃圾的问题,因此当原生javaScript对象和DOM元素之间存在循环引用的时候,也会出现相似的问题
解决办法:当使用完毕的时候,最好手动切断两者之间的引用链接

另外因为javaScript的内存分配一般比桌面程序要小得多,因此为了确保最少的内存可以让页面获得更好的性能,我们可能需要在必要的时候手动释放全局对象引用,一般采用将引用变量置为null来解除引用

19、javaScript对象和JAVA对象功能上的区别
JAVA中的对象主要是用来提供功能的,因为其有着对属性和方法的封装,是的其更接近真实世界的对象,
而JavaScript里面的对象则不然,因为javaScript的对象的结构仅仅是各种数据的集合,所以其被用作应用程序之间传递数据更加合适,具体的功能实现等则交由javaScript的一等公民函数来执行

20、一般情况下访问javaScript对象的属性有两种方法,一种是 . 表示法(常用,标准),一种是 [ ]方括号表示法,(一般用于通过变量来访问对象属性)

21、javaScript的方法函数
javaScript中最有特点的就是函数了,而这种特点的根源就是在javaScript中函数是对象,而函数名仅仅只是指针(但保存为变量),
使用关键字:function 和Java相比较没有什么访问权限控制,和方法返回值的声明(这些都是和javaScript的设计理念决定的,javaScript中方法是第一级成员)

javaScript中的方法和JAVA很不一样,1、javaScript的方法首先不介意传进来的方法是什么类型,2、也不在乎传进来的参数的个数,在javaScript中方法的参数只是用来提供访问的方便性,但不是必须的
实际上javaScript方法的参数在方法内部是通过数组的形式来提供的,由于javaScript数组的特性决定上面方法参数的多样性,在方法中可以通可以通过arguments对象来访问方法的参数数组对象,(利用这一特性,可以看做JAVAScript的方法是自己给自己实现方法的重载)

22、函数声明与函数表达式的区别:
function sum(num1,num2){ } 这是函数声明,解析器会率先读取函数声明,时期可以在执行任何代码前可用,就算你在此行代码之前调用 sum(1,2) ,这是可以的
var sum = function(num1,num2){ };这是函数表达式,只有当解析器读取到这一行之后,才能调用函数sum(1,2);

23、javaScript函数可以作为另一个函数的参数进行传递(这个JAVA的方法参数设置有何不同?)
(1)在JAVA中函数接收的只能是变量,(包括基本数据类型变量、和引用数据类型变量)这一点和javaScript一样
(2)但是关键就在于javaScript的函数名就是一个变量,因此把函数名传进另一个方法里面,我们就可以直接在方法里面根据函数名来执行传进来的函数,
(3)这在JAVA的方法里面是不可想象的,因为JAVA里面变量就是变量,引用型变量你也只能调用对应对象的方法和属性,而不是直接将变量运行一下
因为函数名是一个变量,而函数的参数接收的就是变量(基本数据类型、引用数据类型),所以就可以把引用数据类型的函数名当做参数传递给函数

24、作为值的函数:(javaScript支持在函数内部创建函数,这和JAVA完全不同)
例如:当有一个数组包括两个person对象,我们想要将对象进行排序,但是我们希望根据person对象的某种属性来排序,我们需要接受一个参数来指定按照那个属性来排序,
要解决这个问题,可以定义一个函数,接受一个属性名,然后根据属性名来创建一个比较函数,然后返回这个函数的比较结果,再把这个返回的结果作为数组的sort()方法的参数,于是就可以定制数组的排序了,这就是在函数里面定义函数,并且将函数外部函数的返回值。

25、函数内部属性:
在函数内部有两个特殊对象:arguments 和this
arguments可代指函数的参数数组,但其还有一个属性callee指向拥有arguments对象的函数本身,(为什么有这个属性?)(就是要避免函数的执行体和函数名偶合在一起)
因为我们可能会在函数内部调用函数本身(递归),但是在javaScript中函数名仅仅只是一个变量(一个纸箱此方法对象的变量),所以方法体不能涉及到方法名,这样可以避免我们在将此方法的引用赋值给另一个变量的时候,产生方法调用报错的问题
this和JAVA中的this的含义一样,都是指向调用此方法的对象,javaScript中的方法可以通过不同的函数名变量来调用,(也就是说javaScript中的调用同一个函数的方式不仅仅只有一种,可能有无数个变量指向一个相同的函数,那就可以有无数种方式来调用同一个函数)

26、javaScript对象的方法调用
javaScript里面的对象可以存储引用型变量,因此当然也可以将一个函数名(引用型变量保存为对象的属性值,然后javaScript又支持直接使用引用型变量名加上圆括号()来调用方法,于是相当于间接地使对象拥有了方法)

27、、javaScript的作用域:
javaScript的作用域只有两种一种是全局作用域(当此处变量和局部变量冲突的时候,需要使用window标示访问),一种是方法内部的局部作用域重点内容
JAVAScript没有块级作用域,例如:if()语句和for()语句,在有块级作用域的语言里面在这两个语句里面定义的变量会在语句结束的时候被销毁(也就是无法访问到),但是javaScript里面不会,我们仍可以在语句结束之后再次访问到定义的变量。因为javaScript会将在这两种语句里面定义的变量自动添加到循环外部的作用域里面

28、基本包装类型:Number、Boolean、String
这些包装类目的其实和JAVA里面定义出八种基本数据类型的包装类的目的一样,都是为了将基本 数据类型封装成对象之后就可以直接调用一些,对象里面的方法和属性,方便我们的操作,而且为了更方便我们的使用,系统会自动进行装箱和拆箱的操作
但是不建议直接实例化基本数据类型,原因是当我们使用typeof操作符的时候,得到的会是一个object,而不会是基本数据类型的标志,而且

29、javaScript的单体内置对象
单体内置对象值的是有javaScript实现提供的不需要开发人员显示实例化的内置对象,我们可以直接调用对象的方法,例如:Math对象,我们就可以直接调用Math.floor()方法

30、Global对象(也是各个浏览器的window对象)
global对象可以说是JavaScript里面最特别的一个对象,它代表了全局对象,实际上所有在全局作用域里面定义的变量和方法都是Global对象的属性和方法
evel()方法 : evel()方法第javaScript语言中最强大的一个方法,就像是一个完整的JavaScript解析器,他只接受一个参数:就是需要执行的javaScript字符串。

32、如果你在同一个作用域里面声明了两个相同名字的函数,那么后声明的函数会覆盖先声明的函数,也就是说先声明的函数会不存在,当你调用的时候,会显示undefined;
33、javaScript中 == 号在比较两个引用型变量是否相等的时候,比较的是两个变量是否引用的同一个对象,是则true、不是则false

34、JavaScript中数组是对象
JavaScript中,可以这样定义一个数组。
var arr = [ ‘one’, ‘two’, ‘three’ ];
乍一看,似乎没有键值对,但是,JavaScript会把上面的代码转化成下面这样:
var arr = { ‘0’:’one’, ‘1’:’two’, ‘2’:’three’ } ;
由此我们知道,数组属于对象确定无疑!!
在JavaScript中,数组是对象吗?

显然按照第一种写法更加简洁直观,你可以认为它是定义数组的语法糖。
现在,我们来访问数组中的元素。按照前面学习的对象知识,似乎应该这样访问数组元素:
arr.0 , arr.1, arr.2

实际情况是,这是不允许的!为什么呢?

因为JavaScript规定只有属性字符串符合JavaScript的标识符命名规范时,才能用圆点语法(object.prop)访问对象的属性。而在上面的数组中,属性字符串是’0’,’1’,’2’,它们都是以数字开头的字符串,不符合标识符命名规范,所以我们不能用圆点语法访问数组中的元素。

那怎么访问?用基本的访问对象属性的方法,如下:

arr[‘0’], arr[‘1’], arr[‘2’]

鉴于数组使用的频率实在太高,让用户每次访问数组元素都要写单引号,太繁琐,JavaScript对数组对象做了专门的优化,可以让你省去单引号,直接这样写:
arr[0], arr[1], arr[2]

优化的原理非常简单,在背后,JavaScript会自动将中括号中的东西两侧加上单引号。
但是这样就会带来一个非常微妙的问题,假如我们这样写:
arr[01]
那么,JavaScript就会把它转化成这样:
arr[‘01’]
很显然,对象 arr 中没有’01’这个属性,因为字符串’1’和’01’是不相等的,为避免这样的错误,JavaScript就禁止了在访问数组时输入开头为0的数字,它会报出 Invalid Number错误,提示你修改。

另外,JavaScript数组对象有一个length属性,非常迷惑人,请看下面的代码:
var arr = [‘one’, ,’three’];
在这个数组中,只有我们只初始化了两个元素,第二个元素我们留空了,在java中,这是不允许的,也就是说,你不能在java中这样初始化数组:
int [] arr = {1,,2}//这样写会报错的。JavaScript会把上面的代码转化成这样:
var arr = {‘0’:’one’,’1’:undefined,’2’:’three’};
如果测试 arr[1] == undefined,你会得到结果true。
arr.length的值仍然是3。严格来说,arr.length的值等于最后一个元素的index再加上1。

0 0