JavaScript复习

主流浏览器                            内核    

IE                                          trident

Chrome                                 webkit/blink

firefox                                        Gecko

Opera                                      presto  

Safari                                        webkit

如何引用js?

·页面内嵌<script></script>标签

·外部引入<script scr="location"></script>

为负荷web标准(w3c标准中的一项)结构、样式、行为相分离,通常会采用外部引入。

当外部引入和页面内嵌同时使用时,只显示外部引用

变量(variable):

    变量声明、赋值分解

    单一var

命名规则

1、变量名必须以英文字母、_、$开头

2、变量名可以不包括英文字母、_、$、数字

3、不可以用系统的关键字、保留字作为变量名

值类型——数据类型

1、不可改变的原始值  栈数据 (存放位置stack 栈)

Number String Boolean undefined null

2、引用值  堆数据(存放位置 heap 堆)

array Object function ... data RegExp

js语句基本规则

    ·语句后面要用分号结束  ";"  

    ·js语法错误会引发后续代码终止,但不会影响其他js代码块

    ·书写格式要规范," = + / - ” 两边都应该有空格

运算操作符

"+"

    1、数学运算、字符串链接

    2、任何数据类型字符串都等于字符串

优先级“=”最弱,“()”优先级较高

比较运算符

    ">"  "<"  "=="  ">="  "<="  "!="

·    比较的的结果为boolean值

逻辑运算符

  "&&":    与运算依次往后比较,遇到false 直接把false的值返回 

 "||":    或运算,依次往后比较,遇到true 返回值 

    "!"  :    非运算 把值转换为boolean类型再取反进行输出

        ·被认为false的值:

undefined    null    NaN    ""    0    false

条件语句

    ·if、if else if 

    ·for

    ·while,do while

    ·switch case

    ·break

    ·continue 

引用值

    ·数组

    ·对象

类型转换

typeof(类名)// typeof 类名           l检查该类所属的字符类型俩种写法

      ·显示类型转换

        Number(mix)    转换为数字类型,不能转为数字一律转换为NaN

        parseInt(string,radix) 侧重点在于把整型,把该类化为整数 不会考虑false true等。其中radix作为基底,会叭处理的数以radix的基底所代表的进制算法进行转化

        parseFloat(String)  转换为浮点数类型

        toString(radix)  使用方法为 类名.toString()转换为String类型 其中undefin、null不能用,其中radix是以数据为原型转换为radix类型的数值

        String(mix)  转化为字符串类型

        Boolean()   转化为布尔值

    ·隐试类型转换

        isNaN()         实现方法 内部调用Number()去判断所得的值是否为NaN进行进一步操作

        ++\--   +\-          实现方法 内部调用Number()后进行运算,如果类型是字符串,会输出NaN但是属性已经变成数字类型

+  字符串连接会强制吧后边的类型转化为字符串型        

             -*/%   && || !   <  >   <=  >+   ==    !=    以上字符串都需要调用Number()进行转化后进行比较

    ·不发生类型转化

        ·===  绝对等于

        !== ·绝对不等于

函数表达式

1、命名函数表达式

var test = function abc() {

}

2、匿名函数表达式   ---  函数表达式

var test = function() {

}

组成形式

    ·函数名称

    ·参数

        形参

        实参 

            当形参<=实参时,俩个会有映射关系,同时发生变化

            当形参>=实参时,在<实参的部分会有映射关系、其余大于部分不做考虑

        返回值

作用域初探

    作用域定义:变量(运行期上下文)和函数生效(能被访问)的区域

    全局变量、局部变量

    作用域的访问顺序  里面可以访问到外面,外面的访问不到了里面,越里层访问的权限越大


js运行三部曲

    ·语法分析

        浏览全部代码,看看有没有特别明显的语法错误,比如 使用中文字符等等

    ·预编译

            ·函数声明整体提升

            ·变量 声明提升

    ·解释执行

预编译前奏

    1、imply global 暗示全局变量:即使任何变量,如果变量未经声明就赋值,此变量就为全局对象所有       就可以使用 window.  调用出来

    2、一切声明的全局变量,全是window的属性

        预编译发生在函数执行的前一刻

