javascript是一门编程语言,浏览器内置了javascript语言的解释器,所以在浏览器上按照javascript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理。
一、基本知识
(一)、存在形式
1、javascript代码存在形式
text/javascript src=js文件>
2、javascript存放位置
html的head中
html的body代码块底部(推荐)
由于html代码是从上到下执行,如果head中的js代码耗时严重,就会导致用户长时间无法看到页面,如果放置在body代码块底部(执行完body代码后再执行javascript代码),那么即使js代码耗时严重,也不会影响用户看到页面效果,只是js实现特效慢而已。
例子
(二)、变量
javascript中变量的声明是一个非常容易出错的点,局部变量必须一个 var 开头,如果未使用var,则默认表示声明的是全局变量
全局变量(对所有javascript都有作用) name = 'seven'; function func(){ // 局部变量(只对当前有作用) var age = 18; // 全局变量 gender = 男; }
javascript中代码注释:
单行 //多行 /* */注:此注释仅在script块中生效。
(三)、数据类型
javascript 中的数据类型分为原始类型和对象类型:
原始类型数字字符串布尔值对象类型数组“字典”...特别提醒:数字、布尔值、null、undefined、字符串的值是不可变的
null为特殊的值,表示什么都没有
undefined表示未定义
例
1、数字(number)
字符串是由字符组成的数组,但在javascript中字符串是不可变的:可以访问字符串任意位置的文本,但是javascript并未提供修改已知字符串内容的方法
转换:
parseint(..) 将某值转换成数字,不成功则nanparsefloat(..) 将某值转换成浮点数,不成功则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个组内容; $&:当前匹配的内容; $`:位于匹配子串左侧的文本; $':位于匹配子串右侧的文本 $$:直接量$符号
title欢迎宝强位临指导
例
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) 将数组元素连接起来以构建一个字符串(python是sep.join(obj))obj.concat(val,..) 连接数组obj.sort( ) 对数组元素进行排序
5、通过对象来构造字典
//构造字典 a = {'k1':123,'k2':456}//访问字典 a['k1']
(四)、其他
1、序列化
json.stringify(obj) 序列化json.parse(str) 反序列化 a= {k1: 123, k2: 456} //把对象转换成字符 b=json.stringify(a) //把字符转换成对象 b=json.parse(b)
2、转义
url的转义:
decodeuri( ) url中未转义的字符decodeuricomponent( ) uri组件中的未转义字符encodeuri( ) uri中的转义字符encodeuricomponent( ) 转义uri组件中的字符
发送值的转义:escape( ) 对字符串转义unescape( ) 给转义字符串解码
----------------------------------------------------------urierror 由url的编码和解码方法抛出
3、eval
javascript中的eval是python中eval和exec的合集,既可以编译代码也可以获取返回值。
eval() evalerror 执行字符串中的javascript代码eval(alert(123))
4、正则表达式
javascript中支持正则表达式,其主要提供了两个功能:
test(string) 用于检测正则是否匹配exec(string) 用于获取正则匹配的内容注:定义正则表达式时,“g”、“i”、“m”分别表示全局匹配,忽略大小写、多行匹配。
5、时间处理
javascript中提供了时间相关的操作,时间操作中分为两种时间:
时间统一时间本地时间(东8区)d=new date()结果:fri aug 19 2016 14:45:44 gmt+0800 (中国标准时间)//获取年d.getfullyear()//获取时d.gethoursd.getutchours()//改变时间d.setminutes(d.setminutes() + 2)
更多操作参见:http://www.shouce.ren/api/javascript/main.html
6、typeof 运算符
返回一个用来表示表达式的数据类型的字符串。
未定义:typeof(x)=undefined 如果运算数未定义,返回的就是 undefined.运算数为数字 :typeof(x) = number字符串:typeof(x) = string布尔值:typeof(x) = boolean对象,数组和null:typeof(x) = object函数:typeof(x) = function
var name typeof(name) 结构:undefined
在js里用到数组,比如 多个名字相同的input, 若是动态生成的, 提交时就需要判断其是否是数组: if( typeof(document.mylist.length) != undefined ) {}或 if( !isnan(document.mylist.length) ) {}
7、 document对象详解
(五)、条件语句及异常
1、条件语句
javascript中支持两个中条件语句,分别是:if 和 switch
if(条件){ }else if(条件){ }else{ }
if
switch(name){ case '1': age = 123; break; case '2': age = 456; break; default : age = 777; }
switch
2、循环语句
javascript中支持三种循环语句,分别是:
var names = [alex, tony, rain]; for(var i=0;i){ console.log(i); console.log(names[i]);}
方式一
var names = [alex, tony, rain];for(var index in names){ console.log(index); console.log(names[index]);}
方式二
while(条件){ // break; // continue;}
方式三
3、异常处理
try { //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行}catch (err) { // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。 //e是一个局部变量,用来指向error对象或者其他抛出的对象}finally { //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。}注:主动抛出异常 throw new error('错误信息')
例子
更多:http://www.w3school.com.cn/js/js_errors.asp
二、函数
(一)、基本函数
1、基本函数
javascript中函数基本上可以分为一下三类:
// 普通函数 function func(arg){ return true; } // 匿名函数(把函数当成一个function对象,用变量名来调用) var func = function(arg){ return tony; }
调用:func(alert(5));//结果为5 // 自执行函数(可做封装) (function(arg){ console.log(arg); })('123')
注意:对于javascript中函数参数,实际参数的个数可能小于形式参数的个数,函数内的特殊值arguments中封装了所有实际参数。
(二)、作用域
在java或c#中存在块级作用域,即:大括号就是一个作用域
在javascript语言中无块级作用域
f1() { if (1 == 1) { var name = 'server'; } console.log(name); } f1(); // 输出:server /*注:在javascript6中新引用了 let关键字,用于定义块级作用域。即: let name = 'server';*/
javascript中每个函数都有自己的作用域,当出现函数嵌套时,就出现了作用域链。当内层函数使用变量时,会根据作用域链从内到外一层层的循环,如果不存在,则异常。
切记:所有的作用域在创建函数且未执行时候就已经存在。
function f2(){ var arg= [11,22]; function f3(){ console.log(arg); } arg = [44,55]; return f3; } ret = f2(); ret();
例子
注:声明提前,在javascript引擎“预编译”时进行(js的预编译大概顺序,js引擎读取一段js代码,首先预编译,就是逐行读取js代码,寻找变量和函数,遇到全局或局部变量,把变量的值变为undefind,存在内存中,遇到函数,直接存在内存中,这个过程如果发现语法错误,预编译终止。)
作用域和作用域链详解:
点我!点我!
(三)、闭包
「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」
由于作用域链只能从内向外找,默认外部无法获取函数内部变量。闭包,在外部获取函数内部的变量。
//利用封装来闭包//a公司(function(){ var ='bibao1'; fuction f1() { console.log(var) } function f2() { console.log(var) } })();//b公司(function(){ var ='bibao2'; fuction f1() { console.log(var) } function f2() { console.log(var) } })();
(四)、面向对象
function foo (name,age) { this.name = name; this.age = age; this.func = function(arg){ return this.name + arg; }}var obj = new foo('alex', 18);var ret = obj.func(sb);console.log(ret);
对于上述代码需要注意:
foo充当的构造函数this代指对象创建对象时需要使用 new上述代码中每个对象中均保存了一个相同的func函数,从而浪费内存。使用原型和可以解决该问题.
function foo (name,age) { this.name = name; this.age = age;}foo.prototype = { getinfo: function(){ return this.name + this.age }, func : function(arg){ return this.name + arg; }}var obj= new foo(11,22)name=obj.nameobj.getinto()
