JavaScript 借鉴了 Java 的大部分语法,但同时也受到 Awk,Perl 和 Python的影响。JavaScript 是区分大小写的,并使用 Unicode 字符集。
在 JavaScript 中,指令被称为语句(Statement),并用分号(;)进行分隔。如果一条语句独占一行的话,那么分号是可以省略的。但如果一行中有多条语句,那么这些语句必须以分号分开。
注释
Javascript 注释的语法和 C++ 或许多其他语言类似,在代码执行过程中,注释将被自动跳过(不执行)。
你可能会在一些 JavaScript 脚本中见到像这样#!/usr/bin/env node的第三种注释,这种注释我们称为hashbang 注释 (hashbang comment),这种注释被用来指定执行 JaveScript 脚本的引擎的路径
// 单行注释
/* 这是一个更长的,
多行注释
*/
/* 然而,你不能,/* 嵌套注释 */ 语法错误 */
声明
声明就是变量前面的关键字,JavaScript 有三种声明方式。
var:声明一个变量,可选初始化一个值。
let:声明一个块作用域的局部变量,可选初始化一个值。
const:声明一个块作用域的只读常量,必须初始化一个值。
下面来看看这三种声明有什么区别。
var 定义的变量可以修改,如果不初始化会输出undefined,不会报错。
var a = 1;
// var a;//不会报错
console.log('函数外var定义a:' + a);//可以输出a=1
function change(){
a = 4;
console.log('函数内var定义a:' + a);//可以输出a=4
}
change();
console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4
var 声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用。
for(var i=0;i<=1000;i++){
var sum=0;
sum+=i;
}
alert(sum);//外部可以访问sum变量
let 是块级作用域,函数内部使用let定义后,对函数外部无影响。并且let不能定义同名变量,否则会报错。
JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。所以必须声明’use strict’;后才能使用let声明变量否则浏览并不能显示结果。
let c = 3;
console.log('函数外let定义c:' + c);//输出c=3
function change(){
let c = 6;
console.log('函数内let定义c:' + c);//输出c=6
}
change();
console.log('函数调用后let定义c不受函数内部定义影响:' + c);//输出c=3
if (true) {
let y = 5;
}
console.log(y); // ReferenceError: y 没有被声明
const 用于声明常量,也具有块级作用域 ,也可声明块级。const定义的变量不可以修改,而且必须初始化。
const PI = 3.14;
let和const属于局部变量,不会出现变量提升的情况,全局定义的let和const变量,不属于顶层变量,不属于window的属性。
变量
在应用程序中,使用变量来作为值的符号名。变量的名字又叫做标识符,其需要遵守一定的规则。
一个 JavaScript 标识符必须以字母、下划线(_)或者美元符号($)开头;后续的字符也可以是数字(0-9)。因为 JavaScript 语言是区分大小写的,所以字母可以是从“A”到“Z”的大写字母和从“a”到“z”的小写字母。
每一个变量或者值都有其对应的类型,在JavaScript中定义了 8 种数据类型:字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol、对象(Object)、数组(Array)、函数(Function)。
变量声明
可以使用关键词 var 。例如 var x = 42。这个语法可以用来声明局部变量和全局变量。也可以直接赋值。例如x = 42。在函数外使用这种形式赋值,会产生一个全局变量。在严格模式下会产生错误。因此你不应该使用这种方式来声明变量。或者使用关键词 let 。例如 let y = 13。这个语法可以用来声明块作用域的局部变量。
可以使用解构赋值将对象字面量的属性绑定到变量。就像这样let { bar } = foo。这会创建一个名为bar的变量,并且将foo对像中属性名与之相同的属性的值赋给它。
var x; // x 为 undefined
var x = 5; // 现在 x 为数字
var x = "John"; // 现在 x 为字符串
var x = null; // 现在 x 为 null
var x = true; // 现在 x 为 布尔
变量求值
在弱类型的语言中,不同类型的变量或值可进行一些运算,这主要是因为解释器做了隐式类型转换的工作。
如果是字符串和数字的运算,在进行加运算时,会将数字转换成字符串,然后和另一个字符串进行拼接。
var num1 = '123'
var num2 = 12
var num3 = num1 + num2
console.log(num3) // 预期输出:'12312'
在进行减、乘、除运算,以及大小比较时,会将字符串转换成数字,再和另一个数字进行运算或比较。
var num1 = '123'
var num2 = 12
var num3 = num1 - num2
console.log(num3) // 预期输出:111
var num1 = '123'
var num2 = 12
var num3 = num1 * num2
console.log(num3) // 预期输出:1476
var num1 = '123'
var num2 = 12
var num3 = num1 / num2
console.log(num3) // 预期输出:10.25
var num1 = '123'
var num2 = 15
var t = num1 > num2
console.log(t) // 预期输出:true
如果undefined类型和数字的运算,undefined 值会被转换为 NaN。
var a;
a + 2; // 计算为 NaN
如果是将各种值转换成布尔值,那么数字0,空字符串"",null,undefined 转成布尔值的时候都是false。非0数字,非空字符串,任何数组(即使是空数组),任何对象(即使是空对象) 转成布尔值的时候都是true。
var a = 0
if (a) {
console.log('hello')
} else {
console.log('world')
}
// 当a=0或""或null或undefined的时候,预期输出:world
// 当a=[]或空对象的时候,预期输出:hello
// 当a=-1或"abc"时候,预期输出:hello
变量提升
JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。
console.log(x === undefined); // true
var x = 3;
常量
可以用关键字 const 创建一个只读的常量。常量标识符的命名规则和变量相同:必须以字母、下划线(_)或美元符号($)开头并可以包含有字母、数字或下划线。
常量不可以通过重新赋值改变其值,也不可以在代码运行时重新声明。它必须被初始化为某个值。
常量的作用域规则与 let 块级作用域变量相同。若省略const关键字,则该标识符将被视为变量。
// 这会造成错误
function f() {};
const f = 5;