JavaScript高级程序设计基本概念

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: ECMAscript到底是什么?它和JavaScript的关系?(这个概念我也是百度的)要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。
ECMAscript到底是什么?它和JavaScript的关系?(这个概念我也是百度的)
要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言成为ECMAScript,这个版本就是1.0版。
   该标准从一开始就是针对JavaScript语言制定的,但之所以不叫JavaScript,有两个原因。一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。
   因此,ECMAScript和JavaScript的关系是,前者是后者的规格(标准),后者是前者的一种实现(另外的ECMAScript方言还有Jscript和
ActionScript)。在日常场合,这两个词是可以互换的。



如果通过<script>元素包涵外部javascr文件,那么src属性是必须的。
把javascript 插入到html中要使用<script> 

异步脚本:
async属性 的目的是为了不让页面等待两个脚本下载和执行,从而一部加载页面的其他内容,异步脚本一定会在页面的load事件前执行。  可以表示当前脚本不用等待其他脚本,也不必阻塞文档呈现,但不能保证异步脚本按照他们在
页面中出现的顺序执行

<script type="text/javascript"><![CDATA[
function compare(a,b)
{

}
]]></script>
CData片段事文档中的一个特殊区域 这个区域可以包含不需要解析任意格式的文本内容,所以在CData片段中就可以使用任何字符--小于号当然也是
可以的,而且不会有语法错误       如果在不兼容xhtml的浏览器中 不支持CData片段就就可以用//来注释掉


在不支持<script>的浏览器中  可以选择<!--//-->来隐藏掉
<script><!--
function sayHi()
{
    alert("hi!");
}
//--></script>
不过现在所有的浏览器都已经支持javascript 所以 就没再必要使用这种格式了



文档模式也都是必备的
如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
就是过渡型
<body>
<noscript>
<p>本网页需要浏览器支持(启用)javascript
</noscript>
</body>                      当浏览器不支持脚本,或者浏览器支持脚本,但是脚本被禁用的时候  会显示<noscript>中的信息



需要注意的是:
在包含外部javascript文件时,必须将src属性设置为指向相应文件的URL 
所有<script>元素都是按照他们再页面中出现的先后顺序依次被解析。在没有defer和async属性的情况下,只有在解析玩前面的<script>元素中的代码之后,才会解析后面<script>元素中的代码.
<script>引用外部js文件时,必须是<script ...></script>标记格式,不要采取省略形式。
现代的web应用程序一般把全部javascript引用都放在<body>元素中页面内容的后面,因为代码都是从上往下解析的,如果javascript引用放在head
则网页出现空白页面的时间增长 
延迟脚本:
defer是延迟脚本的属性  设置defer=“defer” 是为了让脚本延迟到整个页面都解析完毕后运行,意思就是相当于告诉浏览器立即下载,但延迟执行。    延迟脚本总是按照他们的顺序执行
最好只包含一个延迟脚本  还有defer属性只适用于外部脚本文件。
<noscript>可以指定在不支持脚本的浏览器中显示的替代内容  ,但是启动了脚本的情况下,浏览器不会显示<script>元素中的任何内容




区分大小写的
标识符的第一个字符必须是字母.下划线或者$符号 
采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写
不能把关键字,保留字,true,falsenull作为标识符
单行注释//
多行注释/**/
语句结尾的分号虽然不是必需的,但是建议不要忽略它
在控制语句中使用代码快可以使编程意图更加清晰
比如
if(test){
alert("sdf");
}
变量是松散类型 意思就是 定义变量时使用var操作符
var message="hi";
可以 message=10; 有效但是不推荐  
还有var定义的是局部变量 比如在一个函数中用var定义了一个变量,那么这个变量在函数退出后就会被销毁
如果 在一个函数中省略var 定义了一个变量 则这个变量就是全局变量 只要调用一次函数 这个变量就有了定义,就可以在函数外部的任何地方被访问到.  但是不推荐,因为在局部作用域定义的全局变量很难维护
可以用一条语句定义多个变量.如:
var message="hi",
    found=false,
    age=29;      定义并初始化了三个变量,因为是松散类型,所以 使用不同类型初始化变量的操作可以放在一条语句来完成.


数据类型有 Undefined ,Null,Boolean,Number,String和一种复杂的数据类型--Object
typeof是负责检测给定变量的数据类型
对一个值使用typeof可能返回下列字符串
undefined---这个值未定义    使用var声明变量,但是未对其加以初始化时,这个变量的值就是undefined
boolean---布尔值
string---字符串
number---数值
object---对象或者null
function---函数
举个例子
var message="some string";
alert(typeof(message)); //string
alert(typeof 95);  //number
typeof是一个操作符,所以例子中的圆括号尽管可以使用,但不是必需的.


