目录
简介
-
以前主要用于网页中的前端验证,就是检查用户输入的内容是否符合一定的规则,现在不局限于此。
-
遵循ES标准,但不同浏览器对该标准的实现不同。
-
JS包含了ES、DOM(如何通过JS去操控网页)、BOM(如何通过JS去操控浏览器)
-
是一种解释性语言,也就是不用编译,直接就可以运行。还是一种面向对象的语言。
-
所有的JS代码都编写在<script></script>里
输出语句
alert("这是我的第一行JS代码");控制浏览器弹出的警告框的内容
document.write("");可以向body中输出一个内容
console.log("");向控制台输出一个内容
JS编写位置
-
可以将JS代码编写到标签的onclick属性中
-
< button οnclick="alert('是我');">点一下</button>
-
这样当点击按钮时会出现弹窗
-
-
js代码可以写在超链接的href属性中
-
< a href="javascript:alert('是我')">点一下</a>
-
这样点击超链接,会执行JS代码,如果JavaScript:后为空,那么点击链接没有反应
-
-
但是写在标签的属性中,是结构和行为的耦合,不方便维护
-
可以将JS代码写在script标签里
-
可以编写在外部文件,可以在不同页面中同时使用,也可以利用到浏览器的缓存机制
-
比如建一个文件为script.js,然后通过<script src="绝对路径中"></script>引入
-
script标签一旦用于引入外部文件了,就不能再编写代码了。除非再用一个script标签用于编写代码。
-
-
JS的代码都是一行一行从上往下执行
基本语法
注释:
-
/* 多行注释,内容不会被执行,但是可以在源代码中查看*/
-
//单行注释
JS中严格区分大小写
js会自动忽略多个空格和换行
字面量和变量
字面量:不可改变的值
-
可以直接使用。alert(2234432);
-
但一般不会直接使用,一般用变量保存字面量
变量:用来保存字面量,变量的值可以任意改变
-
如何用变量
-
声明变量并赋值:使用var关键字来声明一个变量 var a=12 ;
-
标识符this
在JS中所有可以由我们自主命名的都可以称为标识符,如变量名,函数名,属性名等
但需要遵循如下规则:
-
可以含有字母,数字,_ ,$
-
不能以数字开头
-
标识符不能是ES中的关键字或保留字
-
标识符一般采用驼峰命名法
-
首字母小写,每个单词的开头字母大写,其余字母小写:helloWorld
-
JS底层保存标识符时采用的是Unicode编码
this的用法
解析器在调用函数时,每次都会向函数内部传递进一个隐含的参数即this,指向一个对象,称为函数执行的上下文对象。
根据函数的调用方式不同,this会指向不同的对象:
-
以函数的形式调用时,this永远都是window(即全局):如fun();
-
以方法的形式调用,this就是调用方法的那个对象:people1.sayName();
构造方法
1.与普通函数无异,除了一些不同:
-
普通函数是直接调用,而构造函数需要使用new关键字来调用:var per=new Person();
-
首字母习惯大小
2.构造函数的执行流程:
-
立刻创建一个新的对象
-
将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
-
逐行执行函数中的代码
-
将新建的对象作为返回值返回
3.通过同一个构造函数创建的对象,称为一类对象,也将一个构造函数称为一个类。创建的对象称为该类的实例。
4使用instanceof可以检查一个对象是不是该构造函数的实例:per instanceof Person(对象 instanceof 构造函数),若是返回true。
所有对象都是Object的后代。
构造函数的修改
实例中相同的方法在实例化过程中会创造出很多个,浪费了空间,我们可以使所有对象共享一个方法,那么将这个方法提出放在全局作用域中定义。
原型(prototype)
1.函数定义在全局作用域中,会污染了全局作用域的命名空间。那么可以向原型中添加。
2.我们创建的每一个函数,解析器都会向函数中添加一个属性prototype。这个属性对应着一个对象,这个对象就是我们所谓的原型对象。
-
如果函数作为普通函数调用prototype没有任何作用
-
当函数通过构造函数的形式调用时,所创建的对象中都会有一个隐含属性,指向该构造函数的原型对象,我们可以通过__ proto来访问该属性,如mc. proto __
3.原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象。
-
我们可以将对象中共有的内容统一设置到原型对象中。如:myClass.prototype.a=123
-
也可向原型中添加方法:MyClass.prototype.sayHello=function(){}
4.当我们访问对象的属性或方法时,会先:
-
在自己里面寻找
-
如果没有则在原型对象中寻找。
-
如果没有则去原型的原型中寻找,直到找到object对象的原型。object对象的原型没有原型,如果在这里面还没有找到则返回undefined
5.用in可以检查对象是否含有某个属性,也可检查到原型。"属性" in 对象;
还可以用对象.hasOwnPrototype(“属性”)可以只检查自身属性。
6.原型对象也是对象,自身也有原型。
toString方法
当我们在页面中打印一个对象时,事实上是输出对象的toString()方法的返回值。
如果我们希望在输出对象时不输出[object object],可以为原型添加一个toString()方法
垃圾回收(GC)
垃圾:没有任何的变量或属性对它引用,我们无法操作的对象
JS有自动的回收机制。
我们只需要将不需要的变量设置为null即可。
编码问题
想要输出Unicode编码,在script中使用转义字符\u四位编码(这是16进制的)
在body中可以使用使用&#编码;(这里的编码是10进制的)
指定数组排序规则
在sort()中添加一个回调函数来指定排序规则
浏览器会根据回调函数的返回值来决定元素的顺序:
-
返回一个大于0的值,则元素会交换位置
-
否则元素不交换位置
回调函数需要定义两个形参(如a,b),浏览器将会分别使用数组的元素作为实参去调用回调元素,使用哪个元素调用不确定,但是可以肯定的是在数组中a一定在b前面
则回调函数(number):
-
升序:a-b
-
降序:b-a
函数对象的方法
call(),apply()
call()和apply()都是函数对象的方法,需要通过函数对象来调用。当调用时都会调用函数执行。 -在调用这两个方法时,可以将一个对象指定为第一个参数,那么此时这个对象会成为函数执行的this - 那么这两个函数可以指定函数里的this - call()方法可以将实参 在对象之后依次传递:fun.call (object,2,3) - apply()需要将实参封装在一个数组里统一传递:fun.apply (object,[2,3] 那么this的情况有: - 以函数形式调用时,this永远是window - 以方法形式调用时,this是调用方法的对象 - 以构造函数的形式调用时,this是新创建的那个对象 - 使用call和apply调用时,this是指定的那个对象
argument
在调用函数时,浏览器每次都会传递进两个隐含的参数
函数的上下文对象this
封装实参的对象arguments
- arguments也是一个隐含参数
- 是一个类数组对象:可以用Array.isArray(arguments)检查arguments是不是一个数组
- 可以通过索引来操作数据,也可获取长度
- 在调用函数时,我们所传递的实参都会在arguments中保存
- arguments.length可以用来获取实参的长度
- 也可以用arguments[index]来访问保存的实参,即使不定义形参,也可以通过此方法来使用实参
arguments里面还有一个属性叫做callee
这个属性对应一个函数对象,就是当前正在指向的函数的对象
DATA对象
如果直接使用构造函数创建一个Data对象,则会封装为当前代码执行的时间 创建一个指定的时间对象:需要在构造函数中传递一个表示时间的字符串作为参数,如12/03/2016 (空格)11:10:30 其他方法:
-
getData()获取当前日期
-
getDay ()获取当前日期是星期几,会返回0到6的值,0表示周
-
getMonth()会返回一个0到11的值,0表示1月
-
getFullYear()获取当前年份
-
getHours()
-
getTime获取当前日期时间的一个时间戳。时间戳就是1/1/1970 0:0:0到当前时间所花的毫秒数
-
Data.now()获取当前的时间戳 ,可以用来求代码的运行时间
-
包装类
JS中提供了3个包装类可以将基本数据类型 转换为对象,就有了更多的功能。但包装类一般不使用
-
string()可以将基本数据对象变为string对象
-
Number( )可以将其变为Number对象
-
Boolean() . . . . . . . .
对象之间比较的是地址 对象转化成Boolean都是true 当我们对一些基本数据类型去调用属性和方法时:
-
浏览器会临时使用包装类将其转化为对象,然后再调用方法或属性
-
调用完后转化为之前的基本类型
正则表达式
计算机可以根据正则表达式,来检查一个字符串是否符合规则。或者将字符串中符合规则的内容提取出来。 规则就是检查一个字符串中是否含有正则表达式里的内容。 在构造函数中可以传递一个匹配模式作为参数: - i 忽略大小写 - g 全局匹配模式 使用时: - 创建正则表达式的对象。 - 语法:var变量=new RegExp(“正则表达式”,“匹配模式”) - 或者使用字面量来创建正则表达式: - - 语法:var 变量=/正则表达式/匹 配匹配 - 用test()来检查字符串是否符合正则表达式的规则,返回true或false 使用typeof检查正则对象,会返回object
正则语法
正则表达式语法
. 的特殊含义:查找单个字符,除了换行和行结束字符
那么我们怎么检查.呢:
-
在正则表达式中使用\转义字符,那么使用\ .
那么在正则表达式中和检验里都是使用\ \表示\
那么有如下三种情况:
-
var reg=/\ ./可以用来检查字符串里有.的
-
var reg=/./检查是否有单个字符,除了换行和行结束字符
-
reg =new RegExp("\ .")表示检查是否有单个字符等, 因为使用构造函数时,由于它的参数是一个字符串,而\是字符串中转义字符,那么使用\ \ .表示检查是否有.
还有一些\w,\W,\d,\D,\s,\S,\b,\B
当检查一个单词里是否有child,用/\bchild\b/
接受一个用户的输入:var str=prompt("请输入");
去除掉字符串所有的空格:就是用""来替换空格:str=str.replace(/\s/g,"");
去掉字符串开头的空格:str.replace(/^\s*/,"");开头全部空格
str.replace(/^\s{5}/,"");开头5个空格
str.replace(/\s*$/,"");去除结尾的所有的空格
str.replace(/^\s* |\s *$/g,"");表示去除结尾和开头的空格
-
g表示全局
-
^表示开头
-
$表示结尾
-
*表示0个或多个
-
+表示1个或多个
dom查询的其他方法
获取body标签
1.用getElementsByTagName得到的是一个数组
2.在document中有一个属性body,保存了body的引用:var body=document.body
-
document.documentElement保存的是Html根标签
-
var all=document.all=document.getElementsByTagName("*")代表的是页面中所有的函数
根据class属性值查询
1.var box1=document.getElementsByclassName("box1"),但此方法不支持IE8及以下的浏览器
2.要想支持IE8及以下的浏览器可以用:
-
document.querySelector()
-
需要一个选择器的字符串作为参数,可以根据css选择器查询一个元素结点对象,如:".id div"就是要查询id中div
-
使用该方法只会返回唯一元素,若满足条件的元素有多个,也只会返回第一个元素
-
-
document.querySelectorAll(),用法与上面类似,但是这个会将一个或多个元素封装成数组返回
dom的增删改
注:以下都是document的方法
另:不知道父元素时可以用:子节点.parentNode
1.appendChild()给一个父节点添加一个子节点,用法:父节点.appendChild(子节点)
2.removeChild()删除子节点,用法:父节点.removeChild(子节点)/子节点.parentNode.removeChild(子节点)
3.replaceChild()用新的节点替换已有子节点,语法:父节点.replaceChild(新节点,旧节点)
4.insertBefore()在子节点前插入新的子节点,用法:父节点.insertBefore(新节点,旧节点)
5.createElement()创建元素节点对象,标签名作为参数,然后可以返回该对象
6.createTextNode()创建文本节点对象,文本内容作为参数,然后可以将该节点返回
如:将“广州节点”插入到#bj前
-
先创建一个元素节点
var li=document.createElement("li")
-
创建文本节点对象var gzText=document.createTextNode("广州")
-
将gzText设置成li的子节点
li.appendChild(gzText)
-
获取city:
var city=document.getElementById("city")
-
获取id为bj的对象
var bj=document.getElementById("bj")
-
插入:
city.insertBefore(li,bj)
以上也可以用innerHTML也可以完成,如: