《JavaScript核心概念及实践》——1.2 JavaScript语言特性

1.2 JavaScript语言特性

JavaScript是一门动态的、弱类型、基于原型的脚本语言。在JavaScript中“一切皆对象”,在这一方面,它比其他的面向对象的语言来得更为彻底。即使作为代码本身载体的函数(function),也是对象,数据与代码的界限在JavaScript中已经相当模糊。虽然它被广泛应用在Web客户端,但是其应用范围远远未局限于此。下面就这几个特点分别介绍。

1.2.1 动态性
动态性是指,在一个JavaScript对象中,要为一个属性赋值,我们不必事先创建一个字段,只需要在使用的时候做赋值操作即可。如下例:

//定义一个对象
var obj = new Object();

//动态创建属性name
obj.name = "an object";

//动态创建属性sayHi
obj.sayHi = function(){
    return "Hi";
}

obj.sayHi();

当不需要一个对象的属性时,我们可以很轻易地将其从对象上删除。

obj.name
"juntao"

delete obj.name
obj.name

undefined

假如我们使用Java语言,代码可能会是这样:

class Obj{
    String name;
    Function sayHi;

    public Obj(Sting name, Function sayHi){
        this.name = name;
        this.sayHi = sayHi;
    }
}

Obj obj = new Obj("an object", new Function());

可以看出,在静态语言中,需要预先定义好对象需要什么属性,属性自身的类型是什么,当定义完成之后,对象的结构就定下来了,之后都保持这种结构而无法更改。通常对象可能会继承一些自己用不到的方法,而且也无法删除。

另一个有趣的例子是动态地访问一个JavaScript对象的属性。

var key = "property";
print(key);

"property"

var obj = {
    property: "my property"
}

print(obj[key]);

"my property"

应该注意到key是一个变量,其值为“property”,当执行obj[key]时,key被求值为“property”,然后去除obj["property"],这个特性可以使得代码更加简洁清晰,比如可以动态地从代码中生成对象的属性名,然后去除属性值等。

1.2.2 弱类型
与Java、C/C++不同,JavaScript是弱类型的,它的数据类型无需在声明时指定,解释器会根据上下文对变量进行实例化,比如:

//定义一个变量s,并赋值为字符串
var s = "text";
print(s);

//赋值s为整型
s = 12+5;
print(s);

//赋值s为浮点型
s = 6.3;
print(s);

//赋值s为一个对象
s = new Object();
s.name = "object";

print(s.name);

结果为:

text
17
6.3
Object

在JavaScript中,类型是和值关联的,而不是和变量关联。弱类型具有很大的灵活性,在定义变量时无须显式声明。不过,弱类型也有其不利的一面,比如在开发面向对象的JavaScript的时候,没有类型的判断将会是比较麻烦的问题,不过我们可以通过别的途径来解决此问题。

1.2.3 面向对象
虽然与主流的面向对象语言中的面向对象的概念大相径庭,但是在JavaScript中,一切都是对象!只不过JavaScript中,这一点更为彻底一些,甚至用以表达逻辑的函数/代码本身也是对象,比如代码本身可以作为参数传递给其他的代码。

var array = [1, 2, 3, 4, 5];
array.map(function(item){
    return item * 2;
});

运行结果如下。

[2, 4, 6, 8, 10]
数组array中有5个元素,每个元素是一个数字。数组的map方法会接受一个匿名函数,这样对于数组中的每个元素,都会调用这个匿名函数(返回元素乘以2的值),最后把结果放入结果数组。有意思的是此处的map,它可以接受函数作为参数。map函数可以处理更为复杂的场景,比如数组中的每个元素都是一个复杂对象。

var staff = [
    {name: 'abruzzi', age: 24},
    {name: 'bajmine', age: 26},
    {name: 'chris', age: 25}
];

staff.map(function(item){
    return item.name.toUpperCase();
});

运行结果如下。

['ABRUZZI', 'BAJMINE', 'CHRIS']
在上例中,map用以将数组staff中的每个元素的name属性取出,转换为大写字母,并生成新的数组,而将对于那些不关心的其他属性(比如此处的age)排除在结果集之外。

另一个例子是与map很类似的函数filter,用于过滤数组中满足某些条件的元素,filter的使用方法与map一样,也接受一个函数。

staff.filter(function(item){
    return item.age > 24;
});

这样结果中仅包含age大于24的条目。

[
    {name: 'bajmine', age: 26},
    {name: 'chris', age: 25}
]

这两个例子中,可以看到函数可以像其他任何数据类型(字符串、数字)那样,被轻易地传递给其他函数。在JavaScript中一切都是对象。

1.2.4 解释与编译
通常来说,JavaScript是一门解释型的语言,特别是在浏览器中的JavaScript,所有的主流浏览器都将JavaScript作为一个解释型的脚本来进行解析。然而,这并非定则,在Java版的JavaScript解释器Rhino中,脚本可以被编译为Java字节码。Google的V8引擎则直接将JavaScript代码编译为本地代码,无需解释。

解释型的语言有一定的好处,即可以随时修改代码,无需编译,刷新页面即可重新解释,可以实时看到程序的结果,但是由于每一次都需要解释,程序的开销较大;而编译型的语言则仅需要编译一次,每次都运行编译过的代码即可,但是又丧失了动态性。

