基于第一篇JS 语言基础的习题

131 阅读3分钟

习题1 阿里古早

引用数据类型面试题

考点: JS 数据存储机制

        let a = {
            n : 1
        };
        let b = a;
        a.x = a = {
            n : 2
        };
        console.log(a.x);
        console.log(b);
        
        // 解析一
        a = b = 3 等同于
        a = 3
        b = 3
        所以 a.x = {n:2} ; a = {n:2}
        //JS 赋值是从右往左,由于.(成员访问)的优先级较高,所以先a.x = {n:2}
        此时 a = {n:1} ,然后再 a = {n:2}
        // 解析二
        a.x = {n:2} 相当于a有一个属性 x,属性值为{n:2}的地址
        然后
        a 与 {n:2}的地址关联 (此时 a 里已经没有 x 属性了)
        

tips: JS 的赋值特点不是拷贝模式,而是关联引用模式

图解

image.png

变形

        let a = {
            n: 1
        };
        let b = a;
        a.x = b ;
        console.log(a.x);
        console.log(b); // { n : 1 , x : {...}} 
        // {...}是x:{n:1, x: {...}的无限嵌套 引起堆的溢出

image.png

变形

基于未变形的结果

a.n = 1000;
输出 b.n   // 1 
    b.x.n // 1000

b.xa 公用一个堆内存 AAAFFF111

image.png

习题2 鹅厂古早

考点: + 运算符与字符串相遇

JS 中的'+' , '-', * , / 进行数学运算

遇到不是数字类型的值,会先 Number()转换为数字再运算

但是 JS 加法有特殊情况, 相加过程中遇到字符串会直接变为字符串拼接

<script>
        var a = 'abc' + 123 + 456;
        var b = '456' - '123';
        var c = 100 + true + 21.2 + null + undefined + 'Tencent' + [] + null + 9 + false;
        console.log(a, b, c);

// 'abc123456'
// 333
// 'NaNTencentnull9false'

</script>

习题3 鹅厂古早

考点:

  1. parseInt/parseFloat 用来检测字符串中的数字

传递的不是字符串,也要先转换为字符串再开始查找

机制:

从字符串左侧第一个字符开始查找,把找到的有效数字字符转换为数字,遇到一个非有效数字,则停止查找!一个有效数字都找不到,结果是 NaN

  1. NaN 与谁都不相等

  2. typeof 返回的是字符串型的数值类型

        let num = parseFloat('width : 100px');
        if (num == 100) {
            alert(1);
        } else if (num == NaN) {
            // NaN 与任何值都不相等
            // NaN !== NaN
            alert(2);
        } else if (typeof num == 'number') {
            // typeof NaN == 'number'
            alert(3);
        } else {
            alert(4)
        }
        // => 3

习题4

        var a = 0;
        var b = a;
        b++;
        alert(a); // => '0'
        var o = {};
        o.a = 0;
        var b = o;
        b.a = 10;
        alert(o.a); // => 10

习题5 能输出 'undefined' 的有哪些?

  • console.log(alert(1)); x

    第一步 alert(1)

    第二步 console.log(undefined);

    解析:

    alert本身是一个函数,执行浏览器内置的 alert 方法,执行方法的时候弹出一个'1'(这个方法的功能)

    此方法没有返回值,所以返回 undefined

  • parseInt(undefined) x

    解析:

    1.Number()按照浏览器底层机制将其他数据类型转换为数字
    
     - 字符串 是否包含非有效数字 ,包含直接是 NaN; '' => 0
    
     - 布尔 true => 1 false => 0
    
     - null => 0
    
     - undefined => NaN
    
     - 引用数据类型都要先转为字符串然后再转为数字
    
          - {}/正则/函数等 => NaN
      
          - [] => '' => 0
      
          - [12] => '12' => 12
      
          - [12,23] => '12,23' => NaN
      
          - ...
     
    
        2. parseInt/parseFloat
    
       遵循按照字符串从左到右查找的机制找到有效数字字符(所以传递的一定是字符串,不是也要转换为字符串然后再查找)
       
       找不到就统统 NaN
       
       parseInt(undefined) =>  parseInt('undefined') => NaN
       
       parseInt('') 因为什么有效字符也没找到 =>  NaN
       
       Number('') => 0 C++ 机制 空字符串就是 0
       
    
       let x = [1,2,3];
       let y = x;
       let z = [4,5,6];
       y[0] = 10; 
       y = z; 
       z[1] = 20;
       x[2] = z = 30;
       console.log(x,y,z);
       
       x [10,2,30]
       y [4,20,6]
       z 30

