前端2JavaScript程序设计1

目录

一、JavaScript简介

1. js历史   2. js实现   3. js引入

二、调试器

三、基本概念

1. 标识符  2. 关键字和保留字  3. 注释  4. 严格模式

5. 变量      6. 操作符                7. 语句


一、JavaScript简介

    html是描述网页内容的结构化语言,CSS描述html元素如何显示,JavaScript(js)控制网页和浏览器的行为,允许网页开发者改变html元素结构、CSS样式对事件作出响应,实现和服务器端的交互。

    js是一种解释型编程语言,即脚本语言,可以在运行环境中直接运行,不需要编译器编译后生成可执行文件。js是一种非常松散的面向对象语言。

    js的运行环境是js引擎,引擎可以独立在浏览器之外运行,js引擎种类丰富。node.js,用于服务器端网络应用的平台,封装了V8引擎。浏览器内核包括渲染引擎(把页面呈现给用户,Blink、Webkit)和js引擎(与脚本相关,V8、Chakra)。

1. js历史

扫描二维码关注公众号,回复: 2654884 查看本文章

2. js实现

    ECMAScript,js语言核心标准,规定了语言的如下组成部分:语法、关键字、保留字、数据类型、操作符、控制语句、对象。在没有涉及ES6(2015)前,提到的ECMAScript指ES5。

    DOM(Document Object Model)文档对象模型,W3C标准,提供访问和操作网页内容的方法和接口。

    BOM(Browser Object Model)浏览器对象模型,提供与浏览器交互的方法和接口。

3. js引入

    向html页面中插入js的主要方法,是使用<script>元素。type属性,表示编写代码使用的脚本语言的内容类型,通常写”text/javascript”。src属性,表示包含要执行代码的外部文件。

    内嵌代码,将js语句直接写在<script>标签内部。不要在代码中出现”</script>”字符串。

<script type="text/javascript">
	document.write("hello world!");
</script>

    外联文件,<script>标签的src属性指向.js文件。

<script type="text/javascript" src="demo.js"></script>

注意:

    (1)尽可能使用外联文件引入,src可以指向同一服务器或其它任何域中的文件。

    (2)建议放在<body>中,靠近结束标签的位置。

    (3)嵌入代码和外联文件必须分开添加。如果在带有src属性的<script>内部添加额外的js代码,嵌入的代码会被忽略。

    (4)使用defer属性让脚本在文档完全呈现之后再顺序执行,async属性同样让脚本立即下载延迟执行,但不保证顺序。

    (5)<noscript>指定在不支持脚本的浏览器中显示的替代内容。

二、调试器

    刚开始学习,可以用记事本编写js代码。

    Visual Studio Code(IDE),Chrome DevTools(F12调试工具,Sources、Console面板)。

    在代码中插入alert语句,如果弹出相应内容,则之前的代码没有问题,可以缩小问题范围。console.log()把信息输出在Console里,不会影响用户使用。

    设置断点,启动程序进入调试状态,在调试终端输入一个表达式可以得到结果。或F12,Console里输入表达式可以得到结果。

    Elements:调试HTML和CSS,对二者进行增、删、查、改。点击左上角Select an element,点击想要查看代码的元素,可以选中相应代码。操作都是暂时的,如果刷新则恢复之前的样子。

    Network:网站所有的网络请求,或与后端调试接口时使用。

    Sources:网站所有资源(CSS、图片、js等),在js文件中设置断点调试js。

    Console:类似命令行工具,直接写js代码来执行,或展示输出内容,输出错误和调试信息。

    Resources:网站的本地数据资源,如cookie、strorage等。

    Timeline、Profiles、Audits:调试页面性能。

    IE早期的版本不会自动更新,从IE6~IE11都有。IE8+版本自带调试工具,可以调试IE7到安装的版本之间的任意版本(仿真->文档模式)。安装IETester软件,查看IE6效果;安装IE6浏览器及Internet Explorer Developer Toolbar工具,才能调试。

三、基本概念

1. 标识符

    由字母、下划线(_)、美元符号($)和数字组成,不以数字开头。

    区分大小写。按照惯例,第一个字母小写,剩下每个单词首字母大写。

    不能与关键字、保留字、true、false和null冲突。