预编译四部曲

    1、生成AO对象

    2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined

    3、形参和实参的值相统一

    4、在函数体里面找函数声明,值赋予函数体

闭包

    当内部函数保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏。

闭包的作用

    ·实现公有变量

    ·可以做缓存(存储结构)

    ·可以实现分装,属性私有化

    ·模块化开发,防止污染全局变量

立即执行函数:

        ·定义:此类函数没有声明,在一次执行后即释放。适合做初始化工作。

                写法1、(function (){}())

                写法2、(function(){})()

              ··只有表达式才能被执行符号执行

复习:

使用function test(){}     这种方法创建的函数称为函数声明

使用var test = function(){}   这种方式建立的称为函数表达式

作用域精解    

        ·运行期上下文:当函数执行时,会创建一个人称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时执行的执行上下文都是独一无二的,所以多次调用一个函数会导致建立多个执行上下文,函数每次执行时。都会把新生成的执行上下文,填充到作用域链的最顶端。当执行完毕,它所产生的执行上下文被销毁。

        ·查找变量:从作用域链的顶端依次向下查找


面试题积累:

使用原生js,addEventListener,给每个li绑定一个click事件,并且输出他们的顺序

<ul>

<li>a</li>

<li>a<li>

<li>a<li>

<li>a<li>

</ul>

简答方法  :使用闭包以及立即执行函数的特性,在每次执行for循环时,产生的 全新的AO进行操作

<script>

function test() {

            var liCollection = document.getElenmentsByTagName('li');  

for(var i=0;i<liCollection .length;i++){

    (function(j){

            liCollection[j].onclick = function() {

            console.log(j);

                        }

                }(i))

        }

}

test();

</script>

对象

1、用你已经学习的知识点,描述下你心中的对象

对象是一个具有自己独立属性的容器

2、属性的增、删、改、查

3、对象的创建方法

        ·字面量

var obj = new object{}

        ·构造函数

            ·系统自带

            ·自定义

为了与方法函数构造区分,对象构造使用大驼峰构造方法,只要是单词,每个单词首字母都需要大写

    例:   function Obj(){

            this.name:"赋值"    在这种方法构造的对象中,应该使用this.来进行赋值

       }

var Obj1 = new Obj{}


构造函数内部原理

    ·1、在函数体最前面隐式的加上this={}

    ·2、执行this.xxx = xxx;

    ·3、隐式的返回this

包装类

new String();

new boolean();

new Number();


原型

    ·1、定义:原型function对象是一个属性,他定义了构造函数制造出的对象的公有祖先。通过构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。

    ·2、利用原型的特点和概念,可以提取公有属性。

原型链:

    ·如何形成原型链?类似像继承一样。

每个子类的实例对象都包含一个内部属性 _proto_ 属性,该属性包含一个指针,指向父类的prototype,即原型对象。若父类的原型对象的 _proto_ 属性再指向上层函数,即爷爷类的prototype,层层往上,就成了原型链。

    ·原型链上的属性的增删改查

改变this指向

call需要把实参按照形参的个数传进去


call的使用方法

apply需要穿一个arguments  实参列表


apply使用方法


圣杯模式(有残余问题,没有完全理解)//3.28号已解决

function inherit(Target, Origin){

        //    先创建一个中间件来接收父极的proterype

    function F() {}    

    //    让F的proertype指向父集

        F.protertype = Origin.protertype

    //    new一个F 产生一个带有新的父集且与父集没有链式关系的protertype

        Target.protertype = new F();

    //    更改子集中protertype的原型指向为自身

        Target.protertype.constuctor = Target; 

    //    可以写可不写,查询你真正继承的父集

        Target.protertype.uber = Origin.protertype;

}

命名空间

管理变量,防止污染全局,适用于模块化开发

对象的枚举

for in

        1、hasOwnPreoperty

        2、in

        3、instacnceof

    A   instanceof   B

A对象 是不是 B构造函数造出来的

看A对象的原型链上 有没有 B原型

克隆

深度克隆 


数组常用方法

    ·改变原数组

push:向数组后一位添加一位

pop:删除数组最后一位

