JavaScript语法和数据类型

版权声明:笔记随便写写 https://blog.csdn.net/aaxin_666/article/details/86659564

基础

JavaScript 借鉴了 Java 的大部分语法,但同时也受到 Awk,Perl 和 Python的影响。

JavaScript 是区分大小写的,并使用 Unicode 字符集。举个例子,可以将单词 Früh (在德语中意思是“早”)用作变量名
但是,由于 JavaScript 是大小写敏感的,因此变量 früh 和 Früh 则是两个不同的变量。

在 JavaScript 中,指令被称为语句 Statement,并用分号(;)进行分隔。

如果一条语句独占一行的话,那么分号是可以省略的。(译者注:并不建议这么做。)但如果一行中有多条语句,那么这些语句必须以分号分开。 ECMAScript 规定了在语句的末尾自动插入分号(ASI)。(如果想要了解更多信息,请参阅 JavaScript 词法语法 。)虽然不是必需的,但是在一条语句的末尾加上分号是一个很好的习惯。这个习惯可以大大减少代码中产生 bug 的可能性。

Javascript 源码从左往右被扫描并转换成一系列由 token 、控制字符、行终止符、注释和空白字符组成的输入元素。空白字符指的是空格、制表符和换行符等


注释

// 单行注释

/* 这是一个更长的,
多行注释
*/

/* 然而, 你不能, /* 嵌套注释 */ 语法错误 */

在代码执行过程,注释将被自动跳过(不执行)


声明

有三种声明方式‘’

var 声明一个变量
let 声明一个块作用域的局部变量,可选初始化吧一个值
const 声明一个块作用域的只读常量

变量

在应用程序中,使用变量来作为值的符号名。变量的名字又叫做标识符,其需要遵守一定的规则。

一个 JavaScript 标识符必须以字母、下划线(_)或者美元符号($)开头;后续的字符也可以是数字(0-9)。因为 JavaScript 语言是区分大小写的,所以字母可以是从“A”到“Z”的大写字母和从“a”到“z”的小写字母

声明变量

没有太多的东西
值得关注的是: 变量的作用域

变量求值

你可以使用 undefined 来判断一个变量是否已赋值。在以下的代码中,变量input未被赋值,因此 if 条件语句的求值结果是 true 。

var input;

undefined 值在布尔类型环境中会被当做false。
数值环境中undefined会被转换为NAN。

当你对一个 null 变量求值时,空值 null 在数值类型环境中会被当作0来对待,而布尔类型环境中会被当作 false

var n = null;
console.log(n*32);

变量的作用域

在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问。在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问。

ECMAScript 6 之前的 JavaScript 没有 语句块 作用域;相反,语句块中声明的变量将成为语句块所在函数(或全局作用域)的局部变量。例如,如下的代码将在控制台输出 5,因为 x 的作用域是声明了 x 的那个函数(或全局范围),而不是 if 语句块。

if (true) {
var x = 5;
}
console.log(x); // 5

如果使用ES6中的let 声明,上述行为将发生变化:

if (true) {
let y = 5;
}
console.log(y); // ReferenceError: y 没有被声明

变量提升

JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。

/**
 * 例子1
 */
console.log(x === undefined); // true
var x = 3;


/**
 * 例子2
 */
// will return a value of undefined
var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();

由于存在变量提升,一个函数中所有的var语句应尽可能地放在接近函数顶部的地方。这个习惯将大大提升代码的清晰度。
在 ECMAScript 6 中,let(const)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。

console.log(x); // ReferenceError
let x = 3;

函数提升

对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。

foo(); // "bar"

function foo() {
  console.log("bar");
}


/* 函数表达式 */

baz(); // 类型错误:baz 不是一个函数

var baz = function() {
  console.log("bar2");
};

全局变量

实际上,全局变量是全局对象的属性,全局对象是 window ,所以你可以用形如 window.variable 的语法来设置和访问全局变量。因此,你可以通过指定 window 或 frame 的名字,在当前 window 或 frame 访问另一个 window 或 frame 中声明的变量。例如,在文档里声明一个叫 phoneNumber 的变量,那么你就可以在子框架里使用 parent.phoneNumber 的方式来引用它。

常量

const PI = 3.14;