习题6 循环判断

       for (let i = 0; i < 10; i++) {
           console.log(i);
           break;        
       }
       console.log(i);
       
       输出  0 两次



        for (let i = 0; i < 10; i++) {
           continue ;
           console.log(i);
                 
       }
       console.log(i);
       
       输出一次 10
       

        for (let i = 1; i <= 10; i += 2) {
           if (i <= 5) {
               i++;
               continue;
           } else {
               i -= 2;
               break;
           }
           i--;
           console.log(i);
       }
       console.log(i);
       
       输出一次 5
       

习题7 三元运算符

把下题改写成三元运算符并计算出结果

分清判断与循环

      let a = 2;
      if (a >= 0 && a < + 20) {
          if (a % 2 === 0) {
              a += 2;
          }
      } else {
          a -= 2;
      }
      console.log(a); // => 14

改写: a >= 0 && a < + 20 ? (a % 2 === 0 ?a += 2 : null ):a -= 2

习题8 i++ ++i == 与 ===

考点:

  1. == 和 ===

== 相等 数据类型不同,先转换为一样的再比较

=== 绝对相等,必须类型和值都相同才为 true

  • switch 判断中,每一种 case 值的比较都是基于 === 来完成

  • switch 有特定应用场景 专用于比较值

  1. ++ 是纯粹的数学运算
      let a = '10';
      a == 10 ? a++ : a-- ;
      console.log(a); //=> 11

      let b = '10';
      switch(b){
          case 10:a
              b++ ;
              break;
          default:
              b --;
      }
      console.log(b);//=> 9


习题 9 检验数据类型基础知识

image.png

  1. !! 求布尔值

    布尔值为 false 只有五种类型

    以上不属于那五种类型 所以是 true

  2. 第一项:

    new Date() 获取当前日期对象

    parseInt(new Date()) => NaN

    isNaN(...) => true

    第二项: 1

    true + 1 => 2

    第三项 : 'undefined'

    2 + 'undefined' => '2undefined'

  3. false + true + true + 'boolean' = > '2boolean'

  4. '2.6number'

  5. false

  6. '122'

  7. false

  8. 0

  9. 'string12false'

  10. true + NaN => NaN

  11. 'boolean' + true => 'booleantrue'

习题 10 逻辑思维判断题

题目:

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算年终奖</title>
</head>

<body>
    工龄: <input type="text" value="0" id="workYear">
    <br>
    薪资: <input type="text" value="14000" id="workMoney">
    <br>
    <button id="submit">计算年终奖</button><br>
    你的年终奖是 ¥<span id="valBox"></span>
    <!-- IMPORT JS -->
    <script>
        let workYear = document.getElementById('workYear');
        let workMoney = document.getElementById('workMoney');
        let submit = document.getElementById('submit');
        let valBox = document.getElementById('valBox');

        submit.onclick = function () {
            // 1. 获取文本框中的信息 
            // 文本框.value 获取输入的内容,格式是字符串
            let year = Number(workYear.value);
            let money = Number(workMoney.value);
            // 条件判断
            if (isNaN(year) || isNaN(money)) {
                alert('输入的内容是非法格式');
                return;
            }
            // 2. 经过逻辑处理,计算结果
            let result = null;
            if (year < 1) {
                result = money >= 8000 ? money * 1.2 : money;
            } else if (year >= 1 && year < 2) {
                result = money >= 10000 ? money * 1.7 : money * 1.5;
            } else {
                result = money >= 12000 ? money * 3.2 : money * 3;
            }
            // 3.把结果复制给#valBox即可
            valBox.innerHTML = result;
        }
    </script>
</body>

</html>