第 3 章语言基础

任何语言的核心所描述的都是这门语言在最基本的层面上如何工作,涉及语法、操作符、数据类型以及内置功能,在此基础之上才可以构建复杂的解决方案。

区分大小写首先要知道的是,ECMAScript 中一切都区分大小写。

无论是变量、函数名还是操作符,都区分大小写。换句话说,变量 test 和变量 Test 是两个不同的变量。

标识符

所谓标识符,就是变量、函数、属性或函数参数的名称。

  • 第一个字符必须是一个字母、下划线(_)或美元符号($)
  • 剩下的其他字符可以是字母、下划线、美元符号或数字。

注释

ECMAScript 采用 C 语言风格的注释,包括单行注释和块注释。单行注释以两个斜杠字符开头,如: // 单行注释块注释以一个斜杠和一个星号(/)开头,以它们的反向组合(/)结尾,如: /* 这是多行注释 */

严格模式

严格模式是一种不同的 JavaScript 解析和执行模型,ECMAScript 3 的一些不规范写法在这种模式下会被处理,对于不安全的活动将抛出错误。

  • 整个脚本启用严格模式,在脚本开头加上这一行: “use strict”;
  • 也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可: function doSomething() { “use strict”; // 函数体 }

语句

ECMAScript 中的语句以分号结尾。省略分号意味着由解析器确定语句在哪里结尾,如下面的例子所示:
let sum = a + b // 没有分号也有效,但不推荐 let diff = a - b; // 加分号有效,推荐

多条语句可以合并到一个 C 语言风格的代码块中。代码块由一个左花括号({)标识开始,一个右花括号(})标识结束:
if (test) { test = false; console.log(test); }

if 之类的控制语句只在执行多条语句时要求必须有代码块。不过,最佳实践是始终在控制语句中使用代码块,即使要执行的只有一条语句

关键字与保留字

ECMA-262 描述了一组保留的关键字,这些关键字有特殊用途,比如表示控制语句的开始和结束,或者执行特定的操作。按照规定,保留的关键字不能用作标识符或属性名。
break do in typeof case else instanceof var catch export new void class extends return while const finally super with continue for switch yield debugger function this default if throw delete import try

变量

ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据。每个变量只不过是一个用于保存任意值的命名占位符。

var 声明提升

使用 var 时,下面的代码不会报错。这是因为使用这个关键字声明的变量会自动提升到函数作用域顶部:

// 之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码: 
function foo() { var age; console.log(age); age = 26; } foo(); 
// 提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部.
暂时性死区

let 与 var 的另一个重要的区别,就是 let 声明的变量不会在作用域中被提升。

JavaScript 引擎也会注意出现在块后面的 let 声明,只不过在此之前不能以任何方式来引用未声明的变量。在 let 声明之前的执行瞬间被称为“暂时性死区”(temporal dead zone),在此阶段引用任何后面才声明的变量都会抛出 ReferenceError。

for 循环中的 let 声明在 let 出现之前,

for 循环定义的迭代变量会渗透到循环体外部:
for (var i = 0; i < 5; ++i) { // 循环逻辑 } console.log(i); // 5
改成使用 let 之后,这个问题就消失了

数据类型

ECMAScript 有 6 种简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、 String 和 Symbol。
Symbol(符号)是 ECMAScript 6 新增的。还有一种复杂数据类型叫 Object(对象)。
Object 是一种无序名值对的集合。因为在 ECMAScript 中不能定义自己的数据类型,所有值都可以用上述 7 种数据类型之一来表示。

typeof 操作符

因为 ECMAScript 的类型系统是松散的,所以需要一种手段来确定任意变量的数据类型。
typeof 操作符就是为此而生的。对一个值使用 typeof 操作符会返回下列字符串之一

  • "undefined"表示值未定义; "boolean"表示值为布尔值;
  • "string"表示值为字符串; "number"表示值为数值;
  • "object"表示值为对象(而不是函数)或 null;
  • "function"表示值为函数;
  • "symbol"表示值为符号。
    下面是使用 typeof 操作符的例子:
  console.log(typeof message); // "string" 
  console.log(typeof(message)); // "string" 
  console.log(typeof 95); // "number"

Number 类型

Number 类型使用 IEEE 754 格式表示整数和浮点值(在某些语言中也叫双精度值)。最基本的数值字面量格式是十进制整数,直接写出来即可: let intNum = 55;
整数整数也可以用八进制(以 8 为基数)或十六进制(以 16 为基数)字面量表示。对于八进制字面量,第一个数字必须是零(0),然后是相应的八进制数字(数值 0~7)。

1. 浮点值要定义浮点值,数值中必须包含小数点,

而且小数点后面必须至少有一个数字。虽然小数点前面不是必须有整数,但推荐加上。下面是几个例子: let floatNum1 = 1.1; let floatNum2 = 0.1; let floatNum3 = .1; // 有效,但不推荐

Number()

函数基于如下规则执行转换

  • 布尔值,true 转换为 1,false 转换为 0
  • 数值,直接返回。 null,返回 0
  • undefined,返回 NaN
  • 字符串,应用以下规则
  • 如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。
    因此,Number(“1”)返回 1,Number(“123”)返回 123,Number(“011”)返回 11(忽略前面的零)。

String 类型

跟某些语言中使用不同的引号会改变对字符串的解释方式不同,ECMAScript 语法中表示字符串的引号没有区别。

  1. 字符字面量字符串数据类型包含一些字符字面量,用于表示非打印字符或有其他用途的字符,如下表所示:
    字 面 量 含 义 \n 换行 \t 制表 \b 退格 \r 回车 \f 换页 \ 反斜杠(\)
转换为字符串

有两种方式把一个值转换为字符串。首先是使用几乎所有值都有的 toString()方法。这个方法唯一的用途就是返回当前值的字符串等价物。比如:
let age = 11; let ageAsString = age.toString(); // 字符串"11"

字符串插值

字符串插值通过在${}中使用一个 JavaScript 表达式实现:

  let value = 5; 
  let exponent = 'second'; // 
  以前,字符串插值是这样实现的: let interpolatedString = value + ' to the ' + exponent + ' power is ' + (value * value);
   // 现在,可以用模板字面量这样实现: let interpolatedTemplateLiteral = `${ value } to the ${ exponent } power is ${ value * value }`; 

Symbol(符号)

是 ECMAScript 6 新增的数据类型。符号是原始值,且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。

let genericSymbol = Symbol(); let otherGenericSymbol = Symbol(); 
let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');
console.log(genericSymbol == otherGenericSymbol); // false 

Object 类型

ECMAScript 中的对象其实就是一组数据和功能的集合。
对象通过 new 操作符后跟对象类型的名称来创建。开发者可以通过创建 Object 类型的实例来创建自己的对象,然后再给对象添加属性和方法:

  • let o = new Object();
    这个语法类似 Java 每个 Object 实例都有如下属性和方法。
  • constructor:用于创建当前对象的函数。在前面的例子中,这个属性的值就是 Object() 函数.
  • hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性。要检查的属性名必须是字符串(如 o.hasOwnProperty(“name”))或符号。
  • isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型。
  • propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用(本章稍后讨论的)for-in 语句枚举。与 hasOwnProperty()一样,属性名必须是字符串。
  • toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。 toString():返回对象的字符串表示。
  • valueOf():返回对象对应的字符串、数值或布尔值表示。通常与 toString()的返回值相同。因为在 ECMAScript 中 Object 是所有对象的基类,所以任何对象都有这些属性和方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值