常量不可以通过重新赋值改变其值,也不可以在代码运行时重新声明。它必须被初始化为某个值。

常量的作用域规则与 let 块级作用域变量相同。若省略const关键字,则该标识符将被视为变量。

对象属性被赋值为常量是不妥当的,数组的被定义为常量也是不受保护的。


数据结构和类型

最新的 ECMAScript 标准定义了7种数据类型:

六种基本数据类型:
布尔值(Boolean),有2个值分别是:true 和 false.
null , 一个表明 null 值的特殊关键字。 JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同。
undefined ,和 null 一样是一个特殊的关键字,undefined 表示变量未定义时的属性。
数字(Number),整数或浮点数,例如: 42 或者 3.14159。
字符串(String),字符串是一串表示文本值的字符序列,例如:“Howdy” 。
代表(Symbol) ( 在 ECMAScript 6 中新添加的类型).。一种实例是唯一且不可改变的数据类型。
以及对象(Object)。

数据类型的转换

JavaScript是一种动态类型语言(dynamically typed language)。这意味着你在声明变量时可以不必指定数据类型,而数据类型会在代码执行时会根据需要自动转换。因此,你可以按照如下方式来定义变量:

var answer = 42;
answer = “thanks for all the fish…”
因为 JavaScript 是动态类型的,这种赋值方式并不会提示出错。

在包含的数字和字符串的表达式中使用加法运算符(+),JavaScript 会把数字转换成字符串。

x = “The answer is” + 42;
“37” - 7 //30

字符串转换为数字

有一些方法可以将内存中表示一个数字的字符串转换为对应的数字。

parseInt()和parseFloat()
参见:parseInt()和parseFloat()的相关页面。

parseInt 方法只能返回整数,所以使用它会丢失小数部分。另外,调用 parseInt 时最好总是带上进制(radix) 参数,这个参数用于指定使用哪一种进制。

JavaScript 特殊字符
字符 意思
\0 Null字节
\b 退格符
\f 换页符
\n 换行符
\r 回车符
\t Tab (制表符)
\v 垂直制表符
’ 单引号
" 双引号
\ 反斜杠字符(\)
\XXX 由从0到377最多三位八进制数XXX表示的 Latin-1 字符。例如,\251是版权符号的八进制序列。
\xXX 由从00和FF的两位十六进制数字XX表示的Latin-1字符。例如,\ xA9是版权符号的十六进制序列。
\uXXXX 由四位十六进制数字XXXX表示的Unicode字符。例如,\ u00A9是版权符号的Unicode序列。见Unicode escape sequences (Unicode 转义字符).
\u{XXXXX} Unicode代码点 (code point) 转义字符。例如,\u{2F804} 相当于Unicode转义字符 \uD87E\uDC04的简写。


流程控制与错误处理

在JavaScript中,任何表达式(expression)都可以看作一条语句(statement),每条语句可以使用分号(;)来分隔。你可以在每行书写一条语句;也可以在一行书写多条语句。但是我们推荐在书写代码的时候采用第一种方式,以便于后期的代码维护。

语句块

{statement1; statement2;
statement3;statement4;
}

语句块通常用于流程控制,如if,for,while等等:
重要:在ES6之前,JavaScript没有块作用域,如果你在块的外部声明了一个变量,然后在块中声明了一个相同变量名的变量,并赋予不同的值。那么在程序执行中将会使用块中的值,这样做虽然是合法的,但是这不同于JAVA与C
ECMAScript 2015 开始,使用 let 定义的变量是块作用域的


条件判断语句

if。。。else

当一个逻辑条件为真,用if语句执行一个语句。当这个条件为假,使用可选择的 else 从句来执行这个语句。

if (condition){
	statement1;
	else{
		statement2;
}
}

条件可以是任何返回结果是 true 或 false的表达式。如果条件表达式返回的是 true,statement_1 会被执行;否则,statement_2 被执行。statement_1 和 statement_2 可以是任何语句,
你也可以组合语句通过使用 else if 来测试连续的多种条件判断,就像下面这样:

if (condition_1) {
  statement_1;
}
[else if (condition_2) {
  statement_2;
}]
...
[else if (condition_n_1) {
  statement_n_1;
}]
[else {
  statement_n;
}]

False 等效值

下面这些值将被计算出 false (also known as Falsy values):

