简介
一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的直译语言。它已经由 ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、FireFox、Safari、Opera)支持。 JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本,数组,日期以及正则表达式等,不支持I/O,比如网络,存储和图形等,但这些都可以由它的宿主环境提供支持。
在客户端,JavaScript 在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的 HTML5 和 CSS3 语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如 Node.js。即时编译(英语:Just-in-time compilation),又译及时编译、实时编译,动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而解释执行的则是一句一句边运行边翻译。
即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。
即时编译器有两种类型,一是字节码翻译,二是动态编译翻译。
1. 与一般编程语言不同的部分(主要与 C++ 做对比)
1.1 数据类型
变量 | 解释 | 示例 |
---|---|---|
String | 字符串,一段文本。 要指示变量是字符串,你应该将它们用引号包裹起来。 | var myVariable = 'Bob'; |
Number | 数字,一个数字。不用引号包围。 | var myVariable = 10; |
Boolean | 布尔型,一个 True/False (真 / 假)值。 true/false 是 JS 里的特殊关键字,不需要引号。 | var myVariable = true; |
Array | 数组,一种允许你存储多个值在一个引用里的结构。 |
var myVariable = [1,'Bob','Steve',10]; 调用数组的元素只需: myVariable[0] ,myVariable[1] , 等等。 |
Object | 对象,基本上 JavaScript 里的任何东西都是对象,而且都可以被储存在变量里。将这个记在脑子里。 |
var myVariable = document.querySelector('h1'); 上面所有示例都是对象。 |
数组的使用:
var coffees = ["French Roast", "Colombian", "Kona"]; // 三个元素
var a=[3]; //一个元素
console.log(a.length); // 1
console.log(a[0]); // 3
1.2 运算符
运算符 | 解释 | 符号 | 示例 |
---|---|---|---|
全等 | 一致运算符不会进行类型转换,仅当操作数严格相等时返回true | === |
3 === 3 // true 3 === '3' // false var object1 = {"value":"key"}, object2={"value":"key"}; object1 === object2 //false
|
非全等 | 不一致运算符当操作数不相等或不同类型时返回true | !== |
3 !== '3' // true 4 !== 3 // true
|
1.3 声明以及初始值
JavaScript 有三种声明方式:var let const
- var: 声明一个变量,可选择将其初始化为一个值。
- let: 声明一个块作用域的局部变量(block scope local variable),可选择将其初始化为一个值。
- const: 声明一个只读的常量。
初始值:用 var 或 let 声明的且未赋初值的变量,值会被设定为 undefined。
- undefined 值在布尔类型环境中会被当作 false。
- 数值类型环境中 undefined 值会被转换为 NaN。
- 当你对一个 null 变量求值时,空值 null 在数值类型环境中会被当作 0 来对待,而布尔类型环境中会被当作 false。
示例:
var n = null;
typeof(n);
// "object"
// The Null type has exactly one value, called null.
console.log(n * 32); // 0
1.4 变量的作用域
ECMAScript 6 之前的 JavaScript 没有语句块作用域;相反,语句块中声明的变量将成为语句块所在代码段的局部变量。例如,如下的代码将在控制台输出 5,因为 x 的作用域是声明了 x 的那个函数(或全局范围),而不是 if 语句块。
if (true) {
var x = 5;
}
console.log(x); // 5
如果使用 ECMAScript 6 中的 let 声明,上述行为将发生变化。
if (true) {
let y = 5;
}
console.log(y); // ReferenceError: y is not defined
1.5 变量提升
JavaScript 变量的另一特别之处是,你可以引用稍后声明的变量而不会引发异常。这一概念称为变量声明提升(hoisting);JavaScript 变量感觉上是被“提升”或移到了所有函数和语句之前。然而提升后的变量将返回 undefined 值。所以在使用或引用某个变量之后进行声明和初始化操作,这个被提升的引用仍将得到 undefined 值。
var x;
console.log(x === undefined); // logs "true"
x = 3;
在 ECMAScript 2015 中,let(const)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出错误 ReferenceError。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。
console.log(x); // ReferenceError
let x = 3;
1.6 函数提升
对于函数,只有函数声明会被提升到顶部,而不包括函数表达式。
/* 函数声明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函数表达式 表达式定义的函数,称为匿名函数。匿名函数没有函数提升。*/
baz(); // TypeError: baz is not a function
//此时的"baz"相当于一个声明的变量,类型为undefined。由于baz只是相当于一个变量,因此浏览器认为"baz()"不是一个函数。
var baz = function() {
console.log("bar2");
};
1.7 匿名函数
匿名函数(英语:anonymous function)是指一类无需定义标识符(函数名)的函数或子程序,普遍存在于多种编程语言中。
1958 年 LISP 首先采用匿名函数,自此之后,越来越多编程语言陆续采用,主流的编程语言如 PHP 和 C++ 也在不久前采用。
示例:
document.querySelector('html').onclick = function() {};
Tips
- 我们将 <script> 元素放在 HTML 文件底部的原因是,浏览器解析 HTML 似乎按照代码出现的顺序来的。如果 JavaScript 被首先读取,它也应该影响下面的 HTML,但有时会出现问题,因为 JavaScript 会在 HTML 之前被加载,如果 JavaScript 代码出现问题则 HTML 不会被加载。所以将 JavaScript 代码放在底部是最好的选择。
工具
参考
- JavaScript - 维基百科,自由的百科全书:https://zh.wikipedia.org/wiki/JavaScript
- JavaScript | MDN :https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
- JavaScript 指南 - JavaScript | MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide
网友评论