js学习笔记

目录

简介

输出语句

JS编写位置

基本语法

字面量和变量

标识符this

this的用法

构造方法

构造函数的修改

原型(prototype)

toString方法

垃圾回收(GC)

编码问题

指定数组排序规则

函数对象的方法

call(),apply()

argument

DATA对象

包装类

正则表达式

正则语法

正则表达式语法

dom查询的其他方法

获取body标签

根据class属性值查询

dom的增删改


简介

  1. 以前主要用于网页中的前端验证,就是检查用户输入的内容是否符合一定的规则,现在不局限于此。

  2. 遵循ES标准,但不同浏览器对该标准的实现不同。

  3. JS包含了ES、DOM(如何通过JS去操控网页)、BOM(如何通过JS去操控浏览器)

  4. 是一种解释性语言,也就是不用编译,直接就可以运行。还是一种面向对象的语言。

  5. 所有的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也可以完成,如:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值