《JavaScript高级程序设计(第三版)》-3

相等操作符

  • 相等和不相等

    在转换不同的数据类型时,相等和不想等操作符遵循下面基本规则:

  1. 如果有一个操作符数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
  2. 如果一个操作数是字符串,而另一个操作数是数值,在比较相等性之前先将字符串转化为数值;
  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较。

    这两个操作符在进行比较时则要遵循下列规则:

    • null和undefined是相等的。
    • 要比较相等性之前,不能将null和undefined转换成其他任何只。
    • 如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN.
    • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。
  • 全等和不全等

    全等操作符由3个等于好(===)表示,它只在两个操作数未经转换就相等的情况下返回true,如下:

  1. var result1 = ("55" == 55); // true,因为转换后相等
  2. 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语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子:

  1. var qs = location.search.substring(1);
  2. var hostName = location.hostname;
  3. var url = location.href;

上面几行代码都包含location对象。如果使用with语句,可以把上面的代码改写成如下形式:

  1. with(location){
  2. var qs = search.substring(1);
  3. var hostName = hostname;
  4. var url = href;
  5. }

这意味着在with语句的代码库内部,每个变量首先被认为是一个局部变量,而如果在局部变量中找不到该变量的定义,就会查询location对象是否由同名的属性,如果发现了同名属性,则以location对象属性的值作为变量的值。

严格模式下不允许使用with语句,否则将视为语法错误。

有序大量使用with语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用with语句。

函数

ECMAScript中的函数在定义时不必指定是否返回值。函数在任何时候都可以通过return语句后跟要反悔的值来实现返回值。位于return语句之后的任何代码都永远不会执行,例如:

  1. function sum(num1,num2){
  2. return num1 + num2;
  3. alert("Hello world"); // 永远不会执行
  4. }

一个函数也可以包含多个return语句,例如:

  1. function diff(num1,num2){
  2. if (num1 < num2) {
  3. return num2 - num1;
  4. } else {
  5. return num1 - num2;
  6. }
  7. }

这个函数用于计算两个数值的差。

另外,return语句也可以不带有任何的返回值。这种情况下,函数在停止执行后返回undefined值。这种做法一般用在需要提前停止函数执行而不需要返回值的情况下。

  1. function sayHi(name,message) {
  2. return;
  3. alert("Hello " + name + "," + message); // 永远不会执行
  4. }

推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。

严格模式对函数的一些限制:

  1. 不能把函数命名为eval或arguments;
  2. 不能把参数命名为eval或arguments;
  3. 不能出现两个命名参数同名的情况。

    如果发生以上情况,就会导致语法错误。

  • 理解参数:

    ECMAScript函数不介意传递来多少个参数,也不在乎传进来参数是什么数据类型。原因是ECMAScript中的参数在内部使用一个数组表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话。),实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

    arguments对象只是与数组类似(它并不是Array的实例),因为可以使用方括号方位它的每一个元素,使用length属性来确定传递进来多少个参数。

    前面的例子中,sayHi()函数的第一个参数名字叫name,而该参数的值也可以通过访问argument[0]来获取。因此,函数可以被改写为:

  1. function sayHi() {
  2. alert("Hello " + arguments[0] + "," + arguments[1]);
  3. }

这个事例反映了ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。

通过访问arguments对象的length属性可以获知有多少个参数传递给了函数,可以利用这点让函数能够接收人一个参数并分别实现适当的功能。

  1. function doAdd() {
  2. if(arguments.length == 1) {
  3. alert(arguments[0] + 10);
  4. } else if (arguments.length == 2)
  5. {
  6. alert(arguments[0] + arguments[1]);
  7. }
  8. }
  9. doAdd(10); // 20
  10. doAdd(30,20); // 50

arguments对象可以与命名参数一起用,如:

  1. function doAdd(num1,num2) {
  2. if(arguments.length == 1) {
  3. alert(num1 + 10);
  4. } else if (arguments.length == 2)
  5. {
  6. alert(arguments[0] + num2);
  7. }
  8. }

arguments的值永远与对应命名参数的值保持同步,例如:

  1. function doAdd(num1,num2) {
  2. arguments[1] = 10;
  3. alert(arguments[0] + num2);
  4. }

每次执行doAdd()函数都会重写第二个参数,将其改为10.但这种影响是单向的,修改命名参数不会改变arguments中对应的值。如果只传入一个参数,那么为arguments[1]设置的值不会反映到命名参数。

没有传递值的命名参数将自动被赋予undefined值。例如,如果只给doAdd()函数传递了一个参数,则num2中就会自动保存undefined值。

严格模式下,不能像前面例子哪样赋值,会无效,就是说,即使将arguments[1]设置为10,num2的值仍然还是undefined。重写arguments的值会导致语法错误(代码将不会执行)。

ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。

  • ECMAScript函数没有重载

    如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。

  1. function addSomeNumber(num){
  2. return num + 100;
  3. }
  4. function addSomeNumber(num){
  5. return num + 200;
  6. }
  7. var result = addSomeNumber(100); // 300

如前所述,通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。