var car=null;
alert(typeof car)     //"object" 
如果定义的变量准备在将来存放对象,那么最好将该变量初始化为null而不是其他值
还有实际上 undefined值派生自null值,所以 alert(null==undefined)   //true
虽然nullundefined有这样的关系 但是无论什么情况下都没有必要将一个变量的值显示设置为undefined 
但是 只要意在保存对象的变量还有没真正保存对象,就应该明确让该变量保存null值
还有boolean是将其他类型的值转化为一个Boolean值  比如空字符串转化为false   数值0转化为false   
还有if的控制语句会自动执行相应的Boolean
Number可以保存+0和-0并且两者被认为是相等的
var floatNum1=1.    //小数点后面没有数字,解析为1
var floatNum2=10.0   //整数, 解析为10
var floatNum3=3.125e7  //等于31250000
0.0000003 转化为3e-7
数值的范围:
数值的范围超过了javascript数值范围的值 会被自动转换为特殊的Infinity值 如果是负数就会被转换为-Infinity  正数就会被转换为Infinity   可以用isFinite() 会返回一个BooleanNaN 是一个特殊的数值 ,
数值的转换:
数值转换用Number()可以用于任何数据类型  
如果是Booleantruefalse转换为1和0
如果是数字值,则简单的传入和返回
如果是null值,返回0
如果是undefind 返回NaN
如果是字符串   将其转换为十进制数值 如"123"变成123  "011"转换为11
如果字符串包含有效的浮点格式"1.1" 则将其转换为对应的浮点数值 (同样会忽略前导0)
如果字符串是空,将其转换为0
举几个例子:
var num1=Number("sdf");  //NaN    因为不包涵任何有意义的数字值  
var num2=Numebr("");     //0
var num3=Number("00011")   //11
var num4=Number(true)     //1
parseInt()parseFloat()是专门用于把字符串转化为数值的  
parseInt()经常用于处理整数
例子 :
var num1=parseInt("1234blue");  //1234    因为不包涵任何有意义的数字值  
var num2=parseInt("");     //NaN
var num1=parseInt("22.2");   //22
var num1=parseInt("70");    //70
var num3=parseInt("0xAF",16);  // 175  指明转换的基数很重要  所以什么情况下都要明确指定的基数
多数情况下 我们要解析的都是十进制数值,所以始终将10作为第二个参数是很必需的.
parseFloat() 字符串中的第一个小数点是有效的,第二个是无效的,因此他后面的字符串会被忽略  "22.34.45" 转换为22.34
parseFloatparseInt的还有区别是 它始终忽略掉前面的0
比如"045.1" 转换为45.1
string类型:可以“” 或者‘’但是必须得匹配
字符字面量:也叫做转义序列  
\n表示换行
\t表示制表
\b表示空格
\r表示回车
\\表示斜杠
\‘表示单引号
\"表示双引号
任何字符串的长度都可以通过访问其length属性取得
比如 var text=“sdfsadfalert(text.length);
字符串可以通过直接相加来实现拼接
转化为字符串:  通常toString()方法
var age=11;
var ageAsString=age.toString();  //字符串11
var found=truevar foundAsString=found.toString();   //字符串“true”
但是nullundefined没有这个方法
调用数值的tostring()时候可以传参 ,默认返回是10进制的字符串,可以添加基数,来输出任意有效进制的数
var num=10;
alertnum.toString(2));// "1010"
toString()方法遵循下面规则
1.如果值有tostring()方法,则调用该方法返回相应的结果
2.如果是null,则返回“null”
3.如果是undefined,则返回“undefined”;
Object:
创建Objectvar o=new Object();
Object的每个实例都具有下列属性和方法
1.Object()保存着用于创建当前对象的函数
2.hasOwnProperty 用于检测给定的属性在当前对象实例中是否存在。其中作为参数的属性名,必须以字符串形式指定 例如o.hasOwnProperty("name");
3.isPrototypeOf(object)用于检测传入的对象是否是传入对象的原型/
4.propertyIsEnumerable 用来检测给定的属性是否能够使用for-in语句来枚举 ,作为参数的属性名必须以字符串的形式指定
5.toLocaleString()返回对象的字符串表示,该字符串和执行环境的地区对应
6.toString()返回对象的字符串表示
7.valueOf() 返回对象的字符串。数值或者布尔值表示。通常与toString()的返回值相同。
valueOf():返回最适合该对象类型的原始值;
toString(): 将该对象的原始值以字符串形式返回。
Object是所有对象的基础,所以,所有对象都具有这些基本的属性和方法
但是BOMDOM中的对象属于寄主对象,他们是由寄主实现提供和定义的。而ECMA-262不负责定义寄主对象,所有寄主对象可能会也可能不会继承Object;
操作符:
一元递增递减操作符:++;前置和后置和c语言的效果一样
不仅适用于整数,还可以用于字符串布尔值和浮点数值和对象,都遵循下面规则:
1.在应用于一个包涵有效数字字符的字符串时,先将其转化为数字值,然后在执行加减操作
2.在应用于一个不包涵有效数字字符的字符串时,将变量的值设置为NaN
3.布尔值时先转化为1或者0再执行加减操作,布尔值变量变成数值变量
4.应用于对象时,先调用对象的valueof()方法已取得一个可操作的数值,然后对该值进行上述规则
举例子:
var s1=“2”;
var s2="z";
var b=false;
var f=1.1;
var o=
{
    valueOf:function(){
        return -1;
    }
}
s1++;   //变成数值3;
s1++;   //变成NaN;
b++;   //变成数值1;
f--;   //变成数值0.100000000000009 
o--   //变成数值-2;
一元加和减操作符:
var num=23;
num=+num;   //实际还是23
如果是对非数值应用一元加操作符 则会像Numebr函数一样
比如 var s1="01";
var s2="1.1";
var s3="z";
var b=false;
var f=1.1;
s1=+s1; //1
s2=+s2; //1.1
s3=+s3;  //NaN
b=+b;  //0
f=+f;  //任然是1.1
一元减操作符主要用于表示负数  例如 将1转换为-1
 var num=23;
 num=-num;   //  -23
