本篇文章给大家谈谈js教程,以及js教程电子版下载对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
JavaScript,简称JS,是一种广泛应用于网页开发的语言,其强大的功能使得网页不再只是静态的,而是变得动态、丰富和交互性强。作为一名前端开发者,掌握JavaScript是必不可少的。下面,我将为大家详细讲解JavaScript的基本语法、常用功能、高级技巧等内容,让你轻松入门JavaScript编程。
一、JavaScript基础
1. 变量与数据类型
在JavaScript中,变量用于存储数据。变量声明主要有两种方式:var、let、const。
- var:ES5中引入,变量提升,可重复声明。
- let:ES6中引入,块级作用域,不可重复声明。
- const:ES6中引入,块级作用域,声明后不可修改。
JavaScript中的数据类型包括:
- 数字(Number):整数和小数。
- 字符串(String):文本。
- 布尔值(Boolean):true或false。
- 对象(Object):包含键值对的集合。
- 数组(Array):包含多个元素的集合。
2. 运算符
JavaScript中,运算符用于执行数学或逻辑运算。常见的运算符有:
- 算术运算符:加(+)、减(-)、乘(*)、除(/)、取模(%)、自增(++)、自减(–)。
- 关系运算符:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。
- 逻辑运算符:与(&&)、或(||)、非(!)。
3. 控制流程
控制流程用于决定代码执行的顺序。JavaScript中的控制流程包括:
- 条件语句:if、else if、else。
- 循环语句:for、while、do while。
4. 函数
函数是JavaScript中执行特定任务的可重复使用的代码块。函数定义如下:
“`javascript
function 函数名(参数) {
// 函数体
}
“`
二、常用功能
1. 对象
对象是JavaScript中的核心概念之一。对象包含多个属性和方法,可以表示现实世界中的各种事物。例如:
“`javascript
var person = {
name: “
vuejs菜鸟教程
vue控制div显示隐藏菜鸟可以使用Vue的v-show指令来控制div显示隐藏:divv-show=”showOrHide”要显示或隐藏的内容/div。然后在Vue中定义一个变量,比如:data(){return{showOrHide:true}},根据你的需要来改变变量的值true或false来实现div的显示和隐藏操作。
Vue.js入门教程(三)双向绑定和数据渲染既然清楚了原理,那么,接下来进入正题——我知道了vue怎么安装,那么我怎么使用呢?
在告诉你基础用法之前,我还是要先告诉你一个情况。
可能要令你有点失望。vue主要是侧重于数据端的。他的目的就是渲染数据和在前端调整一下数据逻辑。
他不是像jquery那样让你用来做特技的。就算你要做特技。你也应该通过css3/canvas而不是dom。
所谓的双向绑定,你可以理解就是把view。(你还不清楚mvc的话,请看第一章)
和model绑定到一起。说白了,就是你js中的绑定值变了。你dom中的内容就跟着一块变了。
vue是通过解析{{文字..}}来生成内容的。后面绑定方法,输出内容的时候都会讲到。
列表输出使用v-for,这些v开头加横杠的叫做命令
这些命令是可以自定义的。但是那都属于高级操作,我们不用它也完全足够支撑做一个大型项目了。
其实你回发现,这里无论是v-for或者是v-什么其他玩意
它都深刻的遵循了es6的语法。这里不就是一个典型的forin循环吗。不过我们现在都用forof了。
你记住这个用法,它就长这样。
前后端分离开发的关键在于:后台只提供接口。
我们获得的数据多数情况下,仅仅是一个json,而mvvm的关键就再于解析数据在前端完成了。如果你了解jsp或者php你会了解,数据的解析在mvc中,
是由后端完成的,而html只负责显示。
所以,当你了解了数据绑定和渲染以后,你可以第一时间先把数据输出到页面了。
我们前端最厉害的地方不就是处理能看得见的东西吗?
Vue.js入门BootCDN(国内)
unpkg
cdnjs
Vue.js提供一个官方命令行工具,可用于快速搭建大型单页应用。
进入项目,安装并运行:
打开localhost:8080
vue实例:
选项API:
组件化应用构建
声明式渲染
Vue.js的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进DOM的系统:
指令邦定
指令
指令(Directives)是带有v-前缀的特殊属性
v-bind:
v-on:
v-if
v-for:
v-model:
数据,方法,计算属性,侦听器
生命周期
组件
全局注册
局部注册
组件组合
组件A在它的模板中使用了组件B。它们之间必然需要相互通信:父组件可能要给子组件下发数据,子组件则可能要将它内部发生的事情告知父组件。
prop向下传递,事件向上传递
子组件要显式地用props选项声明它预期的数据:
动态邦定prop
单项数据流
Prop是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解。
注意在JavaScript中对象和数组是引用类型,指向同一个内存空间,如果prop是一个对象或数组,在子组件内部改变它会影响父组件的状态。
自定义事件
每个Vue实例都实现了事件接口,即:
父组件可以在使用子组件的地方直接用v-on来监听子组件触发的事件。
这里有一个如何使用载荷(payload)数据的示例:
官方支持的vue-router库
Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
Vue.js是构建客户端应用程序的框架。默认情况下,可以在浏览器中输出Vue组件,进行生成DOM和操作DOM。然而,也可以将同一个组件渲染为服务器端的HTML字符串,将它们直接发送到浏览器,最后将静态标记”混合”为客户端上完全交互的应用程序。
零基础怎么学前端?要学哪些内容?首先要学习前端页面重构。包括PC端网站布局、HTML5+CSS3基础、WebApp页面布局等等,打好前端开发的基础。
然后要学JavaScript高级程序设计、PC端全栈开发的知识。包括原生JavaScript交互功能开发、面向对象进阶与ES5/ES6/ES7应用、JavaScript工具库自主研发、jQuery经典交互特效开发、PHP+MySQL后端基础、前端工程化与模块化应用等。
前面的知识都掌握了,就可以学框架、混合开发了。包括Node.js后端开发、Vue.js前端框架、React前端框架、混合开发(Hybrid,RN)、Angular前端框架等等。学习前端一定要有清晰的学习路线,掌握有效率的学习方法。
Vue.js入门教程(十五):如何创建自己的插件通常,我们不会去接触vue底层的东西,又或者我们突发奇想需要自己创造一套框架。可回头看看我们使用最多的,其实还是插件。
插件,你也可以理解为就是一套方法的集合,当我们需要调用它的时候,引入一下就行了。
举个例子,比如说,swiper和elementui。
一般来说,我们每个项目都会安装一大堆的插件。用于处理各种交互效果和逻辑,但是,网上能搜到了插件不一定能解决我们所有的问题。也就是说,我们剩下30%左右的逻辑部分是需要自己处理的,比如说,转化时间,处理字符串等等。
这些东西网上是没有现成插件的,需要我们自己来写。此时,如果你每一个组件里面都去定义方法就显得太low了。
我们需要自己写一个插件,事半功倍!
一般来说,我们自己的js通常会写成下面的两种形式:
第一种,声明多个方法。这个做法也叫函数声明,这样做的好处是,声明到全局,你只要引用了它,在页面任意地方都可以使用。但是同样的缺点也很明显,容易引起全局污染,浪费浏览器资源。而且当我方法多的时候,调用起来很不方便。
第二种,这是我们最长使用的声明方式,函数表达式。目的就是加载了这个js以后,当我需要使用的时候,直接调用str.xxx(),就可以返回我需要的内容了。并且,方法封装在变量内部,不会引起全局污染,也符合模块化的规则。
ok,ok。我们接下来,就要把我们自己的方法定义到vue上去使用。
我首先把js放到了项目文件夹中,然后在main.js中引入。
调用起来是完全没有问题的。
但是,又好像哪里不太对?是的,这样我们仅仅是引入了一个js,并没有把它形成一个js的插件。
我们来看看一个标准的js插件的调用形式:
为什么他这个可以直接从this上面调用???
个人理解他的方法应该是被定义到全局的vue对象上面了,这里的this应该指的就是vue本身!
如果你看过龙哥前面的教程,你应该知道,当我们引入的插件,是一个对象的时候,应该使用:
use方法,可以把一个符合vue标准的对象加载到vue本体上。
首先给我们的main.js下面增加一行。
然后打开我们自己的js文件,按照下面的方式书写:
最后在页面中调用的时候:
到此我们的插件已经跟vue融为一体!其实插件本身还支持更多参数和写法,请各位同学自行研究吧!
Vue.JS入门篇–列表渲染查看一下效果,应该很容易得到结果
有时我们可能需要重复一个包含多个节点的块,这时可以用template标签包裹这个块。这里的template标签只起到语义上的包裹作用,其本身不会被渲染出来。例如:
简单值(primitivevalue)即字符串、数字、boolean等并非对象的值。对于包含简单值的数组,你可用$value直接访问值:
有时我们可能想要更明确地访问当前作用域的变量而不是隐式地回退到父作用域。你可以通过提供一个参数给v-repeat指令并用它作为将被迭代项的别名:
Vue.js内部对被观察数组的变异方法(mutatingmethods,包括push(),pop(),shift(),unshift(),splice(),sort()和reverse())进行了拦截,因此调用这些方法也将自动触发视图更新。
下面是一个演示的例子,点击按钮的时候数据项会被移除
Vue.js给被观察数组添加了两个便捷方法:$set()和$remove()。
你应该避免直接通过索引来设置数据绑定数组中的元素,比如demo.items[0]={},因为这些改动是无法被Vue.js侦测到的。你应该使用扩展的$set()方法:
$remove()只是splice()方法的语法糖。它将移除给定索引处的元素。当参数不是数值时,$remove()将在数组中搜索该值并删除第一个发现的对应元素。
当你使用非变异方法,比如filter(),concat()或slice(),返回的数组将是一个不同的实例。在此情况下,你可以用新数组替换旧的数组:
你可能会认为这将导致整个列表的DOM被销毁并重新渲染。但别担心,Vue.js能够识别一个数组元素是否已有关联的Vue实例,并尽可能地进行有效复用。
在某些情况下,你可能需要以全新的对象(比如API调用所返回的对象)去替换数组。如果你的每一个数据对象都有一个唯一的id属性,那么你可以使用track-by特性参数给Vue.js一个提示,这样它就可以复用已有的具有相同id的Vue实例和DOM节点。
例如:你的数据是这个样子的
那么你可以像这样给出提示:
在替换items数组时,Vue.js如果碰到一个有_uid:’88f869d’的新对象,它就会知道可以直接复用有同样_uid的已有实例。在使用全新数据重新渲染大型v-repeat列表时,合理使用track-by能极大地提升性能。
你也可以使用v-repeat遍历一个对象的所有属性。每个重复的实例会有一个特殊的属性$key。对于简单值,你也可以象访问数组中的简单值那样使用$value属性。
在ECMAScript5中,对于给对象添加一个新属性,或是从对象中删除一个属性时,没有机制可以检测到这两种情况。针对这个问题,Vue.js中的被观察对象会被添加三个扩展方法:$add(key,value),$set(key,value)和$delete(key)。这些方法可以被用于在添加/删除观察对象的属性时触发对应的视图更新。方法$add和$set的不同之处在于当指定的键已经在对象中存在时$add将提前返回,所以调用obj.$add(key)并不会以undefined覆盖已有的值。
v-repeat也可以接受一个整数。在这种情况下,它将重复显示一个模板多次。下面的例子将迭代3次。
有时候我们只需要显示一个数组的过滤或排序过的版本,而不需要实际改变或重置原始数据。Vue提供了两个内置的过滤器来简化此类需求:filterBy和orderBy。
javascript教程
参考书是《JavaScript DOM编程艺术》(39元)(Jeremy Keith著杨涛王建桥杨晓云等译),人民邮电出版社的,很不错的,打完折后会更便宜一些,但是这是对基础入门的人看的书,非常不错的,我现在就看这个,看完后能在百度上解决大部分js问题。
若楼主看完此书后想深入研究,我强烈推荐看着一本《JavaScript高级程序设计》(59元)(Nicholas C. Zakas著,曹力张欣等译),人民邮电出版社的,更经典。
这是以上两本书的图片地址:
关于如何优化你的JS代码(图文教程)
JS代码的执行效率往往直接影响了页面的性能,有的时候,实现同样的功能,不同的JS代码往往在效率上相差很多,有的时候仅仅是由于我们的书写习惯导致的,当然在高级点的浏览器中,它们大多都已经帮我们优化了,但是在中国,万恶的IE6仍然大量的存在,我们不得不去考虑它。对于JS代码的优化,实际上有很多的情况,有些影响是比较小的,而有些是比较严重的,本文中,我把几个我认为影响比较严重的情况列出来,供大家参考。
1、字符串的拼接
字符串的拼接在我们开发中会经常遇到,所以我把其放在首位,我们往往习惯的直接用+=的方式来拼接字符串,其实这种拼接的方式效率非常的低,我们可以用一种巧妙的方法来实现字符串的拼接,那就是利用数组的join方法。
<p class=”one” id=”one”></p>
<input type=”button” value=”效率低” onclick=”func1()”/>
<input type=”button” value=”效率高” onclick=”func2()”/>//效率低的 function func1(){
var start= new Date().getTime();
var template=””;
for(var i= 0; i< 10000; i++){
template+=”<input type='button' value='a'>”;
}
var end= new Date().getTime();
document.getElementById(“one”).innerHTML= template;
alert(“用时:”+(end- start)+”毫秒”);}//效率高的 function func2(){
var start= new Date().getTime();
var array= [];
for(var i= 0; i< 10000; i++){
array[i]=”<input type='button' value='a'>”;
}
var end= new Date().getTime();
document.getElementById(“one”).innerHTML= array.join(“”);
alert(“用时:”+(end- start)+”毫秒”);}我们看看其在不同浏览器下执行的情况
我们会发现,在IE6下其差别是相当明显的,其实这种情况在IE的高版本中体现的也非常明显,但是在Firefox下却没有多大的区别,相反第二种的相对效率还要低点,不过只是差别2ms左右,而Chrome也和Firefox类似。另外在这里顺便说明一下,在我们给数组添加元素的时候,很多人喜欢用数组的原生的方法push,其实直接用arr[i]或者arr[arr.length]的方式要快一点,大概在10000次循环的情况IE浏览器下会有十几毫秒的差别。
2、for循环
for循环是我们经常会遇到的情况,我们先看看下面例子:
<input type=”button” value=”效率低” onclick=”func1()”/>
<input type=”button” value=”效率高” onclick=”func2()”/>
var arr= [];
for(var i= 0; i< 10000; i++){
arr[i]=”<p>”+ i+”</p>”;
}
document.body.innerHTML+= arr.join(“”);
//效率低的 function func1(){
var ps= document.getElementsByTagName(“p”);
var start= new Date().getTime();
for(var i= 0; i< ps.length; i++){
//”效率低”
}
var end= new Date().getTime();
alert(“用时:”+(end- start)+”毫秒”);
}
//效率高的 function func2(){
var ps= document.getElementsByTagName(“p”);
var start= new Date().getTime();
for(var i= 0, len= ps.length; i< len; i++){
//”效率高”
}
var end= new Date().getTime();
alert(“用时:”+(end- start)+”毫秒”);
}
由上表可以看出,在IE6.0下,其差别是非常明显,而在Firefox和Chrome下几乎没有差别,之所以在IE6.0下会有这种情况,主要是因为for循环在执行中,第一种情况会每次都计算一下长度,而第二种情况却是在开始的时候计算长度,并把其保存到一个变量中,所以其执行效率要高点,所以在我们使用for循环的时候,特别是需要计算长度的情况,我们应该开始将其保存到一个变量中。但是并不是只要是取长度都会出现如此明显的差别,如果我们仅仅是操作一个数组,取得的是一个数组的长度,那么其实两种方式的写法都差不多,我们看下面的例子:
<input type=”button” value=”效率低” onclick=”func1()”/>
<input type=”button” value=”效率高” onclick=”func2()”/>
var arr2= [];
for(var i= 0; i< 10000; i++){
arr2[i]=”<p>”+ i+”</p>”;
}
//效率低的 function func1(){
var start= new Date().getTime();
for(var i= 0; i< arr2.length; i++){
//”效率低”
}
var end= new Date().getTime();
alert(“用时:”+(end- start)+”毫秒”);
}
//效率高的 function func2(){
var start= new Date().getTime();
for(var i= 0, len= arr2.length; i< len; i++){
//”效率高”
}
var end= new Date().getTime();
alert(“用时:”+(end- start)+”毫秒”);
}
从上表可以看出,如果仅仅是一个数组的话,我们看到其实两种写法都是差不多的,其实如果我们把循环再上调到100000次的话,也仅仅是差别几毫秒而已,所以在数组的情况下,我认为都是一样的。对于for循环的优化,也有人提出很多点,有人认为用-=1,或者从大到小的方式循环等等,我认为是完全没有必要的,这些优化往往实际情况下根本没有表现出来,换句话说只是计算机级别的微小的变化,但是给我们带来的却是代码的可读性大大的降低,所以实在是得不偿失。
3、减少页面的重绘
减少页面重绘虽然本质不是JS本身的优化,但是其往往是由JS引起的,而重绘的情况往往是严重影响页面性能的,所以完全有必要拿出来,我们看下面例子:
<p id=”demo”></p>
<input type=”button” value=”效率低” onclick=”func1()”/>
<input type=”button” value=”效率高” onclick=”func2()”/>
var str=”<p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p><p>这是一个测试字符串</p>”;
//效率低的 function func1(){
var obj= document.getElementById(“demo”);
var start= new Date().getTime();
for(var i= 0; i< 100; i++){
obj.innerHTML+= str+ i;
}
var end= new Date().getTime();
alert(“用时”+(end- start)+”毫秒”);
}
//效率高的 function func2(){
var obj= document.getElementById(“demo”);
var start= new Date().getTime();
var arr= [];
for(var i= 0; i< 100; i++){
arr[i]= str+ i;
}
obj.innerHTML= arr.join(“”);
var end= new Date().getTime();
alert(“用时”+(end- start)+”毫秒”);
可以看到的是,这简直是一个惊人的结果,仅仅100次的循环,不管是在什么浏览器下,都出现了如此之大的差别,另外我们还发现,在这里,IE6的执行效率居然比起Firefox还要好很多,可见Firefox在页面重绘这方面并没有做一些的优化。这里还要注意的是,一般影响页面重绘的不仅仅是innerHTML,如果改变元素的样式,位置等情况都会触发页面重绘,所以在平时一定要注意这点。
4、减少作用域链上的查找次数
我们知道,js代码在执行的时候,如果需要访问一个变量或者一个函数的时候,它需要遍历当前执行环境的作用域链,而遍历是从这个作用域链的前端一级一级的向后遍历,直到全局执行环境,所以这里往往会出现一个情况,那就是如果我们需要经常访问全局环境的变量对象的时候,我们每次都必须在当前作用域链上一级一级的遍历,这显然是比较耗时的,我们看下面的例子:
<p id=”demo”></p>
<input id=”but1″ type=”button” onclick=”func1()” value=”效率低”/>
<input id=”but2″ type=”button” onclick=”func2()” value=”效率高”/>
function func1(){
var start= new Date().getTime();
for(var i= 0; i< 10000; i++){
var but1= document.getElementById(“but1”);
var but2= document.getElementById(“but2”);
var inputs= document.getElementsByTagName(“input”);
var ps= document.getElementsByTagName(“p”);
var but1= document.getElementById(“but1”);
var but2= document.getElementById(“but2”);
var inputs= document.getElementsByTagName(“input”);
var ps= document.getElementsByTagName(“p”);
var but1= document.getElementById(“but1”);
var but2= document.getElementById(“but2”);
var inputs= document.getElementsByTagName(“input”);
var ps= document.getElementsByTagName(“p”);
var but1= document.getElementById(“but1”);
var but2= document.getElementById(“but2”);
var inputs= document.getElementsByTagName(“input”);
var ps= document.getElementsByTagName(“p”);
var but1= document.getElementById(“but1”);
var but2= document.getElementById(“but2”);
var inputs= document.getElementsByTagName(“input”);
var ps= document.getElementsByTagName(“p”);
var but1= document.getElementById(“but1”);
var but2= document.getElementById(“but2”);
var inputs= document.getElementsByTagName(“input”);
var ps= document.getElementsByTagName(“p”);
}
var end= new Date().getTime();
alert(“用时”+(end- start)+”毫秒”);
}
function func2(){
var start= new Date().getTime();
var doc= document;
for(var i= 0; i< 10000; i++){
var but1= doc.getElementById(“but1”);
var but2= doc.getElementById(“but2”);
var inputs= doc.getElementsByTagName(“input”);
var ps= doc.getElementsByTagName(“p”);
var but1= doc.getElementById(“but1”);
var but2= doc.getElementById(“but2”);
var inputs= doc.getElementsByTagName(“input”);
var ps= doc.getElementsByTagName(“p”);
var but1= doc.getElementById(“but1”);
var but2= doc.getElementById(“but2”);
var inputs= doc.getElementsByTagName(“input”);
var ps= doc.getElementsByTagName(“p”);
var but1= doc.getElementById(“but1”);
var but2= doc.getElementById(“but2”);
var inputs= doc.getElementsByTagName(“input”);
var ps= doc.getElementsByTagName(“p”);
var but1= doc.getElementById(“but1”);
var but2= doc.getElementById(“but2”);
var inputs= doc.getElementsByTagName(“input”);
var ps= doc.getElementsByTagName(“p”);
var but1= doc.getElementById(“but1”);
var but2= doc.getElementById(“but2”);
var inputs= doc.getElementsByTagName(“input”);
var ps= doc.getElementsByTagName(“p”);
}
var end= new Date().getTime();
alert(“用时”+(end- start)+”毫秒”);上面代码中,第二种情况是先把全局对象的变量放到函数里面先保存下来,然后直接访问这个变量,而第一种情况是每次都遍历作用域链,直到全局环境,我们看到第二种情况实际上只遍历了一次,而第一种情况却是每次都遍历了,所以我们看看其执行结果:
从上表中可以看出,其在IE6下差别还是非常明显的,而且这种差别在多级作用域链和多个全局变量的情况下还会表现的非常明显。
5、避免双重解释
双重解释的情况也是我们经常会碰到的,有的时候我们没怎么考虑到这种情况会影响到效率,双重解释一般在我们使用eval、new Function和setTimeout等情况下会遇到,我们看看下面的例子:
<p id=”demo”></p>
<input id=”but1″ type=”button” onclick=”func1()” value=”效率低”/>
<input id=”but2″ type=”button” onclick=”func2()” value=”效率高”/>
var sum, num
OK,关于js教程和js教程电子版下载的内容到此结束了,希望对大家有所帮助。