unshift:在数组前面添加一位

shift:在数组前面删除一位

try catch用法

try {

}catch(e){

}

   1、 当try里面的发生错误,不会执行错误后的try里面的代码

    2、会直接执行catch里的代码,其中catch(e) e就是系统把error.message  +  error.name 封装好传给e,以供后续的使用

    3、当catch里面的执行完后,再执行后面的代码


Error.name的六种值对于的信息:

1、EvalError: eval()的使用与定义不一致

2、RangeError:数值越界

3、ReferenceError:非法或不能识别的引用数组

4、SyntaxError:发生语法解析错误

5、TypeError:操作数类型错误

6、URIError:URI处理函数使用不当


ES5严格模式

"use strict";    //在页面的最顶端添加,表示启动es5.0的语法


es5中with的使用

不在兼容es3的一些不规范语法,使用全新的es5规范

俩种用法:

    ·全局严格模式

    ·局部函数内严格模式

为什么使用字符串:原因时,可以向下兼容,就算你的浏览器不支持es5,也不会产生错误

特殊语法:不支持with,arguments.callee,func.caller.

    变量赋值提前必须声明

    局部this必须被赋值,赋值什么就算什么

    拒绝重复属性和参数


DOM——>Document Object Model

Dom:定义了表示和修改文档所需的方法。DOM对象几位宿主对象,由浏览器厂商定义,用来操作html和xml功能的一类对象的集合。也有人称DOM是对HTML以及XML的标准编程接口。


查看元素节点:

    document:代表整个文档

    document.getElementById(''):通过id选择元素

    document.getElementsByTagName(''):通过标签名选择元素

    document.getElementsByClassName(''):通过classname选择元素

    document.querySelector(): css选择器

    document.querySelectorAll(): css选择器

遍历节点树:

    parentNode:父标签

    childNodes:子节点们

    firstChild: 第一个子节点

    lastChild: 最后一个子节点

    nextSibling:后一个兄弟节点

    previousSibling:前一个兄弟节点

基于元素节点树的遍历

    parentElement: 返回当前元素的父元素

    children:只返回当前元素的元素子节点

    firstElementChild:返回的是第一个元素节点

    lastElementChild:返回的是最后一个元素节点

    nextElementSibl/previousElementSibling:返回后一个/前一个兄弟元素


    节点的四个属性:

    nodeName:元素的标签名,以大写形式表示,只读

    nodeValue: Text节点或者comment节点的文本内容可读写

    nodeType:该节点的类型,只读

    attributes:element节点的属性集合

        节点的一个方法

            Node.hasChildNodes() : 他有没有子节点


DOM结构树

        图中为一系列继承关系

    1、getElementById方法定义在Document.protetype上,Element节点上不能使用

    2、getElementByName方法定义在HTMLDocument.protetype上,即非html中的document不能使用

    3、getElementByTagName方法定义在Document.protetype和Element.protetype上

    4、HTMLDocument.prototype定义了一些常用的属性,body和head分别指代html文档中的<body><head>标签

    5、Document.prototype上定义了documentElement属性,指代文档的根元素,html文档中,他总是指代<html>元素

    document.createElement(): 创造元素节点

    document.creatTextNode():创建文本节点

    document.createComment():创建注释节点

    document.createDocumentFragment(): 创建节点碎片

    PARENTNODE.appendChild():任何一个元素节点都有这个appendChild,相当于push

    PARENTNODE.insertBefore(a,b):把a节点插在b节点之前

    parent.removeChild();  父节点删除子节点

    child.removue();    子节点自己进行删除

替换

    parent.replaceChild(new,origin):    

DOM基本属性

Element节点的一些属性

    innerHTML:获取其中html,并且可以直接覆盖式的修改

    innerText(火狐不兼容)/textContent(老版本IE不支持)

Element节点的一些方法

    ele.setAttribute():给该节点身上添加一些元素

    ele.getAttribute():获取该元素身上的一些元素

日期对象

日期对象是系统提供好的

    看w3c的api

JS定时器

setInterval(): 每个setInterval都有一个唯一标识,可以通过这个唯一标识,对这个定时器进行消除