2. 关键字和保留字 

    关键字表示控制语句的开始或结束,或用于执行特定操作等。使用关键字作标识符导致”Identifier Expected”错误。

    保留字有可能在将来用作关键字。

                                                                                     ECMA-262定义的关键字

break

do

instanceof

typeof

case

else

new

var

catch

finally

return

void

continue

for

switch

while

debugger

function

this

with

default

if

throw

delete

in

try

 

 

                                                                        ECMA-262第5版非严格模式下的保留字

class

enum

extends

super

const

export

import

 

3. 注释

    // 单行注释

    /*

        * 这是一个多行(块级)注释

        * 每行开头*不是必须,为了提高注释可读性

    */

4. 严格模式

    为js定义了一种不同的解析和执行模型。消除js语法的一些不合理、不严谨、不安全问题,减少浏览器怪异行为并保证代码运行安全;提高编译器效率,增加运行速度。

    “use strict”;是一个编译指示,告诉支持的js引擎切换到严格模式。

    全局使用严格模式:

<script type="text/javascript">
    "use strict";
</script>

    函数内使用严格模式:

<script type="text/javascript">
    (function(){
		"use strict";
		console.log("hello world!");
    })();
</script>

    严格模式下,

    eval和arguments不能作为标识符或对象属性名;

    给未经声明的变量赋值会抛出ReferenceError错误;

    不允许使用with语句,否则语法错误;

    函数中不能出现两个参数同名的情况,重写arguments的值会导致语法错误;

    在外部访问不到eval()中创建的任何变量或函数,为eval赋值也会导致错误。

5. 变量

    ECMAScript的变量是松散类型,可以保存任何类型(Undefined、Null、Boolean、String、Number、Object)的数据。变量的值及其数据类型可以在脚本的生命周期内改变。

    声明变量:建议初始化变量前一定要先声明。

    var 变量名;  //未初始化的变量保存undefined

    var 变量名=”hi”;  //定义变量的同时初始化,并不会为变量名标记类型

    var message=”hi”,

                found=false,

                   age=24;  //用一条语句定义多个变量

    定义在任何函数之外的变量属于全局空间,在网页的任何地方都可以使用。定义在某个函数内部的变量属于局部空间,只在函数内部有效。js中最小作用域是函数内部,没有块级作用域,在块级元素内定义的变量在外面也可以被访问。如果定义了许多嵌套函数,整体变量查找效率会大大降低,如果在一个循环进行查找且查找层级较多,需要注意。

function test(){
    var message="hi"; //局部变量
}
test();
alert(message); //错误!

//全局变量在程序的任何位置都可以改写,有命名冲突,使程序不稳定
var test="some value";  //全局变量,相当于变量是window对象上的属性

window.test="some value";  //全局变量

function test(){
    message="hi"; //全局变量,没有使用var声明时,隐性产生全局变量
}
test();
alert(message); //"hi"

function todo(){
var a=test="some value";
}  //全局变量test
//2、3、4使用delete可以成功删除该属性。

    js具有自动垃圾回收机制,找出不再使用的变量,垃圾收集器按一定时间间隔(影响性能)释放其占用的内存。“标记清除”是目前主流的垃圾回收算法,给当前不使用的值加上标记,再回收内存。另一种算法是“引用计数”,跟踪记录所有值被引用的次数,当代码中存在循环引用现象时会导致问题。及时解除不再使用的全局对象、全局对象属性及循环引用变量的引用,确保有效回收内存。

6. 操作符

    “JavaScript的很多奇技淫巧,都来自于对运算符的灵活使用。”

    ECMAScript操作符的不同之处在于,能适应数值、布尔值、字符串、对象。用Number()进行类型转换,或应用于对象时相应操作符会调用对象的valueOf()和/或toString()方法,以便取得可以操作的值。

(1)算术运算符:++  --  +  -  *  /  %

    在操作数为非数值的情况下会执行自动类型转换。

    对非数值用+(一元)时,会像Number()函数一样对该值执行转换。

    使用加法操作符+时,如果其中一个操作数是字符串,则把另一个操作数也转换为字符串,并将两字符串拼接。

