javascript高级程序设计(第3章)

第三章:基本概念

本章内容:

  • 语法
  • 数据类型
  • 流程控制语句
  • 函数

3.1 语法

3.1.1 区别大小写

ECMAScript的一切都区分大小写。

3.1.2 标识符

所谓标识符,就是指变量、函数、属性的名字。标识符可以按照以下规则组合起来的一个或者多个字符:

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

即:数字不能开头。

3.1.3 注释

// 单行注释

/*
 * 这是一个多行注释
 */

3.1.4 严格模式

严格模式是为javascript定义了一种不同的解析和执行模式。在严格模式下ECMAScript3中有一些不确定的行文将得到处理,而且对某些不安全的操作也会抛出错误。在整个代码中启用严格模式,可以顶部添加如下代码:

use strict

3.2 关键字和保留字

ECMAScript把一些标识符拿出来用作自己的关键字啊。因此不能再程序中把这些关键字作为标识符:

关键字

break do instanceof typeof
clase else new var
contiune for switch while
debugger* function this with
default if throw
delete in try

保留字:

class enum extends super
const export import
implements package public
interface private static
let protected yield

3.4 数据类型

ECMAScript中有5种基本数据类型:Undefined、Null、Boolean、Number和String。

还有一种复杂数据类型Object。Object的本质是由一组无序的名值对组成的。

3.4.1 typeof操作符

由于ECMAScript变量是松散类型的,因此需要一种手段来判断变量的数据类型--typeof

  • undefined -- 如果这个值未定义;
  • boolean -- 如果这个值是布尔值;
  • string -- 如果这个值是字符串;
  • number -- 如果这个值是数字;
  • object -- 如果这个值是对象或null;
  • function -- 如果这个值是函数;
var message = 'some thing';
alert(typeof message); // string
alert(typeof 95); //number
alert(typeof null); //object

因为特殊值null被认为是一种空的对象引用,所以typeof null 会返回object。

typeof运算符并不能正确判断出所有的类型。但对于基本数据类型,typeof具有神奇的功效。

3.4.2 Undifined类型

Undefined类型只是一个值,即特殊的undefined。在使用var声明的变量但没有初始化。那么这个变量的值就是undefined。undefined是定义的全局变量(它和null不一样,它不是关键字),它的值就是“尾的定义。

var message;
// 下面的变量没有声明
// var age;
alert(message == undefined);  // true
alert(typeof age); //undefined

3.4.3 Null类型

Null类型是第二个只有一个值的数据类型,这个特殊值是null。从逻辑角度看,null值表示一个空对象指针,而这也是typeof操作符检测null值得时候回返回‘object’的原因。

var car = null;
alert(typeof car); // object

如果定义的变量用来保存对象,那么最好将变量初始化为null。

尽管null和undefined是不同的,但他们都表示“值得空缺”,两者往往可以互换。判断相等运算符==认为两者是相等的;

alert(null == undefined) // true

3.4.4 Boolean类型

Boolean指代真或假、开或关、是或否。这个类型只有两个值,true和false。

ECMAScript中所有类型的值都有与这两个Boolean值等价的值。

数据类型 转换为true的值 转换为false的值
Boolean true false
String 非空字符串 “”(空字符串)
Number 任何非零数字 0
Object 任何对象 null
Undefined n/a(not applicable不适用) undefined

3.4.5 Number类型

Number类型采用了IEEE754格式来表示整数和浮点数

var intNumber = 55; //整数
var floatNumber = 0.1; //浮点数

注意:

因为采用了IEEE754表示法,这是一种二进制表示法,可以精确到分数比如1/2、8/1、1/1024。但遗憾的是,我们常用的分数都是十进制分数1/10、1/100等。二进制的浮点数不能精确表示类似0.1这种简单数字。

var x = 0.3 - 0.2;  //0.09999999999999998
var y = 0.2 - 0.1; // 0.1
alert(x == y); // false 

ECMAScript并非独此一家,其他使用这种数值规格的语言也存在这种问题。

解决方案:
1.类库

math.js、decimal.js、big.js

2.浮点运算

toFixed() 方法使用定点表示法来格式化一个数,会对结果进行四舍五入。语法为:

numObj.toFixed(digits); // digits表示小数点后数字的个数;介于 0 到 20 (包括)之间
NaN

NaN,即非数值(Not a Number)是一个特殊的值,这个数值用于表示一个本来要返回一个数值得操作数未返回数值的情况(这样就不会抛出错误)。

NaN本身有两个非同寻常的特点。首先,任何涉及与NaN的操作(NaN/10)都会返回NaN。其次,NaN与任何值都不相等,包括它本身。

alert(NaN == Nan); // false

3.4.6 String类型

String类型是由零或者多个16位Unicode字符串组成的字符序列,即字符串。

ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就无法改变。要改变某个字符串的值,就要先销毁原来的字符串。然后再用另一个包含新值得字符串来填充它。

3.4.7 Object类型

ECMAScript中的对象其实就是一组数据与功能的集合。

var o = new Object();

Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法都存在更具体的对象中:

  • constructor: 保存着创建当前对象的函数。对于前面的例子,构造函数(constructor)就是Object();
  • hasOwnProperty(peopertyName): 用于检测给定的属性在当前的对象实例中(而不是实例的原型上)是否存在。
  • isPrototyOf(object): 用于检测传入的对象是否是当前对象的原型。

3.7 函数

函数可以封装多条语句,而且可以在任何地方调用执行。

3.7.1 理解函数参数

ECMAScript中的参数在内部是用一个数组表示的。函数接受到的始终是这个数组,而不关心数组中包含哪些参数。实际上,在函数体里可以通过arguments对象来访问这个参数数组,从而获取传递函数中的每一个参数。

function sayHi(){
    console.log('hello :'+arguments[0]+', '+arguments[1]+','+arguments[2]);
}
sayHi('world','123'); // hello :world, 123,undefined

ECMAScript的一个重要特点:命名的参数只是提供便利,但不是必须的。

3.7.2 没有重载

不像其他语言(像Java),可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。 因为ECMAScript没有签名,所以不能做到真正的重载。

function add(num1, num2){
    return num1 + num2;
}
function add(num){
    return num + 100;
}

add(200,200); //300

没有重载,后面定义覆盖前面。

小结:

javascript的核心语言特征在ECMA-262中是以名为ECMAScript的伪语言的形式来定义的。ECMAScript中包含了所有的基本语法、操作符、数据类型以及完成基本的计算任务所需要的对象。以下总结了ECMAScript中的基本要素

  • ECMAScript中的基本数据类型有:Undefined、Null、Boolean、Number和String;
  • 与其他语言不同,ECMAScript没有整数和浮点数值分别定义不同的数据类型,Number类型可用于表示所有数值;
  • ECMAScript中有一种复杂的数据类型,即Object类型,该类型是这门语言所有对象的基础;
  • 严格模式为这门语言中容易出错的地方增加了限制;
  • ECMAScript提供了很多C以及类C语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符以及赋值操作符。
  • ECMAScript从其他语言中借鉴了很多流程控制语句,例如if、for、switch等。
  • ECMAScript的函数与其他语言有诸多不同之处:
    • 无需指定函数的返回值,因为任何ECMAScript函数在任何时候都可以返回任何值;
    • 实际上,未返回值得函数会返回undefined;
    • 没有函数签名的概念,因为函数是以一个包含零个或多个的数组传递的;
    • 可以向ECMAScript函数传递任意参数,以arguments对象来访问这些参数;
    • 由于不存在函数签名的概念,所以函数无法重载;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容