基本例子
var lastname="Doe", age=30, job="carpenter";
一条语句中声明的多个变量不可以同时赋同一个值
var x,y,z=1; //其中 x, y 为 undefined, z 为 1
ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。const 定义常量与使用 let 定义的变量相似:二者都是块级作用域。
let 声明的变量只在 let 命令所在的代码块内有效
例子:
var i = 5; for (var i = 0; i < 10; i++) { // 一些代码... } // 这里输出 i 为 10
let i = 5; for (let i = 0; i < 10; i++) { // 一些代码... } // 这里输出 i 为 5
const 声明一个只读的常量,一旦声明,常量的值就不能改变
例子:
const PI = 3.141592653589793; PI = 3.14; // 报错 PI = PI + 10; // 报错
JavaScript 中,var 关键字定义的变量可以在使用后声明,也就是变量可以先使用再声明(变量提升)。let, const 关键字定义的变量则不可以在使用后声明,也就是变量需要先声明再使用。
例子:
// 在这里可以使用 carName1 变量 var carName1; // 在这里不可以使用 carName2 变量 let carName2; // 在这里不可以使用 carName3 变量 const carName3 = "Volvo";
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
例子:
var carname="Volvo XC60"; var x1=34.00; //JavaScript 只有一种数字类型。数字可以带小数点,也可以不带 var x=true;
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔。
对象例子:
var person = { firstName: "John", lastName : "Doe", id : 5566, fullName : function() //对象的方法 { return this.firstName + " " + this.lastName; } }; //对象属性有两种寻址方式,如下所示 name=person.lastname; name=person["lastname"];
数组例子:
var cars=new Array(); //等价于var cars=new Array; cars[0]="Saab"; cars[1]="Volvo"; cars[2]="BMW"; //condensed array var cars=new Array("Saab","Volvo","BMW"); //literal array var cars=["Saab","Volvo","BMW"];
大部分同C/C++。
大部分同C/C++,也支持条件运算符。
运算符 | 描述 |
---|---|
== | 等于 |
=== | 绝对等于(值和类型均相等) |
!= | 不等于 |
!== | 不绝对等于(值和类型有一个不相等,或两个都不相等) |
if (time<10) { document.write("<b>早上好</b>"); } else if (time>=10 && time<20) { document.write("<b>今天好</b>"); } else { document.write("<b>晚上好!</b>"); }
var d=new Date().getDay(); switch (d) { case 6:x="今天是星期六"; break; case 0:x="今天是星期日"; break; default: x="期待周末"; } document.getElementById("demo").innerHTML=x;
例子1:
for (var i=0;i<cars.length;i++) { document.write(cars[i] + "<br>"); }
例子2:
var person={fname:"Bill",lname:"Gates",age:56}; for (x in person) // x 为属性名 { txt=txt + person[x]; }
例子1:
while (i<5) { x=x + "The number is " + i + "<br>"; i++; }
例子2:
do { x=x + "The number is " + i + "<br>"; i++; } while (i<5);
break 语句用于跳出循环
continue 用于跳过循环中的一个迭代
continue 语句(带有或不带标签引用)只能用在循环中;break 语句(不带标签引用),只能用在循环或 switch 中;通过标签引用,break 语句可用于跳出任何 JavaScript 代码块
例子:
cars=["BMW","Volvo","Saab","Ford"]; list: { document.write(cars[0] + "<br>"); document.write(cars[1] + "<br>"); document.write(cars[2] + "<br>"); break list; document.write(cars[3] + "<br>"); document.write(cars[4] + "<br>"); document.write(cars[5] + "<br>"); }
函数声明:
分号是用来分隔可执行JavaScript语句。 函数声明不以分号结束,因为它不是一个可执行语句。
function myFunction(a, b) { return a * b; }
函数表达式
匿名函数存储在变量中,不需要函数名称,通常通过变量名来调用。 匿名函数以分号结尾,因为它是一个执行语句。
var x = function (a, b) {return a * b}; var z = x(4, 3);
JavaScript 函数构造器
不推荐。在 JavaScript 中,很多时候,需要避免使用 new 关键字。
var myFunction = new Function("a", "b", "return a * b"); var x = myFunction(4, 3);
函数提升
提升应用在变量的声明与函数的声明。因此,函数可以在声明之前调用。使用表达式定义函数时无法提升。
自调用函数
如果表达式后面紧跟 () ,则会自动调用。不能自调用声明的函数。
(function () { var x = "Hello!!"; // 我将调用自己 })(); // 通过添加括号,来说明它是一个函数表达式
以上函数实际上是一个匿名自我调用的函数 (没有函数名)。
箭头函数
有的箭头函数都没有自己的 this,故不适合定义一个对象的方法。箭头函数是不能提升的,所以需要在使用之前定义。
// ES5 var x = function(x, y) { return x * y; } // ES6 const x = (x, y) => x * y;
JavaScript 函数对参数的值没有进行任何的检查。ES5 中如果函数在调用时未提供隐式参数,参数会默认设置为: undefined。ES6 支持函数带有默认参数。
显式参数——类似于C语言中的形参
隐式参数——类似于C语言中的实参
如果函数调用时设置了过多的参数,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用。JavaScript 函数有个内置的对象 arguments 对象,argument 对象包含了函数调用的参数数组。
x = findMax(1, 123, 500, 115, 44, 88); function findMax() { //利用 arguments 对象可以很方便地找到最大的一个参数的值 var i, max = arguments[0]; if(arguments.length < 2) return max; for (i = 0; i < arguments.length; i++) { if (arguments[i] > max) { max = arguments[i]; } } return max; }
传值
隐式参数的改变在函数外是不可见的。
传引用
在JavaScript中,可以引用对象的值。因此我们在函数内部修改对象的属性就会修改其初始的值。
修改对象属性在函数外是可见的。
JavaScript 函数有 4 种调用方式,每种方式的不同在于 this 的初始化。一般而言,在Javascript中,this指向函数执行时的当前对象。
普通调用(当函数没有被自身的对象调用时 this 的值就会变成全局对象)
function myFunction(a, b) { return a * b; } //在浏览器中的页面对象是浏览器窗口(window 对象)。以上函数会自动变为 window 对象的函数。 //故myFunction() 和 window.myFunction() 是一样的 myFunction(10, 2); window.myFunction(10, 2);
function myFunction() { return this; } myFunction(); // 返回 window 对象
函数作为方法调用(函数作为对象方法调用,会使得 this 的值成为对象本身)
var myObject = { firstName:"John", lastName: "Doe", fullName: function () { return this; } } myObject.fullName(); // 返回所有者对象
使用构造函数调用函数
构造函数的调用会创建一个新的对象。新对象会继承构造函数的属性和方法。构造函数中 this 关键字没有任何的值,this 的值在函数调用实例化对象(new object)时创建。
// 构造函数: function myFunction(arg1, arg2) { this.firstName = arg1; this.lastName = arg2; } // This creates a new object var x = new myFunction("John","Doe"); x.firstName; // 返回 "John"
作为函数方法调用函数
在 JavaScript 中, 函数是对象。JavaScript 函数有它的属性和方法。call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
function myFunction(a, b) { return a * b; } myObject = myFunction.call(myObject, 10, 2); // 返回 20 myArray = [10, 2]; myObject = myFunction.apply(myObject, myArray); // 返回 20
私有变量可以用到闭包。
计数器困境
var counter = 0; function add() { return counter += 1; } add(); add(); add(); // 计数器现在为 3
问题:页面上的任何脚本都能改变计数器,即便没有调用 add() 函数。
解决办法
var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add(); // 计数器为 3
try 语句测试代码块的错误
catch 语句处理错误
throw 语句创建自定义错误,抛出的异常可以是 JavaScript 字符串、数字、逻辑值或对象
finally 语句在 try 和 catch 语句之后,无论是否有触发异常,该语句都会执行
基本例子:
function myFunction() { var message, x; message = document.getElementById("p01"); message.innerHTML = ""; x = document.getElementById("demo").value; try { if(x == "") throw "值是空的"; if(isNaN(x)) throw "值不是一个数字"; x = Number(x); if(x > 10) throw "太大"; if(x < 5) throw "太小"; } catch(err) { message.innerHTML = "错误: " + err + "."; } finally { document.getElementById("demo").value = ""; } }
可以设置为 null 来清空对象
任何变量都可以通过设置值为 undefined 来清空,类型为 undefined
typeof [1,2,3,4] // 返回 object
null 和 undefined 的值相等,但类型不等
typeof undefined // undefined typeof null // object null === undefined // false null == undefined // true