(2)位操作符:~  &  |  ^  <<  >>  >>>

    ~ 非,操作数的负值减1;

    >> 有符号的右移,用符号位的值填充所有空位;

    >>> 无符号位的右移,以0填充空位,结果非常大。

(3)逻辑操作符:!  &&  ||

    !将操作数转换为一个布尔值,然后求反,最终返回布尔值。!!:即Boolean()的值。

    &&和||是短路操作符。x&&y如果x表达式转换为Boolean值为false,则不运行表达式y直接返回x表达式运行结果,替代if-else。x||y如果x表达式运行结果转换为Boolean值为true,则不运行表达式y而直接返回x表达式的运行结果。||常用于避免为变量赋null或undefined值。为变量提供默认值var a=b||1,为某些函数提供默认参数,如果没有传入b则a默认为1。在有一个操作数不是布尔值时,就不一定返回Boolean值。

    var b=1-0&&(function(){return 1+1})();  //2

    var b=1-0||(function(){return 1+1})();  //1

(4)关系操作符:<  >  <=  >=  ==  !=(先强制转型)  ===  !==(不转型)

    比较操作符,如果两个操作数都是字符串,则比较字符串对应位置的字符编码值。如果有一个操作数是数值,则将另一个操作数转换为数值,进行数值比较。

    ===判断左右两边对象或值是否类型相同且值相等。==判断操作符两边对象或值是否相等,类型不同时,使用Number()转换。例外规则,null==undefined,null/undefined进行==运算时不进行隐式类型转换。通常把值转为Boolean值,进行条件判断。

var a="123";  var b="123";  var c="4";
var oa=new String("123");  var ob=new String("123");  var oc=oa;
a===oa;  //false,a为值类型,oa为对象类型
oa===ob;  //false,不是同一个引用
oa===oc;  //true,同一个引用
a===b;  //true,值相等,且都是值类型
a===c;  //false
"99"==99;  //true
new String("99")==99;  //true
false=="0";  //true
0==null;  //false
"undefined"==undefined;  //false

(5)条件操作符:? :  代替if-else

(6)赋值操作符:=  +=  -=  *=  /=  %=  <<=  >>=  >>>=

(7)逗号运算符:,

    连续运算符,[‘A’,1,2,3][‘B’,3,4,5]->[‘A’,1,2,3][5]->undefined。

(8)对象运算符:new  delete  .  []  instanceof

    运算符优先级,同一优先级则从左至右进行计算。

    很多运算符可以进行快捷的操作或代码编写,多积累这样的技巧。

7. 语句

    语句中不要省略;和{}。

    赋值语句:a=1+2; 返回值3,隐式将变量a声明为全局变量

    声明语句:var a=1+2; 无返回值,是一个语法结构,而非纯粹运算符操作的结果

    if、do-while、while、for、break、continue、label、try/catch/finally、throw语句。

(1)for-in语句

    for(var 属性名 in 对象名){}  遍历对象的属性。

    ECMAScript对象的属性没有顺序,所有属性都会被返回一次,但返回的顺序由引擎决定。确认对象的值不是null或undefined,否则可能出错。

function Car(id,type,color){
	this.type=type;
	this.color=color;
	this.id=id;
}
Car.prototype.start=function(){
	console.log(this.type+"start");
}

var benz=new Car("benz","black",12169);
for(var key in benz){
	if(benz.hasOwnProperty(key)){
		console.log(key+":"+benz[key]);
    }
}
//type:benz  color:black  id:12169

(2)with语句

    with(对象名){} 

    将代码的作用域设置到一个特定的对象中,或暂时改变变量的作用域链,将with语句中的对象添加到作用域链的头部。简化多次编写同一对象的工作。with语句可能导致执行性能下降,不建议使用with语句。

(function(){
    with(Math){
        var x=cos(3*PI)+sin(LN10);
        var y=tan(14*E);
    }
})();

(3)switch-case语句

    可以使用任何数据类型,case值可以是常量、变量、表达式等。比较值时使用全等操作符。

(4)无返回值的语句

    空语句; 

    变量声明语句var a=b;  函数声明function a(){}  break/continue/label

    return行如果没有其它语句就返回空值。

猜你喜欢

转载自blog.csdn.net/yaocong1993/article/details/81211842