时间: 2024-12-23 14:19:38

《JavaScript核心概念及实践》——1.2 JavaScript语言特性的相关文章

《JavaScript核心概念及实践》——第2章 基本概念 2.1 数据类型

第2章 基本概念 本章将聚焦于JavaScript中的基本概念,这些概念与传统语言有比较大的不同,因此单独列出一章来做专门描述.理解本章的概念对书中后续章节的概念,代码的行为等会有很大的帮助,读者不妨花比较多的时间阅读本章,即使你对JavaScript已经比较熟悉,也建议通读本章. 本章主要讲述JavaScript中的数据类型(基本类型与引用类型).变量(包括变量的作用域).操作符(主要是一些较为常见,但是不容易从字面上理解的操作符).由于JavaScript中的"一切皆对象",在掌握

《JavaScript核心概念及实践》——1.3 JavaScript应用范围

1.3 JavaScript应用范围 当JavaScript第一次出现的时候,是为了给页面带来更多的动态,使用户可以与页面进行交互.虽然JavaScript在Web客户端取得了很大的成功,但是ECMA标准并没有局限其应用范围.事实上,现在的JavaScript大多运行于客户端,但是仍有部分运行于服务器端,如Servlet.ASP等.当然,JavaScript作为一个独立的语言,同样可以运行在其他的应用程序中,比如Java版的JavaScript引擎Rhino.C语言版的SpiderMonkey等

《JavaScript核心概念及实践》——2.3 运算符

2.3 运算符 运算符,通常是容易被忽略的一个内容,但是一些比较古怪的语法现象仍然可能需要用到运算符的结合率或者其作用来进行解释.JavaScript中,运算符是一定需要注意的地方,有很多具有JavaScript编程经验的人仍然免不了被搞得晕头转向. 我们在这一节主要讲解这样几个运算符,诸如算术运算.位运算等和其他的主流程序设计语言类似,在这里不做讨论. 2.3.1 中括号运算符([]) 中括号([])运算符可用在数组对象和对象上,从数组中按下标取值. var array = ["one&quo

《JavaScript核心概念及实践》——第1章 概述 1.1 JavaScript简史

第1章 概述 1.1 JavaScript简史 20世纪90年代,在早期的Web站点上,所有的网页内容都是静态的.所谓静态是指除了点击超链接外,你无法通过任何方式同页面进行交互,比如让页面元素接受事件,修改字体等.但是人们又迫切地需要一种方式来打破这个局限,于是到了1996年,网景(Netscape)公司开始研发一种新的语言Mocha,并将其嵌入到自己的浏览器Netscape中.这种语言可以通过操纵DOM(Document Object Model,文档对象模型)来修改页面,并加入了对鼠标事件的

JavaScript核心指南 (ECMA-262-3)

本文非常详细的说明了JavaScript的核心概念,也是理解JavaScript解释器的重要基础.中文版本可以看这里,但不一定是最新的内容.所以下面放了英文版本供学习使用. 原文地址点这里. This note is an overview and summary of the "ECMA-262-3 in detail" series. Every section contains references to the appropriate matching chapters so

《Spark大数据分析:核心概念、技术及实践》大数据技术一览

本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第1节,作者穆罕默德·古勒(Mohammed Guller)更多章节内容可以访问"华章计算机"公众号查看. 大数据技术一览 我们正处在大数据时代.数据不仅是任何组织的命脉,而且在指数级增长.今天所产生的数据比过去几年所产生的数据大好几个数量级.挑战在于如何从数据中获取商业价值.这就是大数据相关技术想要解决的问题.因此,大数据已成为过去几年最热门的技术趋势之一.一些非常活跃的开源项目都与大数据

JavaScript Web 应用最佳实践分析

[编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,JavaScript 社区似乎已经陷入了一个时间扭曲隧道.我们现在进行的关于 JavaScript驱动(JavaScript-driven) Web 应用的讨论与2006年"Ajax"出现以及2012年JavaScript"单页应用"流行起来时的讨论如出一辙.只要我们站在巨人

《Spark大数据分析:核心概念、技术及实践》一1.2 数据序列化

  本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第1.2节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问"华章计算机"公众号查看. 1.2 数据序列化 数据有自己的生命周期,独立于创建或使用它的程序.大多数情况下,数据比创建它的应用存活得更久.一般来说,数据保存在硬盘上.有时,也会通过网络把数据从一个应用发送给另一个应用. 在硬盘上存储或通过网络发送的数据格式与数据在内存中的格式是不一样的.把内存

Javascript核心读书有感之语句

 这篇文章主要介绍了Javascript核心读书有感之语句,需要的朋友可以参考下     在javascript中,表达式是短语,那么语句(statement)就是整句或命令.正如英文语句以句号结尾,javascript以分号结尾. 表达式计算出一个值,但语句使某件事发生. "使某件事发生"的一个方法是计算带有副作用的表达式.诸如赋值和函数调用这些有副作用的表达式,是可以作为单独的语句的.这种把表达式当做语句的用法也称做表达式语句(expression statement).类似的语句