ECMAScript中的函数与其他语言中的函数有诸多不同之处:

  • 无须指定函数的返回值,因为任何ECMAScript函数都可以在任何时候返回任何值。
  • 实际上,未指定返回值的函数返回的是一个特殊的undefined值。
  • ECMAScript中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的。
  • 可以想ECMAScript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数。
  • 由于不存在函数签名的特性,ECMAScript函数不能重载。

来自为知笔记(Wiz)

时间: 2024-09-27 03:25:05

《JavaScript高级程序设计(第三版)》-3的相关文章

《算法图解》代码实现和改进

<算法图解>代码实现和改进 请随意观看表演 二分查找 数组和链表 递归 递归条件和基线条件 快速排序 散列表 广度优先搜索 狄克斯特拉算法 贪婪算法 二分查找 def bin_search(list,item): low = 0 high = len(list) - 1 while low<=high: mid = (low+high)//2 #得到中间值 guess = list[mid] if guess==item: return mid elif guess>item: h

《算法图解》示例代码的实现

这几天看了<算法图解>,把里面的示例代码都实现了一边,在 github 上找到了一位朋友的仓库,fork 了他的. 里面有我们添加的 Python,Java,C++的实现,欢迎大家 fork!!! 附上网址:https://github.com/lynxux/AlgorithmDiagram 原文地址:https://www.cnblogs.com/linkcode/p/8185994.html

Bellman-Ford算法图解

一.Bellman-Ford算法用到的"材料": 1.一个结果数组dis,这个结果数组记录从源点到其他点的最短距离,如dis[10] 表示(加入开始节点标号为1)开始节点1到10号节点的最短距离. 2.C/C++中定义结构体Edge,表示边,内设变量from.to.cost,分别表示这条边的开始标号.终点标号.边长度 3.为了方便测验设置一个边的数组,C++定义:Edge edges[100]: 二.Bellman-Ford算法图解 如图所示,针对一般情况分析,对一条边来说,我们想更新

《算法图解》经典高清中文PDF+英文PDF+源代码

下载:https://pan.baidu.com/s/1U0uJEtx1YHqw28lYkTZxEA 更多资料分享:https://pan.baidu.com/s/1g4hv05UZ_w92uh9NNNkCaA <算法图解>高清中文PDF,199页,带书签目录,文字可以复制粘贴. <算法图解>高清英文PDF,258页,带书签目录,文字可以复制粘贴. 配套源代码. 图文并茂,以让人容易理解的方式阐释了算法,帮助在日常项目中更好地发挥算法的能量. 如图: 原文地址:https://ww

《算法图解》+ 《我的第一本算法书》+资料PDF学习

<我的第一本算法书>没有枯燥的理论和复杂的公式,而是通过大量的步骤图帮助读者加深对数据结构 原理和算法执行过程的理解,便于学习和记忆. 下载:https://pan.baidu.com/s/1poq0e2siuvR1Re5pEIkBnQ <我的第一本算法书>高清PDF,210页,彩色配图,带书签目录,文字可以复制. <我的第一本算法书>采用大量图片,通过详细的分步讲解,以直观.易懂的方式展现了7个数据结构和 26个基础算法的基本原理.第1章介绍了链表.数组.栈等7个数据

《算法图解》读书感悟

写在前面:我感觉阅读算法书比没有系统地学习算法就开始盲目刷题要好很多 学习了数组.链表.栈.哈希表(散列函数).选择排序.快速排序(分而治之).二分查找.简单查找.递归.递推,觉得能够学到很多东西. 算法书并没有像知乎上说的没有用处,直接刷题就好??(本人为学校acm团队队员,一直为不能ak,有时周赛爆零而伤心) 应该是要先对算法有一个完全的自我认识后才开始刷题叭,这样之后刷的题才有意义,而不是一股脑地水题猛刷. 读到<算法图解>的这里时,是我最有共鸣的: 仅当URL不在缓存中时,你才让服务器

算法入门《数据结构与算法图解》+《我的第一本算法书》+《学习JavaScript数据结构与算法第3版》

最近几年学前端的人会越来越多,再加上前端的范围越来越广,从前端发展为全栈,数据结构和算法的功底要求势必将越来越高. <数据结构与算法图解>电子书及代码是数据结构与算法的入门指南,不局限于某种特定语言,略过复杂的数学公式,用通俗易懂的方式针对编程初学者介绍数据结构与算法的基本概念,培养编程逻辑.主要内容包括:为什么要了解数据结构与算法,大O表示法及其代码优化利用,栈.队列等的合理使用,等等. <算法图解>电子书非常的体贴,看起来也很快,用图来解释算法是非常好的想法,可作为学习数据结构

基于四元数的姿态解算算法图解

下面的两个地址是我存放在百度云网盘的附件,分别是基于四元数的互补滤波法的图解和梯度下降法的图解.笔者采用MindManager思维导图软件对上述两种算法进行详细的解释,非常形象. 希望这种方式能够让大家快速.准确的理解这两种算法的流程. 互补滤波法: http://pan.baidu.com/s/1c0b8qJ2 梯度下降法: http://pan.baidu.com/s/1sjI1l5F

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置.对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置.如此重复,直到没有需要交换的记录为止(仅仅是第一个和第二个交换过为止).整个一趟趟的选出最值的过程,仿佛是那水里的气泡,咕嘟咕嘟的往上翻的过程. 递增冒泡排序过程图解: 一般先比较第一个元素和