当前位置: 首页 > Web前端 > JavaScript

Y分钟快javascript

时间:2023-03-27 01:41:13 JavaScript

源码下载:javascript-zh.jsJavascript是Netscape的BrendanEich于1995年发明的。它最初是作为开发网站的简单脚本语言而发明的,作为开发复杂网站的Java的补充。但由于其与网页的高度集成以及浏览器的内置支持,Javascript在Web前端领域已经比Java更受欢迎。Javascript不仅仅适用于Web浏览器,一个名为Node.js的项目为GoogleChromeV8引擎提供了独立的运行时环境,它正变得越来越流行。非常欢迎您的反馈,您可以通过以下方式与我联系:@ExcitedLeigh,或l@leigh.net.au。//注释与C非常相似,这是单行注释/*这是多行注释*///语句可以以分号结尾doStuff();//...但分号也可以省略,每当遇到新行时,分号会自动插入(某些特殊情况除外)。doStuff()//因为这些特殊情况会导致意想不到的结果,所以我们在这里保留分号。///////////////////////////////////1.数字、字符串和运算符//仅限Javascript数字类型(即64位IEEE754双精度浮点双精度)。//double的尾数有52位,足以准确存储最大为9?101?的整数。3;//=31.5;//=1.5//所有基本算术都如您所愿。1+1;//=20.1+0.2;//=0.300000000000000048-1;//=710*2;//=2035/5;//=7//包括不可分割的除法。5/2;//=2.5//位运算与其他语言相同;当您对浮点数执行按位运算时,//浮点数将转换为*至多*32位无符号整数。1<<2;//=4//括号可以决定优先级。(1+3)*2;//=8//共有三种非数字数值类型Infinity;//1/0-Infinity的结果;//-1/0NaN的结果;//0/0的结果//也有布尔值。true;false;//字符串可以用单引号或双引号构成。'abc';"Hello,world";//使用!否定!真;//=假!假;//=true//等于===1===1;//=true2===1;//=false//不等于!=1!==1;//=false2!==1;//=true//更多比较运算符1<10;//=true1>10;//=false2<=2;//=true2>=2;//=true//字符串连接+"Hello"+"world!";//="Helloworld!"//字符串也可以用<,>"a"<"b"进行比较;//=true//使用“==”比较时会发生类型转换...“5”==5;//=truenull==undefined;//=true//...除非你使用==="5"===5;//=falsenull===undefined;//=false//...但会导致奇怪的行为13+!0;//14"13"+!0;//'13true'//你可以使用`charAt`获取字符串"Thisisastring".charAt(0)中的字符;//='T'//...或使用`substring`获得更大的部分。“你好世界”.substring(0,5);//="Hello"//`length`是一个属性,所以不要使用()."Hello".length;//=5//有两个特殊的值:`null`和`undefined`null;//用来表示特意设置的空值undefined;//用来表示一个没有被设置的值(虽然`undefined`本身其实也是一个值)//false,null,undefined,NaN,0和""都是false;othersaretreatedaslogicallytrue//注意0在逻辑上是假的,“0”在逻辑上是真的,即使0==“0”。///////////////////////////////////2.变量、数组和对象//变量需要使用`var`关键字声明。Javascript是一种动态类型的语言,//因此您无需指定类型。赋值需要使用`=`varsomeVar=5;//如果声明的时候不加var关键字,就不会报错...someOtherVar=10;//...但是这次变量会报错在全局范围内创建,而不是你定义的当前范围//没有赋值的变量将被设置为undefinedvarsomeThirdVar;//=undefined//有一些对变量进行数学运算的简写:someVar+=5;//相当于someVar=someVar+5;someVar现在是10someVar*=10;//现在someVar是100//还有递增和递减someVar++的简写;//someVar是101someVar--;//回到100//数组是任意类型的有序列表varmyArray=["Hello",45,true];//数组的元素可以通过方括号下标访问。//数组的索引从0开始。myArray[1];//=45//数组是可变的并且具有可变长度。myArray.push("世界");myArray.length;//=4//在指定下标处添加/修改myArray[3]="Hello";//javascript中的对象相当于其他语言中的“字典”或者“map”:是键值对的无序集合.varmyObj={key1:"Hello",key2:"World"};//key是一个字符串,但是如果key本身是合法的js标识,引号就不需要了。//值可以是任何类型。varmyObj={myKey:"myValue","myotherkey":4};//可以通过下标访问对象属性myObj["myotherkey"];//=4//...或者还有.,如果该属性是合法标识符myObj.myKey;//="myValue"//对象是可变的;也可以更改值或添加新键myObj.myThirdKey=true;//如果你想获取一个还没有定义的值,那么它会返回undefinedmyObj.myFourthKey;//=undefined////////////////////////////////////3.逻辑和控制结构//本节介绍的语法与Java几乎相同//`if`语句与其他语言相同。varcount=1;if(count==3){//当计数为3时执行}elseif(count==4){//当计数为4时执行}else{//否则执行}//while循环while(true){//无限循环}//do-while类似于While循环,但前者至少会执行一次varinput;do{input=getInput();}while(!isValid(input))//`for`循环与C和Java中的相同://initialization;继续执行的条件;迭代。for(vari=0;i<5;i++){//遍历5次}//&&逻辑与,||是合乎逻辑的或if(house.size=="big"&&house.colour=="blue"){house.contains="bear";}if(colour=="red"||color=="blue"){//当颜色为红色或蓝色时执行}//&&和||是“短路”语句,在设置初始化值时特别有用varname=otherName||"default";//`switch`语句使用`===`检查是否相等。//在每个case的末尾使用'break'//否则后面的case语句也会被执行。等级='B'??;switch(grade){case'A':console.log("干得好");休息;case'B':console.log("OKjob");休息;case'C':console.log("你可以做得更好");休息;默认值:console.log("Oyvey");break;}///////////////////////////////////4.函数、作用域、闭包//JavaScript函数由`function`关键字定义functionmyFunction(thing){returnthing.toUpperCase();}myFunction("foo");//="FOO"//注意,返回值必须从`return`关键字所在的行开始,//否则由于自动分号填充,您将返回`undefined`。//使用Allman样式时要注意。functionmyFunction(){return//<-这里自动插入分号{thisIsAn:'objectliteral'}}myFunction();//=undefined//javascript中的函数是一级对象,所以函数也可以赋值给一个变量,//并作为参数传递——例如事件处理函数:functionmyFunction(){//这段代码将5秒后调用}setTimeout(myFunction,5000);//注意:setTimeout不是js语言的一部分,是由浏览器和Node.js提供的。//函数对象甚至不需要声明名称-你可以直接将函数定义写入另一个函数的参数中setTimeout(function(){//这段代码将在5秒后调用},5000);//JavaScript有函数作用域;函数有自己的作用域,而其他代码块则没有。如果(真){vari=5;}i;//=5-不是我们在其他语言中期望的undefined//这导致了人们经常使用的“立即执行匿名函数”模式,//这阻止了一些临时变量传播到全局范围。(function(){vartemporary=5;//我们可以访问和修改全局对象(“全局对象”)以访问全局范围,//在网络浏览器中它是`window`对象。//在其他环境中比如这个对象在Node.js中的名称可能不同window.permanent=10;})();temporary;//抛出引用异常ReferenceErrorpermanent;//=10//javascript最强大的功能之一是闭包。//如果一个函数定义在另一个函数内部,则内部函数可以访问外部函数的所有变量,//即使在外部函数结束之后。functionsayHelloInFiveSeconds(name){varprompt="Hello,"+name+"!";//默认情况下,内部函数位于本地范围内,//就像使用`var`声明一样。函数内部(){警报(提示);}setTimeout(内部,5000);//setTimeout是异步的,所以sayHelloInFiveSeconds函数会立即退出,//setTimeout稍后会调用inner//然而,由于inner是由sayHelloInFiveSeconds"Closedcontains"调用的,//所以inner仍然可以访问`prompt`变量当它最终被调用时。}sayHelloInFiveSeconds("亚当");//会弹出“你好,亚当!”5秒后////////////////////////////////////5.对象、构造函数和原型//对象可以包含方法。varmyObj={myFunc:function(){返回“Helloworld!”;}};myObj.myFunc();//="Helloworld!"//当对象中的函数被调用时,这个函数可以通过`this`关键字来访问它所依附的对象。myObj={myString:"Helloworld!",myFunc:function(){returnthis.myString;}};myObj.myFunc();//="Helloworld!"//但是这个函数实际上访问的是它运行时的环境,而不是定义的时间环境,这取决于函数的调用方式。//所以如果函数在调用的时候不在这个对象的上下文中,是不会运行成功的。varmyFunc=myObj.myFunc;myFunc();//=undefined//相应的,函数也可以指定为对象的方法,通过`this`可以访问这个对象的成员,即使函数在定义的时候并没有依附于对象.varmyOtherFunc=function(){returnthis.myString.toUpperCase();}myObj.myOtherFunc=myOtherFunc;myObj.myOtherFunc();//="HELLOWORLD!"//当我们通过`call`或`apply`调用一个函数时,还可以为它指定一个执行上下文。varanotherFunc=function(s){returnthis.myString+s;}anotherFunc.call(myObj,"AndHelloMoon!");//="HelloWorld!还有你好月亮!"//`apply`函数几乎完全相同,只是要求一个数组来传递参数列表。anotherFunc.apply(myObj,["太阳你好!"]);//="HelloWorld!AndHelloSun!"//当一个函数接受一系列参数并且你想传入一个数组时特别有用。Math.min(42,6,27);//=6Math.min([42,6,27]);//=NaN(呃-哦!)Math.min.apply(Math,[42,6,27]);//=6//但`call`和`apply`只是暂时的。如果我们想让函数附加到对象上,我们可以使用`bind`。varboundFunc=anotherFunc.bind(myObj);boundFunc("土星你好!");//="HelloWorld!AndHelloSaturn!"//`bind`也可用于部分应用函数(柯里化)。varproduct=function(a,b){返回a*b;}vardoubler=product.bind(this,2);doubler(8);//=16//当你用`new`关键字调用函数时,会创建一个对象,//并且可以通过this关键字访问该函数。//设计成这样调用的函数称为构造函数。varMyConstructor=function(){this.myNumber=5;}myNewObj=newMyConstructor();//={myNumber:5}myNewObj.myNumber;//=5//每个js对象都有一个“原型”。当您想要访问未在实际对象中定义的属性时,//解释器返回到对象的原型。//某些JS实现允许您通过`__proto__`属性访问对象的原型。//这对于理解原型很有用,但它不是标准的一部分;//稍后我们将介绍使用原型的标准方法。varmyObj={myString:"Helloworld!"};varmyPrototype={meaningOfLife:42,myFunc:function(){returnthis.myString.toLowerCase()}};myObj.__proto__=myPrototype;myObj.meaningOfLife;//=42//函数也有效。myObj.myFunc()//="helloworld!"//当然,如果你要访问的成员没有在原型中定义,解释器会去寻找原型的原型,以此类推。myPrototype.__proto__={myBoolean:true};myObj.myBoolean;//=true//没有对象的副本;每个对象实际上都持有对原型对象的引用。//这意味着当我们改变一个对象的原型时,会影响其他基于这个原型的对象。myPrototype.meaningOfLife=43;myObj.meaningOfLife;//=43//我们知道`__proto__`不是标准规范,实际上也没有标准的方法来修改现有对象的原型。//但是,我们有两种方法可以为给定的原型创建一个新对象。//第一种方式是Object.create,这个方法是最近才加入到Js中的,//所以并不是所有的JS实现都有这个方法varmyObj=Object.create(myPrototype);myObj.meaningOfLife;//=43//第二种方法可以在任何版本中使用,但必须通过构造函数。//构造函数有一个属性原型。但它*不是*构造函数本身的原型;相反,//是通过构造函数和new关键字创建的新对象的原型。MyConstructor.prototype={myNumber:5,getMyNumber:function(){returnthis.myNumber;}};varmyNewObj2=newMyConstructor();myNewObj2.getMyNumber();//=5myNewObj2.myNumber=6myNewObj2.getMyNumber();//=6//字符串和数字等内置类型也有构造函数创建的包装类型varmyNumber=12;varmyNumberObj=newNumber(12);myNumber==myNumberObj;//=true//但它们不是严格等价的typeofmyNumber;//='number'typeofmyNumberObj;//='object'myNumber===myNumberObj;//=falseif(0){//这段代码不会执行,因为0表示false}//但是,包装类型和内置类型共享一个原型,//所以你实际上可以向内置类型添加一些函数在类型中,例如字符串:String.prototype.firstCharacter=function(){returnthis.charAt(0);}"abc".firstCharacter();//="a"//这种技术常被用在“代码堆砌”中,将新版本的js特性添加到旧版本的javascript子集中,//这样就可以在旧浏览器中使用新功能浏览器.//例如,我们知道Object.create并没有在所有版本中实现,//但我们仍然可以通过“代码改组”来实现兼容性:if(Object.create===undefined){//如果存在则Don'toverrideObject.create=function(proto){//使用正确的原型创建临时构造函数varConstructor=function(){};构造函数.原型=原型;//稍后使用它创建一个新对象returnnewConstructor();}}进一步阅读TheMozillaDeveloperNetwork提供了关于Javascript如何在浏览器中工作的优秀文档。而且它是一个wiki,因此您也可以自己编辑它来分享您的知识。MDN的Are-introductiontoJavaScript涵盖了这里提到的大部分主题的细节。本指南的大部分内容仅限于Javascript语言本身;如果您想了解如何在网页中使用Javascript,请查看文档对象模型。通过示例和挑战学习Javascript是该参考的另一个版本,包括挑战练习。JavascriptGarden是对Javascript所有反直觉部分的深入指南。JavaScript:TheDefinitiveGuide是经典的操作指南。除了本文的直接贡献者,本文还参考了本站LouieDinh的Python教程和Mozilla开发者网络上的JS教程。有什么建议吗?还是发现了什么不对?在Github上打开一个问题,或者发起一个pullrequest!最初由LeighBrenecki撰写,由0位善良的人编辑。译者:ChenboLiGuodongQu?2022LeighBrenecki,ArielKrakowski本作品已获得CCBY-SA许可