若是用于非数值 按照一元加操作符的相同规则,然后将得到的数值转换为负数
位操作符:
1.按位非~
2.按位与&
3.按位或|
4.按位异或^
5.左移  <<    左移不会影响操作数的符号位
6.有符号的右移
7.无符号的右移
布尔操作符  
1.非 !
2.与 && 是一个短路操作 如果第一个操作数是false 则第二个操作数是什么值,结果都不会是true
var found=true;
var result=(found&&somUndefind);   //会报错  因为第二个操作数没有声明
alert(result);这一行不会被执行

var found=false;
var result=(found&&somUndefind);   //不会发生错误
alert(result);会执行(“false”)    因为第一个操作符是false 意味着结果必定是false 根本用不着再对&&右侧的操作数求值了
3.逻辑或  也是短路操作
var result=true || false;
我们可以利用逻辑或的这一行为来避免为变量赋null或者undefined  例如
var myobject=preferredObject||someUndefinedVariable
在这个例子中  变量preferredObject优先赋值给myObject。    someUndefinedVariable负责在preferredObject中不包含有效值的情况下提供后备值
意思就是preferredObject不是null他的值会被赋值给myobject。如果是null,则将someUndefinedVariable的值赋值给myObject。以后的赋值语句经常
会使用这种模式。
乘性操作符:乘法和除法,求模%
加性操作符:
加法:注意 -0加-0结果是-0  +0加-0结果是+0
如果两个都是数值,直接相加
如果俩个操作数都是字符串则直接拼接
如果一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接
如果有一个操作数是对象,数值,布尔值,则调用他们的tostring()方法取得相应的字符串,然后再拼接
有()和无()是两个结果
比如  var num1=5;
var num2=10;
var message="sdf"+num1+num2;
结果是 sdf510
如果是 var message="sdf"+(num1+num2);
结果是 sdf15
减法:调用number()将其转化为数值然后操作  true变成1 “”变成0 null变成02”变成2
关系操作符:
<> <= >=
如果两个操作数都是数值,则执行数值比较
如果两个都是字符串,则比较两个字符串对应的字符编码值
如果一个是数值,则将另一个操作符转换为一个数值,然后进行比较
如果一个操作数是布尔值,则将其转换为数值,然后比较
字符串比较是两个字符串中对应位置的每个字符的字符编码值,大写字母的编码值全部小于小写的
“23”<"3"成立  ,因为比骄傲的是字符编码
“23”<3 错误 因为“23”被转化为了23a”<3a”>=3 错误,因为“a”被转化为NaN  在与NaN进行比较时,这两个比较操作符都返回了false
相等操作符:
如果有一个操作数时布尔值,则比较前先转换为数值
如果一个操作数是字符串,另一个操作数是数值,则先将字符串转换为数值
如果一个操作数是对象,另一个不是,则调用对象的valueOf方法
规则:
null和undefined是相等的
如果有一个操作数是NaN则 返回false
即使两个操作数都是NaN 也返回false
如果连哥哥操作数都是i对象 则比较他们是不是同一个对象,如果两个都指向同一个对象则返回true
null==0 false
NaN==NaN   false
全等操作符===
 “55”===55   false  因为不同的数据类型不同
 记住  null==undefined 会返回true   但是  null===undefined会返回false因为他们是不同类型
 注意:由于相等和不相等操作符存在类型转换问题,为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符
 条件操作符:   条件?返回1:返回2
 赋值操作符*= /= %= += -= <<=左移 >>=有符号右移  >>>=无符号右移
 逗号操作符  ,,,表示可以在一条语句中执行多个操作
 var num =(3,4,5,6,0)   num的值是0  逗号操作符总是会返回表达式中的最后一项
 语句:
 if()语句  if  else if   else
 do while()语句   循环至少被执行一次
 while语句
 for语句
 for in语句:for(var propName in window){
    document.write(propName);
 }            建议在使用for in循环之前,先检测确定对象的值不是null或者undefined  如果是 ,则不执行循环体
 break是直接跳出这个循环
 continue 是跳出这次循环 进入下一次循环
 不建议使用label语句
 with语句的作用是将代码的作用于设置在一个特定的对象里
 with(location){
    var qs=search.substring(1);
    var hostName=hostName;
    var url=href;
 }
 严格模式下不允许使用with语句,否则视为语法错误
 大量使用with语句会导致性能下降 所以在开发大型应用程序的是偶,不建议使用with语句
 swith语句。 switch 语句在比骄傲的时候使用的是全等操作符,因此不会发生类型转换  例如字符串“10”不等于10
 函数:function   里面位于return 后面的代码都不会被执行,也可以包括多个return
 严格模式对函数有一些限制:
 不能把函数名字命名为eval或者arguments
 不能把参数命名eval或者arguments;
 不能出现两个命名参数同名的情况
 函数的理解:
 ECMAScript函数的参数  可以不用写,因为它的参数在内部是用一个数组来表示的  意思是 如果你定义了一个函数只接受两个参数 ,但是  你调用这个
 函数的时候未必就要传递两个参数,而且 可以通过arguments来访问他的每一个元素  
 函数也不在乎传入多少参数,参数是什么类型都无所谓
 没有传递值的命名参数将自动被赋值undefined值  这就跟定义了变量但是没有初始化一样。
 ECMAScript中的所有参数传递的都是值,不可以通过引用传递参数
 ECMAScript函数不能像传统意义上那样实现重,因为其参数是由包涵0或者多个值的数组来表示的。
 通过检查传入函数中参数的类型和数量做出不同的反应,可以模仿方法的重载。
 比如 :
 function sayHi(){
    alert("heLLEO"+arguments[0]+,arguments[1]);
 }
 function howManyArgs(){
    alert(arguments.length);
 }
 howManyArgs("sdf",45);   //2
 howManyArgs();           //0
 howManyArgs(12);         //1


 总结 :1.ECMAScript的基本类型包括: Undefined,Null,Boolean,Number,String
        2.没有为整数和浮点数值分别定义不同的数据类型,Numebr类型可用于表示所有的数值
        3.Object是这门语言所有对象的基础类型
        4.无需指定函数的返回值
        5.实际上未指定返回值的函数返回的是一个特殊的undefined值
        6.也没有函数签名的概念,因为其函数参数是以一个包涵0或者多个值的数组的形式传递的
        7.可以向函数传递任意数量的函数,并且可以通过arguments对象来访问这些函数。
        8.由于不存在函数签名的特性,函数不能重载
