《JavaScript高级程序设计(第三版)》-3
相等操作符
- 相等和不相等
在转换不同的数据类型时,相等和不想等操作符遵循下面基本规则:
- 如果有一个操作符数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
- 如果一个操作数是字符串,而另一个操作数是数值,在比较相等性之前先将字符串转化为数值;
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较。
这两个操作符在进行比较时则要遵循下列规则:- null和undefined是相等的。
- 要比较相等性之前,不能将null和undefined转换成其他任何只。
- 如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN.
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。
- 全等和不全等
全等操作符由3个等于好(===)表示,它只在两个操作数未经转换就相等的情况下返回true,如下:
var result1 =("55"==55);// true,因为转换后相等
var result2 =("55"===55);// false,因为不同数据类型不相等
语句
- for-in语句
for-in语句是一种精准的迭代语句,可以用来枚举对象的属性。for-in语句的语法:
for (property in expression) statement
ECMAScript对象的属性没有顺序,因此,通过for-in循环输出的属性名的顺序是不可预测的,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。 - with语句
with语句的作用是将代码的作用域设置到一个特定的对象中。with语句的语法:
with (expression) statement;
定义with语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
上面几行代码都包含location对象。如果使用with语句,可以把上面的代码改写成如下形式:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
这意味着在with语句的代码库内部,每个变量首先被认为是一个局部变量,而如果在局部变量中找不到该变量的定义,就会查询location对象是否由同名的属性,如果发现了同名属性,则以location对象属性的值作为变量的值。
严格模式下不允许使用with语句,否则将视为语法错误。
有序大量使用with语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用with语句。
函数
ECMAScript中的函数在定义时不必指定是否返回值。函数在任何时候都可以通过return语句后跟要反悔的值来实现返回值。位于return语句之后的任何代码都永远不会执行,例如:
function sum(num1,num2){
return num1 + num2;
alert("Hello world");// 永远不会执行
}
一个函数也可以包含多个return语句,例如:
function diff(num1,num2){
if(num1 < num2){
return num2 - num1;
}else{
return num1 - num2;
}
}
这个函数用于计算两个数值的差。
另外,return语句也可以不带有任何的返回值。这种情况下,函数在停止执行后返回undefined值。这种做法一般用在需要提前停止函数执行而不需要返回值的情况下。
function sayHi(name,message){
return;
alert("Hello "+ name +","+ message);// 永远不会执行
}
推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。
严格模式对函数的一些限制:
- 不能把函数命名为eval或arguments;
- 不能把参数命名为eval或arguments;
不能出现两个命名参数同名的情况。
如果发生以上情况,就会导致语法错误。
理解参数:
ECMAScript函数不介意传递来多少个参数,也不在乎传进来参数是什么数据类型。原因是ECMAScript中的参数在内部使用一个数组表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话。),实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
arguments对象只是与数组类似(它并不是Array的实例),因为可以使用方括号方位它的每一个元素,使用length属性来确定传递进来多少个参数。
前面的例子中,sayHi()函数的第一个参数名字叫name,而该参数的值也可以通过访问argument[0]来获取。因此,函数可以被改写为:
function sayHi(){
alert("Hello "+ arguments[0]+","+ arguments[1]);
}
这个事例反映了ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。
通过访问arguments对象的length属性可以获知有多少个参数传递给了函数,可以利用这点让函数能够接收人一个参数并分别实现适当的功能。
function doAdd(){
if(arguments.length ==1){
alert(arguments[0]+10);
}elseif(arguments.length ==2)
{
alert(arguments[0]+ arguments[1]);
}
}
doAdd(10);// 20
doAdd(30,20);// 50
arguments对象可以与命名参数一起用,如:
function doAdd(num1,num2){
if(arguments.length ==1){
alert(num1 +10);
}elseif(arguments.length ==2)
{
alert(arguments[0]+ num2);
}
}
arguments的值永远与对应命名参数的值保持同步,例如:
function doAdd(num1,num2){
arguments[1]=10;
alert(arguments[0]+ num2);
}
每次执行doAdd()函数都会重写第二个参数,将其改为10.但这种影响是单向的,修改命名参数不会改变arguments中对应的值。如果只传入一个参数,那么为arguments[1]设置的值不会反映到命名参数。
没有传递值的命名参数将自动被赋予undefined值。例如,如果只给doAdd()函数传递了一个参数,则num2中就会自动保存undefined值。
严格模式下,不能像前面例子哪样赋值,会无效,就是说,即使将arguments[1]设置为10,num2的值仍然还是undefined。重写arguments的值会导致语法错误(代码将不会执行)。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
- ECMAScript函数没有重载
如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
function addSomeNumber(num){
return num +100;
}
function addSomeNumber(num){
return num +200;
}
var result = addSomeNumber(100);// 300
如前所述,通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。
ECMAScript中的函数与其他语言中的函数有诸多不同之处:
- 无须指定函数的返回值,因为任何ECMAScript函数都可以在任何时候返回任何值。
- 实际上,未指定返回值的函数返回的是一个特殊的undefined值。
- ECMAScript中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的。
- 可以想ECMAScript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数。
- 由于不存在函数签名的特性,ECMAScript函数不能重载。
《JavaScript高级程序设计(第三版)》-3的更多相关文章
- 百度实习生,以修仙者的角度聊聊怎么学MySQL,不来看看你的修为如何吗?
目录 因为我个人比较喜欢看修仙类的小说,所以本文的主体部分借用修仙者的修为等级,将学习旅程划分成:练气.筑基.结丹.元婴.化神.飞升六个段位,你可以看下你大概在哪个段位上哦! 本文目录: 我为什么要写 ...
- 自导自演的面试现场,趣学MySQL的10种文件
导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"自导自演的数据库面试现场--谈谈MySQL的10种文件" 换一种写作风格 ...
- DF学Mysql(二)——数据表的基本操作
1.创建数据表 先使用“USE <数据库名>”指定在哪个数据库中操作 CREATE TABLE <表名> ( 字段1 数据类型 [列级别约束条件] [默认值], 字段2 数据类 ...
- 从零开始学MySQL(二)
鉴于上节篇幅以安装为主,因此对于调用mysql所需要使用的“命令”只是略微提及.随之而来就会带给读者诸多不解了,因为你会思考,这串长长的字符到底有什么特殊的含义呢?聪明的你可能早就抱着好奇心去“摆渡” ...
- 从零开始学MySQL(四)
上节连接:https://www.cnblogs.com/RajXie/p/10880809.html 上节说到,在创建表的同时,需要给出列的定义.列的定义可展开如下: 列名 列的数据类型 列的一些其 ...
- Java必学MySQL数据库应用场景
Java教程分享Java必学之MySQL数据库应用场景,在当前的后台开发中,MySQL应用非常普遍,企业在选拔Java人才时也会考察求职者诸如性能优化.高可用性.备份.集群.负载均衡.读写分离等问题. ...
- DF学Mysql(三)——Mysql数据类型
Mysql数据类型分为:整数类型.浮点数类型.定点数类型日期与时间类型字符串类型二进制类型 整数类型 字节数 无符号数取值范围 有符号数取值范围TINYINT 1 0-255 -128-127SMAL ...
- DF学Mysql(三)——索引操作
概要: 数据库对象索引其实与书的目录非常相似,主要是为了提高从表中检索数据的速度. 由于数据存储在数据库表中,所以索引是创建在数据库表对象上的,由表中的一个字段或多个字段生成的键组成,这些键存储在数据 ...
- 这半年时间学Mysql的总结
一条sql语句的执行流程 select * from t where id=1 1.mysql执行一条查询语句的流程 1.1客户端输入用户名密码连接mysql服务器 1.2查询这条sql语句有没有对应 ...
- 《一起学mysql》4
索引的使用 索引太少返回结果很慢,但是索引太多,又会占用空间.每次插入新记录时,索引都会针对变化重新排序 什么时候使用索引 1.where 从句中用到的字段 select * from tb ...
随机推荐
- Unity初级案例——贪吃蛇
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- Struts2(一.基本介绍,环境搭建及需求分析)
Struts2框架开发 前言 开发工具:eclipse struts1:老项目使用较多,维护时需要用到 struts2:新项目使用较多 一.特点 1. 无侵入式设计 struts2 与 struts ...
- Linux建立互信关系(ssh公钥登录)
Linux有多种登录方式,比如telnet.ssh.支持ssh登录方式:口令登录和公钥登录 ssh登录方式:ssh [-l login_name] [-p port] [user@]hostname ...
- oracle查询数据库所有用户信息
看到网上说的查询用户的语句: SELECT * FROM dba_users;这句好像只能系统管理员才能成功执行,普通用户无法执行 SELECT count(*) FROM all_users; , ...
- 苹果任命奢侈品牌博柏利CEO为零售与在线商店高级副总裁
苹果今天宣布任命英国奢侈品牌博柏利(Burberry)CEO安吉拉•阿伦茨(Angela Ahrendts)为零售与在线商店高级副总裁.这是一个新设的职位,未来她将直接向CEO蒂姆•库克(Tim Co ...
- Weighted Median
For n elements x1, x2, ..., xn with positive integer weights w1, w2, ..., wn. The weighted median is ...
- “我爱淘”第二冲刺阶段Scrum站立会议6
完成任务: 完成学院分类的点击查看书籍功能,可以点击书的条目查看书的详细信息. 计划任务: 将书的详细信息进行完善,并且可以点击收藏以及已预订等功能. 遇到问题: 分类功能,根据不同学院,自动将数据库 ...
- CS小分队第二阶段冲刺站立会议(5月27日)
昨天成果:昨日有些小意外,导致没有按照原定计划工作.昨天为扫雷游戏增加了新的失败特效,只要玩家点到地雷,所有的地雷都会依次出现两帧的爆炸效果,并伴随声音. 今日计划:排除一些现有程序的bug.. 遇到 ...
- Linux 安装php扩展 swoole
swoole是一个PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncT ...
- OOP 1.4 内联函数和重载函数函数参数缺省值
1.内联函数 存在的背景:函数调用存在开销(调用时候参数压栈,返回地址压栈:返回时从栈取出返回地址,跳转到返回地址.总共需要几条指令的开销).如果函数指令较少,调用多次,函数调用的开销占比大. 内联函 ...