• 《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. }elseif(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. }elseif(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函数不能重载。





  • 相关阅读:
    codeforces #330 div2
    codeforces #332 div2
    Codeforces Round #331 (Div. 2)C. Wilbur and Points
    poj 01背包
    zoj 1200 Mining
    nginx反向代理与负载均衡
    springcloud----config分布式配置中心
    springcloud--zuul 网关
    springcloud ----Hystrix熔断器
    docker私有镜像仓库harbor搭建和配置
  • 原文地址:https://www.cnblogs.com/echovic/p/1cf06e50c5f40a5ea557fb472976d56c.html
Copyright © 2020-2023  润新知