目录
相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
57 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
5月前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念,它允许我们基于现有的类(或构造函数)创建新的类
【6月更文挑战第15天】JavaScript继承促进代码复用与扩展,创建类层次结构,但过深的继承链导致复杂性增加,紧密耦合增加维护成本,单继承限制灵活性,方法覆盖可能隐藏父类功能,且可能影响性能。设计时需谨慎权衡并考虑使用组合等替代方案。
46 7
|
1月前
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。
|
1月前
|
存储 JavaScript 前端开发
JavaScript 对象的概念
JavaScript 对象的概念
35 4
|
1月前
|
缓存 JavaScript 前端开发
深入了解JavaScript的闭包:概念与应用
【10月更文挑战第8天】深入了解JavaScript的闭包:概念与应用
|
29天前
|
前端开发 JavaScript 程序员
【从前端入门到全栈】Node.js 之核心概念
【从前端入门到全栈】Node.js 之核心概念
|
29天前
|
缓存 JavaScript 前端开发
Node.js模块化的基本概念和分类及使用方法
Node.js模块化的基本概念和分类及使用方法
30 0
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:概念与应用
【10月更文挑战第8天】深入理解JavaScript中的闭包:概念与应用
|
2月前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
本文深入探讨了JavaScript中闭包的概念,从定义、作用域链和实际应用等方面进行了详细阐述。通过生动的比喻和实例代码,帮助读者理解闭包在函数执行上下文中的重要性,以及如何在实际开发中有效利用闭包解决复杂问题。同时,文章也指出了过度使用闭包可能导致的潜在问题,并给出了相应的优化建议。
|
3月前
|
JavaScript 前端开发
js bom的概念
js bom的概念
35 1