数据类型

ECMAScript中有5种简单数据类型(也称为基本数据类型):undefined,null,boolean,number和string

typeof

typeof null会返回“object”。因为特殊值null被认为是一个空的对象引用。

undefined

undefined类型只有一个值,即特殊的undefined。在使用var声明变量,但没有对变量进行初始化时,这个变量的值就是undefined。

对未初始化的变量执行typeof操作符会返回undefined,而对未声明的变量执行typeof操作符同样也会返回undefined。

var message;

alert(typeof message); // undefined
alert(typeof age); // undefined

null

null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度上看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值会返回“object”的原因。

alert(null==undefined); // true

这里,位于null和undefined之间的相等操作符(==)总是返回true。

尽管null和undefined有这样的关系,但它们的用途完全不同。如前所述,无论在什么情况下都没有必要把一个变量显式地设置为undefined,可是同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。

Boolean类型

该类型只有两个字面值:true和false。这2个值跟数字值不是同一回事,因为true不一定等于1,false不一定等于0。该类型的2个值是区分大小写的。
虽然Boolean类型只有两个字面值,但ECMAScript所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。

var message="hello world!";
var messageAsBoolean=Boolean(message);
console.log(messageAsBoolean);// true

Number类型

浮点数值

浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远不如整数。例如,0.1加0.2的结果不是0.3,而是0.300000000000000004,这个小小的舍入误差会导致无法测试特定的浮点数值。

var a=0.2,b=0.1;
if(a+b==0.3){
console.log("you got 0.3.");
}

我们测试这两个数的和不等于3,如果这2个数是0.25和0.05,或者是0.15和0.15,结果都是没有问题的。如果是0.1和0.2,那么测试无法通过。因此,永远不要测试某个特定的浮点数值。

NaN

NaN的两个特点,一是任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。

isNaN()函数接收一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”,isNaN()在接收这个值后,会尝试将这个值转换为数值。而任何不能被转换为数值的值都会导致这个函数返回true.

alert(NaN==NaN); // false
alert(isNaN(isNaN)); // true
alert(isNaN(10)); // false
alert(isNaN("10")); // false
alert(isNaN("blue")); // true
alert(isNaN(true)); // false

数值转换

Number(), parseInt(),parseFloat()

Number()函数的转换规则如下:

  • 1.如果boolean值,true和false将分别被转换为1和0
  • 2.如果是数字值,只是简单的传入和返回
  • 3.如果是null值,返回0
  • 4.如果是undefined,返回NaN

操作符

一元操作符

递增和递减操作符

执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称为副效应)

var age = 29;
var anotherAge = --age +2; alert(age); //
alert(anotherAge); //

由于前置递增和递减操作与执行语句的优先级相等,因此整个语句会从左至右被求值。

var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; // 等于21
var num4 = num1 + num2; // 等于21

后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含他们的语句被求值之后才执行的。

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于22
var num4 = num1 + num2; // 等于21

一元加和减操作符

在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。换句话说,布尔值false和true将被转换为0和1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()和toString()方法,再转换得到的值。

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf : function(){
return -1;
}
} s1 = +s1; //
s2 = +s2; // 1.1
s3 = +s3; // NaN
b = +b; //
f = +f; // 1.1
o = +o; // -1

一元减操作符只要用于表示负数,例如将1转换成-1。

一元加和减操作符只要用于基本的算术运算,也可以像前面的示例所展示的一样用于转换数据类型。

加性操作符

加法

var result1 = 5+5;
alert(result1); // var result2 = 5+"5";
alert(result2); // "55"

减法

var result1 = 5 - true; //
var result2 = NaN -1; // NaN
var result3 = 5-3; //
var result4 = 5 - ""; //
var result5 = 5 - "2"; //
var result6 = 5 - null; //

相等操作符

null == undefined; // true
"NaN" == NaN; // false
5 == NaN; // false
NaN == NaN; // false
NaN != NaN; // true
false ==0; // true
true == 1; // true
true == 2; // false
undefined ==0; false
null ==0; false
"5"==5; // true

记住:null == undefined会返回true,因为它们是类似的值;但null===undefined会返回false,因为它们是不同类型的值。

语句

ECMA-262规定了语句(也称为流控制语句),有if语句、do-while语句、while语句、for语句、for-in语句、label语句、break和continue语句、with语句、switch语句。

label语句

JavaScript语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。

label:
statement

标签可以是任意的标识符,但是不能是保留字,语句部分可以是任意语句。

标签通常与break语句和continue语句配合使用,跳出特定的循环。

top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0

上面代码为一个双重循环区块,break命令后面加上了top标签(注意,top不用加引号),满足条件时,直接跳出双层循环。如果break语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。

continue语句也可以与标签配合使用。

top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) continue top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2

上面代码中,continue命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮外层循环。如果continue语句后面不使用标签,则只能进入下一轮的内层循环。

说明:

break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。

break语句用于跳出代码块或循环。

continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。

width语句

width语句的作用是将代码的作用域设置到一个特定的对象中,如下例子:

var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
console.log(qs); // 空
console.log(hostName); //127.0.0.1
console.log(url); //http://127.0.0.1:8848/test02/index.html

上面几行代码都包含location对象,那么用width如下:

with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
console.log(qs); // 空
console.log(hostName); //127.0.0.1
console.log(url); //http://127.0.0.1:8848/test02/index.html
}

函数

function sum(num1, num2){
return num1 + num2;
alert("Hello world"); // 永远不会放弃
}

这个函数会在执行完return 语句之后停止并立即退出。因此,位于return 语句之后的任何代码都不会执行。

《JavaScript高级程序设计》笔记:基本概念(三)的更多相关文章

  1. 《JavaScript高级程序设计》 -- 基本概念(一)

    之前看过好几遍<JavaScript高级程序设计>这一书,但是始终没有完完整整的看过一遍.从现在开始我会把它完整的啃一遍,每章节都记录笔记,自己的心得,加油! 由于前三章的内容比较简单,因 ...

  2. JavaScript高级程序设计笔记之面向对象

    说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...

  3. javascript高级程序设计--笔记01

    概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型( ...

  4. JavaScript高级程序设计笔记(一)

    ---恢复内容开始--- 前三章为基础知识,为了方便以后查看,所以比较啰嗦.这里对函数的基本操作没有记录. 1.JavaScript的实现 虽然 JavaScript 和 ECMAScript 通常都 ...

  5. JavaScript高级程序设计笔记 事件冒泡和事件捕获

    1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> & ...

  6. 读javascript高级程序设计01-基本概念、数据类型、函数

    一. javascript构成 1.javascript实现由三部分组成: ECMAScript:核心语言功能 DOM:文档对象模型,提供访问和操作网页内容的方法和接口 BOM:浏览器对象模型,提供与 ...

  7. JavaScript 高级程序设计 01-基本概念

    一.JavaScript组成 1.一个完成JavaScript是由ECMAScript.DOM.BOM三部分组成的. ECMAScript:提供核心语言功能--语法.类型.语句.关键字.保留字.操作符 ...

  8. javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记

    1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获 ...

  9. JavaScript高级程序设计--对象创建的三种方法

    创建对象的三种方法: 1.工厂模式 工厂模式是软件工程领域广为人知的设计模式,这种模式抽象了创建具体对象的过程.下面是使用工厂函数创建对象的的一个例子. 2.构造函数: 从上面的例子中,我们看到构造函 ...

  10. Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)

    var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...

随机推荐

  1. ActiveMQ 的安装与使用

    消息中间件简介 消息中间件(MOM:Message Orient middleware) 消息中间件有很多的用途和优点: 1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外 ...

  2. less编译工具——koala使用介绍

    1:使用koala编译软件    官网:http://koala-app.com/index-zh.html (目前官网点击下载没有反应,有人说可能是网络问题,但真正的原因是需要FQ才能下载了) 百度 ...

  3. pycharm删除project

    1 在pycharm里面选择关闭project 2 返回到这个页面,然后点×让project不在project列表显示(最好记住project的位置) 3 到源文件夹删除这个project文件夹 大功 ...

  4. Ubuntu释放磁盘空间的几种常用方法

    一 安装stacer,使用它来清空系统内存 其实 Stacer 的安装步非常简单,只需到 Github 的发布页面下载到 .deb 包,再用 GDebi 或如下命令安装即可: wget https:/ ...

  5. Ubuntu下安装和使用开源的tts软件Flite

    Flite是什么? Flite是一个小型.快速的TTS系统,是festival的C版本,可用于嵌入式系统,支持WinCE.Palm OS 等. 下载方法: wget http://www.festvo ...

  6. java中调用三方接口post传参时map和jsonobject的区别转换

    post方法名及参数为:(具体方法可参考https://www.cnblogs.com/mufengforward/p/10510337.html) public static String doPo ...

  7. Activity的生命周期函数

    前言: 上一篇文章写了关于Activity生命周期和生命周期状态的介绍,这一篇文章给大家聊聊Activity生命周期函数. 主Activity: 应用程序的入口一般都是桌面应用程序图标,用户点击应用图 ...

  8. Apache-Flink深度解析-概述

    摘要: Apache Flink 的命脉 "命脉" 即生命与血脉,常喻极为重要的事物.系列的首篇,首篇的首段不聊Apache Flink的历史,不聊Apache Flink的架构, ...

  9. Netty源码分析(五):EventLoop

    上一篇主要介绍了一下EventLoopGroup,本篇详细看下它的成员EventLoop. 类结构 NioEventLoop继承自SingleThreadEventLoop,而SingleThread ...

  10. 一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码

    计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别.行人检测等,国内的旷视科技.商汤科技等公司在该领域占据行业领先地位.相对于图像分类任务而言,目标检测会更加复杂一些,不 ...