false
undefined
null
0
NaN
空字符串("")

Switch语句

switch 语句允许一个程序求一个表达式的值并且尝试去匹配表达式的值到一个 case 标签。如果匹配成功,这个程序执行相关的语句。switch 语句如下所示:

switch (expression) {
   case label_1:
      statements_1
      [break;]
   case label_2:
      statements_2
      [break;]
   ...
   default:
      statements_def
      [break;]
}

程序首先查找一个与 expression 匹配的 case 语句,然后将控制权转移到该子句,执行相关的语句。如果没有匹配值, 程序会去找 default 语句,如果找到了,控制权转移到该子句,执行相关的语句。如果没有找到 default,程序会继续执行 switch 语句后面的语句。default 语句通常出现在switch语句里的最后面,当然这不是必须的。

可选的 break 语句与每个 case 语句相关联, 保证在匹配的语句被执行后程序可以跳出 switch 并且继续执行 switch 后面的语句。如果break被忽略,则程序将继续执行switch语句中的下一条语句。


描述

try语句包含了由一个或者多个语句组成的try块, 和至少一个catch子句或者一个finally子句的其中一个,或者两个兼有, 下面是三种形式的try声明:

try…catch
try…finally
try…catch…finally
catch子句包含try块中抛出异常时要执行的语句。也就是,你想让try语句中的内容成功, 如果没成功,你想控制接下来发生的事情,这时你可以在catch语句中实现。 如果有在try块中有任何一个语句(或者从try块中调用的函数)抛出异常,控制立即转向catch子句。如果在try块中没有异常抛出,会跳过catch子句。

finally子句在try块和catch块之后执行但是在下一个try声明之前执行。无论是否有异常抛出或捕获它总是执行。

你可以嵌套一个或者更多的try语句。如果内部的try语句没有catch子句,那么将会进入包裹它的try语句的catch子句。


循环和迭代

for语句

一个for循环会一直重复执行,直到指定的循环条件为fasle。 JavaScript的for循环和Java与C的for循环是很相似的。一个for语句是这个样子的:

for ([initialExpression]; [condition]; [incrementExpression])
statement

当一个for循环执行的时候,会发生以下事件:

如果有初始化表达式initialExpression,它将被执行。这个表达式通常会初始化一个或多个循环计数器,但语法上是允许一个任意复杂度的表达式的。这个表达式也可以声明变量。
计算condition表达式的值。如果condition的值是true,循环中的statement会被执行。如果condition的值是false,for循环终止。如果condition表达式整个都被省略掉了,condition的值会被认为是true。
循环中的 statement被执行。如果需要执行多条语句,可以使用块 ({ … })来包裹这些语句。
如果有更新表达式incrementExpression,执行它.
然后流程回到步骤2。

do-while 语句

do…while 语句一直重复直到指定的条件求值得到假(false)

do
statement
while (condition);

statement 在检查条件之间会执行一次。要执行多条语句(语句块),要使用块语句 ({ … }) 包括起来。 如果 condition 为真(true),statement 将再次执行。 在每个执行的结尾会进行条件的检查。当 condition 为假(false),执行会停止并且把控制权交回给 do…while 后面的语句。

while语句

一个 while 语句只要指定的条件求值为真(true)就会一直执行它的语句块

while (condition){
statement
}

labeled语句

一个 label 提供了一个可以让你引用到您程序别的位置的标识符。例如,你可以用 label 标识一个循环, 然后使用 break 或者 continue 来指出程序是否该停止循环还是继续循环。

label 的值可以是任何的非保留字的 JavaScript 标识符, statement 可以是任意你想要标识的语句(块)

var num = 0;  
  outPoint:  
  for(var i = 0; i < 10; i++)  
  {  
     for(var j = 0; j < 10; j++)  
      {  
          if(i == 5 && j == 5)  
          {  
              continue outPoint;  
          }  
          num++;  
      }  
  }  
  alert(num);  //95

break语句

一般使用break语句终止循环,

for…in…语句

这个 for…in 语句循环一个指定的变量来循环一个对象所有可枚举的属性。JavaScript 会为每一个不同的属性执行指定的语句。

for (variable in object) {
  statements
}

猜你喜欢

转载自blog.csdn.net/aaxin_666/article/details/86659564