JavaScript简介
JavaScript一种式,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的被称为JavaScript引擎,为的一部分,广泛用于的脚本语言,最早是在(下的一个应用)网页上使用,用来给网页增加动态功能。
1.基本特点
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
1.是一种解释性脚本语言(代码不进行预编译)。2.主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。3.可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。4.跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。 Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。2.日常用途
嵌入动态文本于HTML页面
对浏览器事件做出响应 读写HTML元素 在数据被提交到服务器之前验证数据 检测访客的浏览器信息控制cookies,包括创建和修改等 基于Node.js技术进行服务器端编程3.基本特点
(1)脚本语言 JavaScript是一种解释型的脚本语言,C、C++等语言先编译后执行,而JavaScript是在程序的运行过程中逐行进行解释。
(2)基于对象 JavaScript是一种基于对象的脚本语言,它不仅可以创建对象,也能使用现有的对象。(3)简单 JavaScript语言中采用的是弱类型的变量类型,对使用的数据类型未做出严格的要求,是基于Java基本语句和控制的脚本语言,其设计简单紧凑。(4)动态性 JavaScript是一种采用事件驱动的脚本语言,它不需要经过Web服务器就可以对用户的输入做出响应。在访问一个网页时,鼠标在网页中进行鼠标点击或上下移、窗口移动等操作JavaScript都可直接对这些事件给出相应的响应。(5)跨平台性 JavaScript脚本语言不依赖于操作系统,仅需要浏览器的支持。因此一个JavaScript脚本在编写后可以带到任意机器上使用,前提上机器上的浏览器支 持JavaScript脚本语言,目前JavaScript已被大多数的浏览器所支持。不同于服务器端脚本语言,例如PHP与ASP,JavaScript主要被作为客户端脚本语言在用户的浏览器上运行,不需要服务器的支持。所以在早期程序员比较青睐于JavaScript以减少对服务器的负担,而与此同时也带来另一个问题:安全性。而随着服务器的强壮,虽然程序员更喜欢运行于服务端的脚本以保证安全,但JavaScript仍然以其跨平台、容易上手等优势大行其道。同时,有些特殊功能(如AJAX)必须依赖Javascript在客户端进行支持。随着引擎如V8和框架如Node.js的发展,及其事件驱动及异步IO等特性,JavaScript逐渐被用来编写服务器端程序。JavaScript的存在形式和存放位置
1.JavaScript的存在形式
js的两种存在形式
2.JavaScript的存放位置
- HTML的head中
- HTML的body代码块底部(推荐)
由于HTML代码是从上向下执行,如果head中的js代码耗时严重,就会导致用户长时间无法看到页面,如果放置在body代码块底部,那么即使JS代码耗时严重,也不会影响用户看到页面效果,只是js实现特效慢而已。
JavaScript变量
JavaScript中变量的声明是一个非常容易出现错误的点,局部变量必须以var开头,如果未使用var,则默认表示声明的是全局变量。
js变量的定义
JavaScript中代码的注释:
单行注释://多行注释:/* */说明:此注释仅在script中生效
数据类型
JavaScript 中的数据类型分为原始类型和对象类型:
- 原始类型
- 数字
- 字符串
- 布尔值
- 对象类型
- 数组
- “字典”
- ...
特别的,数字、布尔值、null、undefined、字符串是不可变。
null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。undefined是一个特殊值,表示变量未定义
1、数字(Number)
JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值表示。
转换:
- parseInt(..) 将某值转换成数字,不成功则NaN
- parseFloat(..) 将某值转换成浮点数,不成功则NaN
特殊值:
- NaN,非数字。可使用 isNaN(num) 来判断。
- Infinity,无穷大。可使用 isFinite(num) 来判断。
更多的数值运算
常量Math.E常量e,自然对数的底数。Math.LN1010的自然对数。Math.LN22的自然对数。Math.LOG10E以10为底的e的对数。Math.LOG2E以2为底的e的对数。Math.PI常量figs/U03C0.gif。Math.SQRT1_22的平方根除以1。Math.SQRT22的平方根。静态函数Math.abs( )计算绝对值。Math.acos( )计算反余弦值。Math.asin( )计算反正弦值。Math.atan( )计算反正切值。Math.atan2( )计算从X轴到一个点的角度。Math.ceil( )对一个数上舍入。Math.cos( )计算余弦值。Math.exp( )计算e的指数。Math.floor( )对一个数下舍人。Math.log( )计算自然对数。Math.max( )返回两个数中较大的一个。Math.min( )返回两个数中较小的一个。Math.pow( )计算xy。Math.random( )计算一个随机数。Math.round( )舍入为最接近的整数。Math.sin( )计算正弦值。Math.sqrt( )计算平方根。Math.tan( )计算正切值。
2、字符串(String)
字符串是由字符组成的数组,但在JavaScript中字符串是不可变的:可以访问字符串任意位置的文本,但是JavaScript并未提供修改已知字符串内容的方法。
常见功能:
obj.length 长度 obj.trim() 移除空白obj.trimLeft()obj.trimRight)obj.charAt(n) 返回字符串中的第n个字符obj.concat(value, ...) 拼接obj.indexOf(substring,start) 子序列位置obj.lastIndexOf(substring,start) 子序列位置obj.substring(from, to) 根据索引获取子序列obj.slice(start, end) 切片obj.toLowerCase() 大写obj.toUpperCase() 小写obj.split(delimiter, limit) 分割obj.search(regexp) 从头开始匹配,返回匹配成功的第一个位置(g无效)obj.match(regexp) 全局搜索,如果正则中有g表示找到全部,否则只找到第一个。obj.replace(regexp, replacement) 替换,正则中有g则替换所有,否则只替换第一个匹配项, $数字:匹配的第n个组内容; $&:当前匹配的内容; $`:位于匹配子串左侧的文本; $':位于匹配子串右侧的文本 $$:直接量$符号
3、布尔类型(Boolean)
布尔类型仅包含真假,与Python不同的是其首字母小写。
- == 比较值相等
- != 不等于
- === 比较值和类型相等
- !=== 不等于
- || 或
- && 且
4、数组
JavaScript中的数组类似于Python中的列表
常见功能:
obj.length 数组的大小 obj.push(ele) 尾部追加元素obj.pop() 尾部获取一个元素obj.unshift(ele) 头部插入元素obj.shift() 头部移除元素obj.splice(start, deleteCount, value, ...) 插入、删除或替换数组的元素 obj.splice(n,0,val) 指定位置插入元素 obj.splice(n,1,val) 指定位置替换元素 obj.splice(n,1) 指定位置删除元素obj.slice( ) 切片obj.reverse( ) 反转obj.join(sep) 将数组元素连接起来以构建一个字符串obj.concat(val,..) 连接数组obj.sort( ) 对数组元素进行排序
其他
1、序列化
- JSON.stringify(obj) 序列化
- JSON.parse(str) 反序列化
2、转义
- decodeURI( ) URl中未转义的字符
- decodeURIComponent( ) URI组件中的未转义字符
- encodeURI( ) URI中的转义字符
- encodeURIComponent( ) 转义URI组件中的字符
- escape( ) 对字符串转义
- unescape( ) 给转义字符串解码
- URIError 由URl的编码和解码方法抛出
3、eval
JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值。
- eval()
- EvalError 执行字符串中的JavaScript代码
4、正则表达式
JavaScript中支持正则表达式,其主要提供了两个功能:
- test(string) 用于检测正则是否匹配
- exec(string) 用于获取正则匹配的内容
注:定义正则表达式时,“g”、“i”、“m”分别表示全局匹配,忽略大小写、多行匹配。
5、时间处理
JavaScript中提供了时间相关的操作,时间操作中分为两种时间:
- 时间统一时间
- 本地时间(东8区)
更多操作参见:http://www.shouce.ren/api/javascript/main.html
语句和异常
JavaScript中支持两个中条件语句,分别是:if 和 switch
if(条件){ }else if(条件){ }else{ }
switch(name){ case '1': name = xiaoming; break; case '2': name = xiaoxiang; break; default : name = yuemei; }
2、循环语句
JavaScript支持三种循环语句,分别是:
第一种:
var names = ["xiaoming", "xiaoxiang", "yuemei"]; for(var i=0;i
第二种:
var names = ["xiaoming", "xiaoxiang", "yuemei"];for(var index in names){ console.log(index); console.log(names[index]);}
第三种:
while(条件){ // break; // continue;}
3、异常处理
try { //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行}catch (e) { // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。 //e是一个局部变量,用来指向Error对象或者其他抛出的对象}finally { //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。}
注:主动跑出异常 throw Error('xxxx')
函数
1、基本函数
JavaScript中函数基本上可以分为一下三类:
// 普通函数 function func(arg){ return true; } // 匿名函数 var func = function(arg){ return "xiaoming"; } // 自执行函数 (function(arg){ console.log(arg); })('123')
注意:对于JavaScript中函数参数,实际参数的个数可能小于形式参数的个数,函数内的特殊值arguments中封装了所有实际参数。
2.作用域
JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住5句话
“JavaScript中无块级作用域”
在JAVA或C#中存在块级作用域,即:大括号也是一个作用域
public static void main (){ if(1==1){ String name = "seven"; } System.out.println(name);}// 报错
public static void Main(){ if(1==1){ string name = "seven"; } Console.WriteLine(name);}// 报错
在JavaScript语言中无块级作用域
function fun1(){ if(1==1){ var name = 'xiaoming'; } console.log(name);}// 输出: xiaoming
补充:标题之所以添加双引号是因为JavaScript6中新引入了 let 关键字,用于指定变量属于块级作用域
JavaScript采用函数作用域
在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量
function fun1(){ var innerValue = 'xiaoliang';} fun1(); console.log(innerValue); // 报错:Uncaught ReferenceError: innerValue is not defined
JavaScript的作用域链
由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。
xo = 'alex'; function Func(){ var xo = "seven"; function inner(){ var xo = 'alvin'; console.log(xo); } inner();}Func();
如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例:
当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。
JavaScript的作用域链执行前已创建
JavaScript的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。
示例一:
xo = 'alex'; function Func(){ var xo = "seven"; function inner(){ console.log(xo); } return inner;} var ret = Func();ret();// 输出结果: seven
上述代码,在函数被调用之前作用域链已经存在:
- 全局作用域 -> Func函数作用域 -> inner函数作用域
当执行【ret();】时,由于其代指的是inner函数,此函数的作用域链在执行之前已经被定义为:全局作用域 -> Func函数作用域 -> inner函数作用域,所以,在执行【ret();】时,会根据已经存在的作用域链去寻找变量。
示例二:
xo = 'alex'; function Func(){ var xo = "eirc"; function inner(){ console.log(xo); } xo = 'seven'; return inner;} var ret = Func();ret();// 输出结果: seven
上述代码和示例一的目的相同,也是强调在函数被调用之前作用域链已经存在:
- 全局作用域 -> Func函数作用域 -> inner函数作用域
不同的时,在执行【var ret = Func();】时,Func作用域中的xo变量的值已经由 “eric” 被重置为 “seven”,所以之后再执行【ret();】时,就只能找到“seven”。
示例三:
xo = 'alex';function Bar(){ console.log(xo);} function Func(){ var xo = "seven"; return Bar;} var ret = Func();ret();// 输出结果: alex
上述代码,在函数被执行之前已经创建了两条作用域链:
- 全局作用域 -> Bar函数作用域
- 全局作用域 -> Func函数作用域
当执行【ret();】时,ret代指的Bar函数,而Bar函数的作用域链已经存在:全局作用域 -> Bar函数作用域,所以,执行时会根据已经存在的作用域链去寻找。
声明提前
在JavaScript中如果不创建变量,直接去使用,则报错:
console.log(xxoo);// 报错:Uncaught ReferenceError: xxoo is not defined
JavaScript中如果创建值而不赋值,则该值为 undefined,如:
var xxoo;console.log(xxoo);// 输出:undefined
在函数内如果这么写:
function Foo(){ console.log(xo); var xo = 'seven';} Foo();// 输出:undefined
上述代码,不报错而是输出 undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在“预编译”时,已经执行了var xo;所以上述代码中输出的是undefined。
参考文章:http://www.cnblogs.com/wupeiqi/p/5649402.html