var timer = setInterval(function () {    //创建一个定时器

    if(i++ < 10){

        clearInterval(timer);      //清除这个 setinterval

    }

},1000)    //没1000毫秒执行一圈

setTimeout():推迟一段时间再运行  同样的也有clearTimeout()方法

    这些方法都是全局对象window上的方法,内部函数this指向window

注意:

setInterval("console.log("引号中的代码会以js的形式进行执行")",1000);

这种写发,逗号前的引号会以js代码的格式进行执行

DOM操作css

dom.style.prop  //可读可写,写在行间距里面的样式

    注意:

            1、碰到类似background-color类似的属性名需要改写为小驼峰式命名方法backgroundColor

            2、遇到float类似的系统保留字,需要改写为cssFloat。

查询计算样式:

    window.getComputedStylr(elem, null)   //获取到当前显示的elem所有的样式

    window.getComputeStyle(elem, null)["所查询的属性"]   

事件

如何绑定事件处理函数

    1、ele.onxxx = function (event){}

    ·兼容性好,但是一个元素的同一个事件上只能绑定一个处理函数

    2、obj.addEventListener(type, function, false);

    ·IE9以下不兼容,可以为一个事件绑定多个处理程序

    3、obj.attachEvent('on' + type, function)

    IE独有,一个事件同样可以绑定多个处理函数

减除事件处理程序

    1、ele.onclick = false/ '' / null

    2、ele.removeEventListener(type, function, false)  //若绑定匿名函数,则无法减除

    3、ele.detachEvent('on' + type, function)    //若绑定匿名函数,则无法解除

事件处理模型——事件冒泡、捕获

    事件冒泡:

        结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)

    事件捕获:

        结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自顶向下)

        ~触发顺序:先捕获,后冒泡

focus,blur,change,submit,reset,select等事件不冒泡

取消冒泡

    ·W3C标准: event.stopPropagation()

    ·IE独有 event.cancelBubble = true;

组织默认事件:

默认事件——表单提交,a标签跳转、右键菜单等

    1、return false; 以对象属性的方式注册的事件才生效

    2、event.preventDefault(); W3C标准,IE9以下不兼容

    3、event.returnValue = false;兼容id

事件对象

event || window.event 用于IE

事件源对象兼容写法:

事件委托

利用事件冒泡和事件源对象进行处理

优点:    1、性能 不需要循环所有的元素,一个个绑定事件

                2、灵活 当有欣的子元素时,不需要重新绑定事件

鼠标事件

click、mousedown、mousemove、mouseup、contextmenu(右键呼出菜单)、mouseover(鼠标覆盖)、mouseout(鼠标离开)、mouseenter(鼠标覆盖)、mouseleave(鼠标离开)

用button来区分鼠标的按键  (左键:0 ,右键: 2 滚轮为1)

DOM3标准规定:onclick事件只能监听左键,只能通过mousedown和mouseuo来判断鼠标键

如何解决mousedow和click事件: 可以设置俩个时间戳,通过对俩个时间的判断可以得出是拖拽还是点击事件

键盘事件

keydown keyup keypress

keydown > keypress > keyup

    keydown可以响应任意键盘按键,keypress只可以响应字符类按键

文本操作事件

oninput(文本框里的内容每次输入时都会触发)、focus、blur、change(会对比获得焦点和失去焦点时的文本内容,发生改变时触发)

JSON

JSON时一种传输数据的格式(以对象为样板,本质上就是对象,但用途有区别,对象就是本地用的,json时用来传输的)

JSON.parse();  把String样式的数据,转换为JSON形式

JSON.tringify(); 把json类型数据转换为string

异步加载js

js加载缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。并且有些工具方法需要按需加载,用到在加载,不用不加载。

javascript异步加载的三种方案:

    1、defer 异步加载,但要等到dom文档全部解析完才会被执行。只有IE能用,也可以将代码写到内部。

    2、async 异步加载,加载完就执行,async只能加载外部脚本,不能把js写在script标签里(执行时不阻塞页面)

    3、创建script。插入到DOM中,加载完毕后callback;


JS加载时间线

    正则表达式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容